5

オブジェクト指向以外の意味でプログラムを設計する方法を常に見たいと思っていたので、私は現在楽しみのために Haskell を学んでいます。

しかし、Haskell をゲーム エンジンに使用することが有用かどうかについても研究しています。私の主な関心事はGCです。

GHC がコンカレントでスレッド ローカルであることは知っています。

GC は通常 1 ミリ秒から 5 ミリ秒の間一時停止することを読みました。プログラムごとに異なることはわかっていますが、計算するにはいくつかの数値が必要です。

私のゲームがそれで実行されているとしましょう。60fpsつまり、すべてのフレーム0.016666667sで計算が必要ですよね? GC の一時停止により、これが増加し~0.01766666756fps. ~4fpsしたがって、またはのパフォーマンスが低下し7%ます。私にとっては、かなりの大ヒットです。

ゲーム エンジンを高度に並行処理したいので、今はスレッド ローカル GC を頼りにしています。

すべてのエンティティが独自のメモリを持つように、ゲーム コードに Actor モデルを使用したいと考えています。私が正しければ、これはすべてのエンティティが独自のローカル ガベージ コレクションを持っていることを意味します。

しかし、主な問題は依然としてメインループを備えたゲームエンジンです。7% のランダムな fps 低下はかなり大きいです。

私の計算は正しいですか?あなたが私に与えることができる推奨事項はありますか?

4

1 に答える 1

2

あなたの計算は偏っています。

その通りです。60 fps = 0.0166667 秒ごとに 1 フレームです。

(最悪の場合) GC がプログラムを 5 ミリ秒一時停止するとします。GC が実行されるたびに、0.005 を失います。これは、GC が呼び出されるたびに 0.333 fps を失うことを意味します。

正しい計算を行うには、GC が呼び出される頻度を知る必要がありますが、これは私にはわかりませんが、プログラムによって生成されるデータの量に確実に関連しています。

于 2013-08-14T14:40:14.310 に答える