0

Android でを使用する場合SurfaceView、特に (SurfaceViewレイアウト XML に を追加して) をレイアウトの一部として設定する場合、パフォーマンスは重要な側面です。

私の場合、Viewは数秒に 1 回しか更新されず (ポーカー ゲームのようなトランプが含まれ、いくつかの効果があり、タッチ イベントで移動します)、大きなレイアウトの一部であるSurfaceViewため、残りの部分が遅くなるという問題が発生します。Activityつまり、残りの部分が短時間Activityフリーズし、その後更新されて、短い期間が表示されなくなります。

public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
    ...
}

その方法では、黒い背景に描画されるonDraw()がいくつかあります。そのクラス内で、のメソッドBitmapを継続的に呼び出すスレッドが開始されます。ViewonDraw()

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class SurfaceThread extends Thread {

    private SurfaceHolder mSurfaceHolder;
    private MySurface mSurface;
    private boolean mRunning = false;

    public HandThread(SurfaceHolder surfaceHolder, MySurface surface) {
        mSurfaceHolder = surfaceHolder;
        mSurface = surface;
    }

    public SurfaceHolder getSurfaceHolder() {
        return mSurfaceHolder;
    }

    public void setRunning(boolean run) {
        mRunning = run;
    }

    @Override
    public void run() {
        Canvas c;
        while (mRunning) {
            c = null;
            try {
                c = mSurfaceHolder.lockCanvas(null);
                synchronized (mSurfaceHolder) {
                    if (c != null) {
                        mSurface.onDraw(c);
                    }
                }
            }
            finally { // when exception is thrown above we may not leave the surface in an inconsistent state
                if (c != null) {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }

}

Activity残念ながら、これにより時々速度が低下します。0.5 秒ということもよくあります。

物事をスピードアップする可能性はありますか?のすべての呼び出しでThreadandの呼び出しを放棄しようとしましたが、これも機能しませんでした。invalidate()onTouchEvent()

SurfaceViewあまり頻繁に更新されないため、パフォーマンスを改善する方法があるに違いないと思います。何も起こらない秒もありますが、ユーザーが に触れるとView、指が上がるまで物事が動き回ります。

4

1 に答える 1

1

これらの一時停止の実際の原因を分析する必要があります。典型的な実行を追跡し、実際に CPU 時間を消費しているものを確認します。何かが原因で UI がフリーズする可能性があります。別のスレッドに移動する必要がある多くの作業を行っている可能性があります。

また、不要な作業は避けたいと考えています。絶対に確認したいことは、バックグラウンド ループ ( の呼び出しを含むonDraw) で新しいオブジェクトをできるだけ作成しないようにすることです。これにより、しゃっくりの原因にもなるガベージ コレクションが削減されます。また、可能な限り、ここでビットマップをロードすることを避けるか、最小限に抑えてください。

于 2013-01-23T00:54:24.753 に答える