3

現在、レンダリングに OpenTK を使用してゲームを開発しています。C#、.Net 4.0、OpenGL 2。

1280x1024 の解像度で最大化 (全画面表示ではなく、使用可能な画面スペースをすべて使用) して実行すると、平均で約 400 FPS が表示されます。1680x1050 の解像度では、平均で約 315 FPS です。この高いフレームレートにもかかわらず、断続的な吃音を経験しています。

基本的に、約 3 秒間レンダリングが目に見えて途切れますが、その後約 0.5 ~ 1 秒間は完全に滑らかになります。このサイクルは永遠に繰り返されます。

吃音によるフレーム レートの低下は FPS カウンターに表示されません。目的の更新頻度に達するまでフレームをカウントしてフレーム レートを計算しています。次に、1 秒あたりのティック数、更新頻度のティック数、および更新されたフレーム数を使用してフレーム レートを計算しています。数えた。この方法では、更新は 1 秒ごとに 1 回しか表示されませんが、フレームレートが予想よりもはるかに低下するのを見たことはありません。

ゲーム ウィンドウを 2 番目のディスプレイにドラッグすると、問題が大幅に悪化します。

リリース ビルドでアプリケーションを実行しても問題は解決しませんでした。

Redgate の ANTS を使用してアプリケーションのパフォーマンスをプロファイリングしました。これにより、私が修正したいくつかの問題が指摘されました。

ここに何か提案はありますか?

4

1 に答える 1

3

この種の吃音は、通常、ガベージ コレクターによって引き起こされます。

コレクション数を監視し、吃音期間に対応しているかどうかを確認します (パラメーターとして 0、1、および 2 を指定して GC.CollectionCount() を呼び出します)。これが実際に原因である場合は、メモリ割り当てをプロファイリングして削減する必要があります (オブジェクト プールは、存続期間の短いクラスの代わりに構造体と同様に、ここで非常に役立ちます)。

経験則として、通常のゲームプレイ中に第 1 世代または第 2 世代のコレクションは必要ありません。

編集: ソフト フレーム リミッターを無効にし (つまり、Run() または Run(60) を呼び出しますが、Run(60, 60) は呼び出しません)、vsync を有効にします。これは、吃音を減らすのに役立つ場合があります。

さらに、両方のモニターが同じレートで同期されていることを確認してください。ウィンドウをプライマリ モニタからセカンダリ モニタにドラッグすると、わずかな違いでもスタッターが発生します (これは 60Hz と 59.9Hz のわずかな違いで発生することがわかっています)。

于 2010-12-24T23:25:22.183 に答える