0

私はゲームを書き、それを改善してバグを取り除こうとしています。メニューとゲームの状態自体の両方がスレッドに依存していますが、メニューについては、各画面を一度だけ描画するように描画をロックしました. 私の電話はメニューで過熱するので、ゲーム状態でのみスレッドを作成し、メニューをスレッドから独立させたいと思いました。たとえば、タッチで再描画します。

私はそのすべてを行う方法を知っており、非常に簡単ですが、奇妙なバグ、スレッドがオンのときに問題なく動作するビットマップのヌルポインター例外が発生しています。

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 がヌルであり、バグをスローすることがほとんどわかります。そして、タイトル状態に変更する前は、正常に描画されていました(スレッド描画を使用)。

4

1 に答える 1

0

ときどき/頻繁に、onSizeChanged が連続して何度も呼び出されます。最初は w=0 と h=0 の幅と高さです。

最善の方法は

a)幅= 0かどうかを確認するチェックを追加し、そうであれば何もしません(適切な寸法でこれを再度呼び出します。高さ= 0のチェックを追加する必要もありません.wとhのどちらかが0 または >0 になり、ビットマップ作成の呼び出しはエラーなしで実行されます)

b) onSizeChanged の代わりに surfaceview の onSurfaceChanged をオーバーライドし、ビットマップの再計算/作成を行います。

于 2014-03-09T19:48:12.367 に答える