私はゲームを書き、それを改善してバグを取り除こうとしています。メニューとゲームの状態自体の両方がスレッドに依存していますが、メニューについては、各画面を一度だけ描画するように描画をロックしました. 私の電話はメニューで過熱するので、ゲーム状態でのみスレッドを作成し、メニューをスレッドから独立させたいと思いました。たとえば、タッチで再描画します。
私はそのすべてを行う方法を知っており、非常に簡単ですが、奇妙なバグ、スレッドがオンのときに問題なく動作するビットマップのヌルポインター例外が発生しています。
onDraw(Canvas c) 関数があり、各状態 (メニューやゲーム状態など) に何を描画するかをすべて記述しています。
スレッドではこんな感じ(描画部分のみ)
c = null;
c = holder.lockCanvas();
synchronized(holder){
onDraw(c);
}
holder.unlockCanvasAndPost(c);
これで、メニューを描画するために呼び出す簡単なメソッドを作成しました
private void reDraw(){
menuCanvas = null;
menuCanvas = holder.lockCanvas();
synchronized(holder){
onDraw(menuCanvas);}
holder.unlockCanvasAndPost(menuCanvas);
}
onSizeChanged メソッド @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { screenW = w; screenH = h;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
while (bmpBackground==null){
if (screenW>500){
bmploader = BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet,options);
bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
if (bmploader!=null){
bmploader.recycle();
bmploader = null;
}
}
else{
bmploader = BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet_small,options);
bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
if (bmploader!=null){
bmploader.recycle();
bmploader = null;
}
}
}
loadMusic();
loadBitmaps();
loadShip();
changeState(states.TITLE);
reDraw();
super.onSizeChanged(w, h, oldw, oldh);
}
bmpBackground がヌルであり、バグをスローすることがほとんどわかります。そして、タイトル状態に変更する前は、正常に描画されていました(スレッド描画を使用)。