4

opengl を使用して作成しているゲームに少し問題があります。ゲームが半分の速度で実行されることもあれば、通常どおり実行されることもあります。

私のコンピューターでは文字通り14,000 fpsで実行されるため、問題の原因はopenglではないと思います。(半分の速度で走っている場合でも)

これにより、問題の原因となっているのは「ゲームタイマー」であると私は信じるようになりました。ゲーム タイマーは別のスレッドで実行され、Sleep(5) 呼び出しで「ループ」の最後で一時停止するようにプログラムされています。Sleep(5) 呼び出しを削除すると、非常に高速に実行され、画面上のスプライトがほとんど見えなくなります。(予測可能な動作)

Render() スレッドの最後に (独自のスレッドでも) Sleep(16) をスローしてみました。このアクションにより、fps が約 62 に制限されます。アプリは、意図した速度で実行されることもあれば、半分の速度で実行されることもあることに注意してください (所有している両方のコンピューターで試しましたが、持続します)。

意図した速度で実行すると、fps は 62 (良い) になり、31 程度 (悪い) になることもあります。実行中にハーフスピードとフルスピードが切り替わることはなく、再起動後も問題は解決しません。

したがって、速度低下の原因はレンダリングではなく、Sleep() 関数です。

私が言っているのは、Sleep() 関数が実際にスリープする時間と矛盾しているということだと思います。これは証明されたものですか?私が使用できるより良い Sleep() 関数はありますか?

4

4 に答える 4

5

定期的なウェイクアップには、待機可能なタイマー(CreateWaitableTimerおよびWaitForSingleObjectまたは友人)がはるかに優れています。

ただし、あなたの場合、おそらく VSYNC を有効にする必要があります。

于 2013-05-30T04:34:12.353 に答える
1

はい、スリープ機能は矛盾しています。マクロ状態の場合に非常に役立ちます。一貫性のある時間が必要な場合は、QueryPerformanceFrequency を使用して CPU の周波数を取得し、QueryPerformanceCount を開始と終了に 2 回使用してから、(end-start) / frequency を使用して一貫性の時間を取得しますが、CPU が複数の場合は注意する必要があります。開始時間と終了時間は同じ CPU コアではない可能性があるため、同じ CPU コアを設定する作業スレッドには SetThreadAffinity を使用してください。

于 2013-05-30T06:26:53.680 に答える
1

スケジュールの優先順位に関するビットに焦点を当てた、Sleep 関数に関する次の説明を参照して ください。

于 2013-05-30T04:32:02.907 に答える