0

ボードゲームを作っています。ボードは移動しませんが、ユーザーの操作によっては、ボードの上の部分が移動する場合があります。定期的に更新される可能性のあるUI要素もあります。

今のところ、私が設定するonDraw()方法は、SurfaceViewサブクラスのメソッドを上書きすることです。postInvalidate()whileループで常に呼び出す描画スレッドがあります。

class PanelThread extends Thread
{
        //...
    long sleepTime = 0;
    long nextGameTick = System.currentTimeMillis();

    @Override
    public void run()
    {
        Canvas c;
        while (_run)
        { // When setRunning(false) occurs, _run is
            c = null; // set to false and loop ends, stopping thread
            try
            {
                c = _surfaceHolder.lockCanvas(null);
                synchronized (_surfaceHolder)
                {
                    // Insert methods to modify positions of items in onDraw()
                    _panel.postInvalidate();
                }
            } finally
            {
                if (c != null)
                {
                    _surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
            nextGameTick += MILLISECONDS_PER_FRAME;
        sleepTime = nextGameTick - System.currentTimeMillis();
        if(sleepTime >= 0)
        {
            try
            {
                sleep(sleepTime, 0);
            } catch (InterruptedException e)
            {
                continue;
            }
        }
        else
        {
            //we're behind, oh well.
            System.out.println("behind!");
            nextGameTick = System.currentTimeMillis();
        }
    }
}

これは効率的ではなく、多くのCPUを使用しています。何かが変更されたときにのみAndroidを更新する簡単な方法はありますか?

4

1 に答える 1

2

あなたは正しい考えを持っていますが、それは少し洗練が必要です。

ただし、CPUが処理できる速度でループすること絶対に避けてください。しばらくの間、すべてのループでスレッドをスリープ状態にする必要があります。間違いなく、ミリ秒ごとにループ内のすべてを実行する必要はありません。

このFPS制御のガイドは、ゲームループの設計に非常に役立つことがわかりました。

このAndroid固有のゲームループガイドには、多くの優れたサンプルコードと詳細な説明も含まれています。

于 2012-10-30T03:21:55.010 に答える