Android でを使用する場合SurfaceView
、特に (SurfaceView
レイアウト XML に を追加して) をレイアウトの一部として設定する場合、パフォーマンスは重要な側面です。
私の場合、View
は数秒に 1 回しか更新されず (ポーカー ゲームのようなトランプが含まれ、いくつかの効果があり、タッチ イベントで移動します)、大きなレイアウトの一部であるSurfaceView
ため、残りの部分が遅くなるという問題が発生します。Activity
つまり、残りの部分が短時間Activity
フリーズし、その後更新されて、短い期間が表示されなくなります。
public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
...
}
その方法では、黒い背景に描画されるonDraw()
がいくつかあります。そのクラス内で、のメソッドBitmap
を継続的に呼び出すスレッドが開始されます。View
onDraw()
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 秒ということもよくあります。
物事をスピードアップする可能性はありますか?のすべての呼び出しでThread
andの呼び出しを放棄しようとしましたが、これも機能しませんでした。invalidate()
onTouchEvent()
SurfaceView
あまり頻繁に更新されないため、パフォーマンスを改善する方法があるに違いないと思います。何も起こらない秒もありますが、ユーザーが に触れるとView
、指が上がるまで物事が動き回ります。