2

できるだけ多くのフレームが表示されるように、SFML フレームレートの制限を完全に解除しようとしています。この理由は、物理シミュレーションでオブジェクトの位置を計算するコードの 1 つのセクションをループし、おそらく 100 回の反復後に画面を更新したいからです。

私はやった:

window.SetFramerateLimit(0);
window.UseVerticalSync(false);

SFML のドキュメントには、これによりフレーム レートが「無限大」に設定されるはずであると書かれていますが、それでも約 60 程度で止まっていると思います。

これからパフォーマンスを向上させる方法を知っている人はいますか?

また、無制限になったら、SDL から SFML でこれと同等のことができるようにする必要があります。

SDL.Delay(1000);

これを行う方法はありますか?SDL Delay は、他のプロセスのために CPU 時間を解放するので、適切です。

4

3 に答える 3

1

フレームレートの問題についてはわかりません。ドキュメントによると、それはうまくいくでしょう。私が試みることの 1 つは、一度に 1 つのステートメントを削除 (またはコメントアウト) することです。違う。また、フレームレートが無限である可能性もありますが、計算には 60 fps までの計算に十分な時間がかかります。最後に、上記で提案したように、モニターの限界かもしれません。

遅延については、スリープ機能を考えていると思います-現在のスレッドを一定時間一時停止させます。SFML 2 では、これは sf::sleep(sf::Time) であり、時間は、たとえば sf::seconds(float t)、sf::milliseconds などで導出できます。これらは Time を返します。物体。SFML 1.6 では sf::Sleep(float seconds) です。

また、これで直るかどうかはわかりませんが、SFML は Apple 側で何らかの問題があったと思いますので、1.6 以下をお使いだとすれば、バージョン 2 で問題は解決しました。バージョン 2 がリリースされました...まあ、自分でコンパイルする必要はありません。他の問題は修正されたと思います。おそらくこれは以前の問題でした。

于 2012-12-25T18:39:21.890 に答える
-2

フレームレート制限を設定しないか、デフォルトであるゼロに設定することで、sfml ウィンドウは可能な限り高速にフレームを表示する必要があります。残念ながら、問題はドライバーにあるようで、vsync を強制的に有効にしています。これは Macbook Pro であり、HD3000 グラフィックスと Intel ドライバーを搭載しているため、vsync を強制的にオフにする方法がわかりません。

この問題を回避する方法は他にもあります。たとえば、if ステートメントを使用して、ループごとに画面を更新するかどうかを決定します。それは理想的な解決策ではありませんが、私が行ったことです。

SDL の遅延機能に関しては、SFML が機能を提供していsf::Sleep()ます。この関数はsf::Time、ユーザーが遅延するマイクロ秒、ミリ秒、および秒数を設定できるオブジェクトの引数で呼び出されます。

ただし、この関数は、この正確な時間だけ「スリープ」または「遅延」しないことに注意してください。OS は、「少なくとも要求されたスリープ時間の後」に戻ってきます。sf::Sleep()それがどのように機能するか、またはまたはで達成できる「時間分解能」を完全には理解していませんSDL_Delay()

于 2012-12-28T12:26:29.407 に答える