5

私は現在、非常に洗練された狡猾なゲームを書いています。それはあなたを畏敬の念で満たしてくれるでしょう。ああ、それは15パズルで、SDLに慣れているだけです。

私はウィンドウモードで実行しており、ウィンドウモードではウィンドウ全体のSDL_UpdateRectに自動的にマップされるため、一般的なケースのページ更新としてSDL_Flipを使用しています。最適なアプローチではありませんが、これが15パズルにすぎないことを考えると...

とにかく、タイルの動きはばかげた速度で起こっています。ウィンドウモードのIOW、SDL_Flipには、垂直リトレースとの同期は含まれていません。私はWindowsXPATMで作業していますが、これはSDLの正しい動作であり、他のプラットフォームでも発生すると思います。

SDL_UpdateRectの使用に切り替えても、明らかに何も変わりません。おそらく、自分のコードに遅延ロジックを実装する必要があります。ただし、単純なクロックベースのタイマーを使用すると、ウィンドウが半分描画されたときに更新が発生し、目に見える歪みが発生する可能性があります(技術名を忘れています)。

編集 この問題は「ティアリング」として知られています。

つまり、SDLのウィンドウモードゲームで、ページめくりを垂直リトレースと同期するにはどうすればよいですか?

編集 私は、解決策を探しているときに、ウィンドウ化されたアプリケーションでページめくりを垂直リトレースに同期させることが不可能であるといういくつかの主張を見てきました。Windowsでは、少なくとも、これは単に誤りです。私はこれを行うゲーム(つまり、15パズルと同じレベルのものを意味します)を作成しました。私はかつて、DarkBasicとDarkGDKで遊んで時間を無駄にしました。どちらもDirectXベースであり、ウィンドウモードでの垂直リトレースへのページめくりを同期しています。

4

2 に答える 2

4

主な編集

質問する前にもっと時間をかけて調べるべきだったことがわかりました。SDL FAQ から...

http://sdl.beuc.net/sdl.wiki/FAQ_Double_Buffering_is_Tearing

これは、垂直リトレースとの同期が SDL ウィンドウ モード アプリでサポートされていないことを強く示唆しているようです。

しかし...

Windowsでも基本的なテクニック可能で、ある意味でSDLができると思い始めています。まだ確実ではありません。

Windows では、前に述べたように、Windows モードでページめくりを垂直同期に同期することは、WinG を使用した 16 ビットの時代にまでさかのぼって可能でした。それは正確に間違っているわけではありませんが、誤解を招くものであることがわかりました。WinG を使用していくつかの古いソース コードを掘り起こしたところ、ページ ブリットをトリガーするタイマーがありました。SDL の動作に驚いたのと同じように、WinG はばかげた速度で実行されます。ブリットから画面へのページめくり操作は、垂直リトレースを待ちません。

さらに調査すると、Wing で画面にブリットを実行すると、ブリットは後でキューに入れられ、通話が終了します。ブリットは次の垂直リトレースで実行されるので、テアリングがないことを願っています。そのリトレースの前に画面にさらにブリット (汚れた長方形) を行うと、それらは結合されます。垂直リトレースの前にフルスクリーン ブリットを大量に実行すると、表示されないフレームがレンダリングされます。

この WinG の blit-to-screen は明らかに SDL_UpdateRect に似ています。SDL_UpdateRects は、いくつかのダーティな四角形を手動で結合するための最適化された方法です (おそらく、それらが同じフレームに適用されていることを確認してください)。したがって、(垂直リトレースが可能なプラットフォームでは) WinG と同様に SDL で行われている可能性があります。待機もティアリングもありません。

フレームの更新をトリガーするためにタイマーを使用してテストしましたが、(Windows XP での) 結果は不明です。私の古いラップトップでは非常にわずかで時折テアリングが発生する可能性がありましたが、それは SDL のせいではない可能性があります。「ラスター」がブリットを上回っている可能性があります。これはおそらく、最小限のダーティな四角形で SDL_UpdateRect を直接呼び出す代わりに SDL_Flip を使用した私のせいです。

そのため、私にはまだ確信が持てませんが、ウィンドウ モードの SDL は、ティアリングを許可するプラットフォームと同様にティアリングの影響を受けない可能性があります。私の古いラップトップでさえ、結果は私が想像したほど悪くはないようです.

しかし、誰でも決定的な答えを提供できますか?

于 2010-11-28T04:05:11.927 に答える
0

SDL_gfxのフレームレート コントロールを使用できます。ライブラリのドキュメントを見ると、アプリケーションの流れは次のようになります。

// initialization code
FPSManager *fpsManager;
SDL_initFramerate(fpsManager);
SDL_setFramerate(fpsManager, 60 /* desired FPS */);


// in the render loop
SDL_framerateDelay(fpsManager);

また、ソース コードを参照して、独自のフレームレート コントロールを作成することもできます。

于 2013-01-27T01:50:18.727 に答える