0

私は初期化しています

SDL_Init(SDL_INIT_VIDEO);
screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE|SDL_DOUBLEBUF);

そして、ループで、スリープへの呼び出しの間に呼び出します。

SDL_LockSurface(screen);
// Will eventually twiddle pixels here...but not yet
SDL_UnlockSurface(screen);
SDL_Flip(screen);

そして、そのフリップの呼び出しにはさまざまな時間がかかりますが、約10ミリ秒であり、これは無駄です。

そのため、たとえば、ビデオメモリからシステムメモリなどにコピーを作成しているのではないかと思います。別の方法でサーフェスを作成する必要があります。ただし、さらに、に渡すフラグに関係なく、screen->flags常に等しく、他のビットは設定されません。だからとにかく他の種類の表面を作ることはできません。SDL_ASYNCBLITSDL_SetVideoMode

別のオフスクリーンサーフェスを作成し、それにレンダリングしてから、それをスクリーンにブリットする必要がありますか?私は何が間違っているのですか?

編集:SDL_LockとSDL_Unlockのペアを削除しても、処理速度は向上しません。SDL_Flipは遅いです。

4

2 に答える 2

0

いつかこの質問を見るかもしれない2、3人のために、SDL_Flipが非常に長くかかる理由は、vsyncを待機するためだと思います。したがって、SDL_Flipを呼び出すビジーループは必然的にvsyncレートによって制限されます。

それが正しければ、SDL_Flipに非常に時間がかかるという事実は実際の問題ではありません。なぜなら、レンダリングの作業をしていると、vsyncを待つ時間が少なくなるからです。

于 2012-04-30T03:42:23.283 に答える
0

Win7、Codeblocks / MingW、SDL1.2.14を使用しています。Grumdrigは言った:

いつかこの質問を見るかもしれない2、3人のために、SDL_Flipが非常に長くかかる理由は、vsyncを待機するためだと思います。したがって、SDL_Flipを呼び出すビジーループは必然的にvsyncレートによって制限されます。

それが正しければ、SDL_Flipに非常に時間がかかるという事実は実際の問題ではありません。なぜなら、私が物事をレンダリングする作業をしている場合、vsyncを待つ時間が少なくなるからです。

いや、何かがおかしい。私のプログラムは比較的最近までうまく機能していましたが、今日は自分のボトルネックの原因を探していました。それはあなたのようなSDL_Flip()であることが判明し、グーグル検索であなたの質問につながりました。興味深いことに、私の古いWinXPシングルコアではパフォーマンスが向上しているので、問題はフレンドリーなWin7の自動更新が原因であると推測されます。おそらく、Microsoftは意図せずにGDIを最適化解除しています!

いずれにせよ、SDL_Flipはそれ自体を解決するのにそれほど時間はかからないはずです。誰かが疑問に思っている場合は、Uint32 SDL_Getticks()タイマーをSDL_Flip()の上に置き、5ミリ秒を超える場合は以下の長さを出力しました。その結果、27、59、88ミリ秒のような数値が時々発生しましたが、これは良くありません。そしてもちろん、問題は、SetVideoModeのフラグとしてSWSURFACEとHWSURFACEのどちらを使用しても同じです。

SDL Webサイトにコメントを残す前に、SDL 1.2.15で再構築を試みる場合がありますが、SpriGの再構築が必要になる場合があるため、急いでいません。しかし、一般的に、私は私が言ったことを支持します:それがあなたのオペレーティングシステムであるならば、それはWin7のものである可能性があります。

補遺5:17PMEST:SDL 1.2.15を使用する、より小さな、無関係のプロジェクトをコンパイルして実行しましたが、問題は同じでした。通常のスムーズな動きと、時折のジャークです。SDL_Flip()に5ミリ秒以上かかった場合にのみテストすると、出力には30〜60ミリ秒を超える範囲の値が含まれていました。これは、約1秒または2秒に1回発生します。

補遺5-8-12:5-4-12に大きな雷雨があり、コンピューターの電源を切ってプラグを抜く必要がありました。その結果、翌日SDL_Flip()は常に5ミリ秒未満でしたので、問題は解決しました。 。

于 2012-05-03T20:42:49.260 に答える