15

XNA 画像ビューアーを作成しましたが、シーンが変わっていなくても常に再描画され、ネットブックが地獄のように燃えているので、何も変わっていないときに描画を一時停止したいと思います。

フレームレートを 1 に下げることは、クールな状態を保つ 1 つの方法ですが、出力が遅くなります。

入力がないときに再描画を防ぐにはどうすればよいですか?


この問題は解決されましたが、別の問題が見つかりました。ウィンドウにフォーカスがあるときはゲームが多くの CPU を消費しますが、そうでないときは CPU の約 1% しか消費しません。この他の問題を解決する方法の詳細については、この質問を参照してください。

計算に値するものが何も起こっていないときに XNA ゲームの CPU 使用率を減らすにはどうすればよいですか?

4

2 に答える 2

11

これにはGame.SupressDrawメソッドを使用できます。リンクの発言から:

Update 中にこのメソッドを呼び出して、次の Update の呼び出し後まで Draw の呼び出しを防止します。この方法は、更新の結果として表示が変更されない場合に、小型デバイスでバッテリー寿命を節約するために使用できます。たとえば、画面が静的でバックグラウンド アニメーションがない場合、Update 中にプレーヤーの入力を調べて、プレーヤーが何らかのアクションを実行しているかどうかを判断できます。入力が検出されない場合、このメソッドにより、ゲームは次の更新まで描画をスキップできます。

例として、次のコードはDraw関数を 1 回だけ呼び出します。SuppressDrawこれをテストしたところ、呼び出しなしで CPU 使用率が高い (70%) ことに気付きました。を使用するSupressDrawと、CPU 使用率が劇的に低下しました (15% 未満)。数値は異なる場合があります。

public class Game1 : Microsoft.Xna.Framework.Game
{
    ...
    private bool _drawn = false;
    protected override void Update(GameTime gameTime)
    {
        if (_drawn)
            SuppressDraw();
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        /* draw stuff here */
        spriteBatch.End();

        _drawn = true;
    }
    ...
}

1 つの呼び出しSupressDrawのみを抑制することに注意してください。Drawへの呼び出しが増えるのを防ぐにDrawは、継続的に を呼び出す必要がありSupressDrawますUpdate。うまくいけば、それは理にかなっています。

于 2013-05-19T03:41:47.527 に答える
0

受け入れられた答えが言うように、 SuppressDraw を使用して、変更されていないフレームを描画しないようにすることができます。ただし、更新メソッドは関係なく実行されるため、予想よりも多くの CPU を使用します。多くの CPU を使用しないようにするには、最後のフレームから変更されていないことがわかっているものを更新しないようにする必要があります。

いつ描画を抑制するかを知っているのと同じ方法でこれを知っていると思います。そのため、次のように Update メソッドを再配置する必要があります。

private void Update(GameTime gameTime)
{
    var frameHasChanges = DetectChanges(); //This method you need to figure out yourself
    if (!frameHasChanges)
    {
        SuppressDraw();
        base.Update(gameTime);
        return;
    }

    //Do the rest of normal Update

}

最後の注意として; これまでに作成したゲームでこれを使用する必要はありませんでした。これは、パフォーマンスに関する他の根本的な問題がある可能性があることを示唆しています。ただし、各フレームでテキストなどをレンダリングしないようにするために、多くの手法を使用しました (ボックス化/ボックス化解除が発生します)。詳細を知りたい場合は、コメントでこれについて質問してください。

于 2013-05-23T12:59:32.153 に答える