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、指が上がるまで物事が動き回ります。