1

Node.JS FFI を SDL に更新して、SDL2 を使用しています。( https://github.com/Freezerburn/node-sdl/tree/sdl2 ) そして、これまでのところ順調に進んでおり、1600 以上のカラー テクスチャをあまり問題なくレンダリングできます。しかし、私は理解できないように見える問題に遭遇し始めたばかりで、FFI、GC、Javascriptの速度などとは何の関係もないようです.

問題は、VSYNC を有効にして SDL_RenderPresent を呼び出すと、数秒おきにこの呼び出しが完了するまでに 20 ~ 30 ミリ秒以上かかることです。そして、これは2〜3回続けて起こっているようです。これにより、画面上で動いているものに非常に短いが目立つ視覚的なヒッチが生じます。残りの時間、この呼び出しは、画面と同期する正しい時間に画面に描画されたものを表示するのに通常の時間を要し、すべてが非常にスムーズに見えます。

上記のリポジトリをクローンすると、これが実際に動作していることがわかります。node-gyp でビルドし、test.js を実行するだけです。(テスト コードを StackOverflow に埋め込むことはできますが、完全な例を GitHub に置く方が簡単だと思いました) SDL2、SDL2_ttf、SDL2_image が /Library/Frameworks にある必要があります。(これはまだ開発中であるため、SDL2 を自動的に検出したり、リポジトリに必要なコードを配置したり、どこかからプルしたりなど、特別なことは何もしていません。)

編集: これはおそらく gamedev StackExchange サイトの下にあるはずです。移動/リンクできるかどうかわかりません。

4

1 に答える 1

3

オンラインでさらに調査を行ったところ、「問題」が何であるかを発見しました。これは、(どういうわけか) これまで実際に遭遇したことのないものだったので、SDL を正しく使用していない明らかな問題だと思いました。

結局のところ、グラフィックスが「ジッター」であることは、すべてのゲームが直面する可能性がある/実際に直面している問題であり、それを回避する一般的な方法があります。基本的に、問題は、CPU が OS 内のすべてのプロセス/スレッドを完全に並行して実行できないことです。他の何かを実行するために、プロセスを一時停止する必要がある場合があります。フレームの更新中にこれが発生すると、そのフレームが実際に画面にプッシュされるまでに通常の最大 2 倍の時間がかかる場合があります。これがジッターの原因です。同様のジッターに関する Unity の質問を読んだ後、これが問題であることが最も明白になりました。、コメンターは、OS X でアクティビティ モニターなどを実行すると、数秒ごとに定期的にジッターが発生することを指摘しました。アクティビティ モニターが実行中のすべてのプロセスに情報をポーリングする間隔とほぼ同じです。アクティビティ モニターを強制終了すると、ジッターの規則性が大幅に低下しました。

したがって、コードがドット上で 16 ミリ秒ごとに実行されること、およびコードが再度実行されるまでに常にさらに 16 ミリ秒かかることを保証する実際の方法はありません。完全にスムーズなエクスペリエンスを得るには、イベント、動き、AI などを処理するコードのタイミングを、新しいフレームがレンダリングされるタイミングから分離する必要があります。これは通常、フレームを描画するよりも 1 秒間にすべてのロジックを実行する回数が少なくなり、実際の更新の間にすべてのオブジェクトがどこにあるかを予測し、その場所にオブジェクトを描画することを意味します。これに関するより具体的な詳細については、deWiTTERS ゲーム ループの記事を参照してください。また、一般的なゲーム ループの素晴らしい概要もご覧ください。

スムーズなゲーム体験を提供するこの予測方法には問題がないわけではないことに注意してください。主な問題は、実際に完全な衝突検出を行わずにオブジェクトを予測された位置に表示すると、そのオブジェクトが数フレームの間、他のオブジェクトに非常に簡単にクリップされる可能性があることです。pong クローンでは、予測されたオブジェクトの描画を使用して SDL バインディングをテストするために書いています。許可された。これは別の問題であり、別の方法で対処する必要があります。私は読者にこの問題を知らせているだけです。

于 2014-01-22T21:33:51.217 に答える