2

OpenGL アプリケーション用のソリッド ゲーム エンジンを作成するのに問題があります。アクションの多い複数のスプライトで構成されるゲームです。

基本的にすべてのスプライトであるオブジェクトを作成しました。「gameEngine」と呼ばれる別のオブジェクトは、1 秒ごと (タイマー) に一連の計算をループし、新しいゲーム変数を生成します。その後、スプライト オブジェクトは描画データを認識します。

問題は、すべての描画データを収集した後、正確なタイミングで描画が行われ、安定したアニメーションが得られることです。現在のシーンの複雑さに応じて、ゲームの計算にかかる時間は不定です。したがって、実際の描画はさまざまな時点で行われます。どうすればそれを防ぐことができますか?

明確にするために、私のアプローチは次のようになります。

// Every something of a second I call tick
-(void)tick
{
  drawingData = gameEngine();
  draw(drawingData); 
}

このようなゲーム エンジンを構築するためのベスト プラクティスがあるに違いありません。

4

4 に答える 4

1

これは実際には OpenGL に関するものではありません。使用しているオペレーティング システムまたはシステム API (つまり、Carbon/Cocoa/Win32) に関係があります。しかし、本当に単純なケースは次のとおりです (疑似コード):

checkTime = currentTime
while not exitCondition
    if currentTime - checkTime >= 50 milliseconds
        checkTime = checkTime + 50 milliseconds
        updateScene
    else drawScene

できるだけ頻繁に描画していますが、更新は 50 ミリ秒ごと (つまり、1 秒あたり 20 回) しか行っていません。他にも考えるべきことがたくさんあることは明らかです。特に、遅れたとき (フレームをスキップするとき) に何をするかという点でそうです。

OpenGL について学ぶのに最適な場所は、Nehe のレッスンです。

http://nehe.gamedev.net/lesson.asp?index=01

少し時代遅れになっていますが、各レッスンの最後にあるサンプル コードは、開始するのに最適な場所であり、多くの言語と多くのオペレーティング システムで利用できます。

于 2009-03-13T01:19:37.807 に答える
0

プラットフォームによって多少異なりますが、通常は機能する基本的なアプローチの 1 つは、レンダリング ループで高性能タイマーを使用し、それを使用してフレーム間のスリープを支援し、安定した安定したフレームレートを維持することです。

フレームのレンダリングの時間を計ってから、安定したフレームレートを維持するためにスリープ状態にすることができます。

ただし、達成したいフレームレートにプラットフォームが追いつかない場合は、ゲーム エンジンを最適化する方法を検討する必要があります。これは、物事を遅くして一貫性を持たせてスムーズにするためだけに機能します - スピードアップするためではありません。

--- 明確化 ----

-(void)tick
{
    time = now() // from high perf. timer
    drawingData = gameEngine();

newTime = now()
// pause for the time required to make the framerate consistent
Sleep(totalTimeForTickToBeStable - newTime + time)
draw(drawingData); 

}

于 2009-03-13T01:04:31.650 に答える