2017-06-20 16 views
0

私はおよそ6msごとに新しいフレームを生成する必要がある3Dアプリケーションを持っています。このフレームレートは、吃音を生じさせないために一定である必要があります。さらに悪いことには、アプリケーションは中程度の重度の計算(主に3Dシーンの準備とVRAMへのデータのコピー)を実行する必要があります。そのため、かなりの量の6msを消費します。Windowsでアプリケーションのタイムスライスを最大化する方法はありますか?

これは、Windowsが他のもののためにCPUを使用しようとすると、アプリケーションがちょっと吃音をするため、問題であった。 Windowsがタイムスライスを他のプロセスに "譲り渡さない"ようにする方法はありますか?私はそれがバックグラウンドプロセスに悪影響を与えるのではないかと心配しています。

+0

私はあなたがこれについてすべて間違っていると思っているとは思いません。 Raymond Chenによるこの記事では、プロセスの優先順位を向上させ、他のすべてのプロセスを損なう危険性をカバーする優れた記事があります。私の取り組みは次のとおりです。フォアグラウンドプロセスは、優先順位をあげています。そして、他のプロセスがタイムスライスを盗んでいる場合は、おそらく盗難が必要で、その影響が懸念されるべきです。これらのプロセスがディスクキャッシュのようなものを管理する可能性があるため、これらのプロセスを枯渇させるとパフォーマンスが低下します。 –

+0

本当に、あなたの問題は、ハードウェアと同じようにソフトウェア分野ではそうではありません。このような仕事にはPentium(以下)を使用しないでください。 i3またはi5には、一貫したCPU時間を与え、アプリケーションのパフォーマンスに必要なバックグラウンド・タスクを完了するのに十分な数のコアがあります。 –

+1

ちょうど興味深い、166 fps? –

答えて

3

Windowsでは、アプリケーションの優先度を上げることができます。プロセスは、通常、同じかそれ以上の優先順位を持つ他のプロセスに対してCPU時間を失うだけなので、優先順位を上げるとCPU時間が「盗まれる」ことを防ぐことができます。

しかし、あまりにも遠すぎるとシステムが不安定になる可能性があるので、これを行う場合は一般的に優先度を少し上げたいだけなので、他の "通常の "アプリケーションに使用できます。

これも大きな違いはありません。小さな問題に遭遇している場合は、優先度を上げてにしてください。もしそれが一定の問題であれば、優先順位を上げるだけではそれを解決するには不十分である可能性があります。

これを試してみる場合は、SetPriorityClassSetThreadPriorityをご覧ください。

+0

私は間違いなく両方に少なくともいくつかの変更を行いましたが、どの部分が何をするのか覚えていません... –

0

通常、お使いのOSで使用されているスケジューリングアルゴリズムによって異なります。 Windows 7,8、XP、VISTAは、ラウンドロビンでマルチレベルキュースケジューリングを使用するので、アプリケーションやスレッドやプロセスの優先順位を上げることで、必要な処理を実行できます。現在使用しているWindowsのバージョンは?...私がそれを知ったらそれに応じて助けることができます

0

あなたはプロセスの優先度を上げることができますが、それはあまり役に立たないと思います。代わりに、コードを最適化する必要があります。

まず、VS内蔵のプロファイラ(デバッグ/パフォーマンスプロファイラメニュー)を使用して、アプリが最も多くの時間を費やす場所を見つけて最適化します。

また、最新のCPUはすべて少なくともデュアルコア(2013年以降のシングルコアCeleron)です。したがって、 "それはかなりの量を消費します~6msそれ自身のものをしている"はそうであってはいけません。独自のものは、別のスレッドで実行する必要があり、レンダリングに使用するスレッドとは別のスレッドで実行する必要があります。 See this articleこれを達成するためのアイデアについては。あなたはおそらくそのの複雑さのレベルを必要としません、ちょうど2つのスレッド+2タスク(計算とレンダリング)で十分ですが、その記事はあなたのアプリを再設計する方法をいくつかのアイデアを与える必要があります。しかし、この手法では、入力レイテンシが1フレーム余分になります(1フレームはバックグラウンドスレッドで計算され、次のフレームではレンダラスレッドでその結果が表示されます)。

関連する問題