
2026/04/25 1:20
現在、SDL はDOSもサポートしています。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
最新の DosBox-X 更新は、Sound Blaster サウンドカードやレガシー DOS 環境において特に顕著なパフォーマンスと安定性の向上をもたらします。主な改善点としては、ミキシングロジックを割り込みハンドラからメインループへ移動させ、DMA バッファ処理を更新することによって、重要なオーディオレイテンシ問題を解消したことです。画質の向上については、複数の画像ページを持つ VBE モードに特化したダブルバッファリングページフラッピングを実装したことに加え、バンク付きフレームバッファへのアクセス処理や完全な VBE ステートの復元を改善した点が挙げられます。具体的な技術的な修正としては、偽の読み込みにより引き起こされた以前の遅延を解消し、起動速度を即座化させるもの、拡張スキャンコードおよび Pause キーに対するキーボードサポートを強化したもの、そしてジョイスティックポーリングレートを約 60 Hz に最適化したものが含まれます。プラットフォーム全体の安定性はさらに強化され、SDL インテグレーション内における DOS システムのための排他的な処理——例えば特定 GTK 機能を DJGPP から除外することや MS-DOS 環境向けの CMake 検出ロジックの追加——によって、クラッシュがなくなり、複雑な回避策なしに様々なレガシー構成で滑らかな動作を確保することが実現されました。
本文
また、30 つのコミットが 2026 年 4 月 13 日 08:50 に追加されました。
- シーク操作を行わないと壊れてしまいます。 fflush() をシーク前に実行するだけでよいでしょうか?
- DosBox-X が Sound Blaster と何かで問題を抱えていたことが分かりました。標準の DosBox は、割り込みハンドラから直接正しく動作し、バッファサイズを 2 倍にすることなく正常です。
- バッファリングを無効にしたままにする方法よりもはるかに高速で、fseek の後に不正な読み取りが発生するという問題も回避できます。test/sample.wav を SDL_LoadWAV で処理する必要も数秒かからず、正しいデータが得られます。
- LoadWAV でこれが引き起こされているのは、シーク/読み取りの間に malloc でデータを確保しており、それが djgpp の転送バッファを変化させているからかもしれません。あるいは Fat DS のトリックで混乱させているのかもしれません。分かりません。デバッグする時間がありませんでした。実際には libc 側の bug でじっさいに djgpp に存在する可能性も十分にあります。
- これは、SDL 1.2 で Mac OS Classic 向けに使った古い手法です。ハードウェア割り込み中に入力のコールバックを呼び出しました。割り込みが発火した際にオーディオがロックされている場合は、それを読み取り記録し、直ちに返却します。ロックが解放された際、もし割り込みが発火していた場合は、その時点でオーディオデバイスの反復処理を実行します。
- SDL3 にはアプリケーション向けの大規模なデバイスロックがありません(少なくとも)。そのため、どの SDL_AudioStream がロックされているのかをカウンタで管理しており、おそらく十分です。
- これは VESA インターフェースを使ってディスプレイを制御し、ソフトウェアレンダラーと互換性を持っています。
- イベントはまだ接続されていないため、各実行時に DosBox を閉じる必要があります(笑)。
- これにはレンダリングのサンプルのほとんどが含まれ、SDL_GetBasePath() を使ってロードするテクスチャを検出しており動作します。
- もちろん Quake 1 はこれをより良く解決していますね、haha。これは賢いです:メモリ使用量は少なく、非常に単純で、割り込みハンドラとの同期についても心配する必要はありません。割り込みが発火するタイミングに関わらず、両側ともに安全だからです。
[sdl-ci-filter djgpp]
[sdl-ci-artifacts]-
: SDL_RunApp() のジェネリック版を無効にするため、DOS 固有のものがコンパイルされている際に SDL_PLATFORM_DOS を除外リストに追加しました。SDL_runapp.c
: DOS で SDL_Gtk_Quit() を除外。DJGPP は unix を定義しており、これにより SDL_PLATFORM_UNIX が設定されますが、DOS には GTK / ディスプレイサーバーがありません。GTK ソースはコンパイルされていないため(DOS では CMake UNIX が false)、リンクエラーが発生していました。SDL.c
: CMAKE_SYSTEM_NAME=DOS からプラットフォームを正しく検出できるように、SDL_DetectCMakePlatform に DOS ケーsdlplatform.cmake