0

私はAndroidでSurfaceViewを試していますが、タッチして「描画」する単純な描画タイプのアプリケーションを作成しようとしています。キャンバスへの描画を処理するためにスレッドを実行していますが、パフォーマンスの問題が発生しています。http://developer.android.com/guide/topics/graphics/index.htmlで、サーフェス全体を再描画する必要があることを読んだので、タッチしたすべてのポイントをフロート配列mPointsに格納して、毎回再描画してみました。問題は、多くのポイントが蓄積されると、それが本当に遅くなることです。そのためのコードは次のとおりです。

    @Override
    public void run() { 

        while(mIsRunning) {
            Canvas c = null;
            try {                   
                c = mSurface.lockCanvas(null);
                synchronized(mSurface) {
                    int size = mPoints.getSize();
                    for(int i = 0; i < size; i += 2) {
                        c.drawCircle(mPoints.get(i), mPoints.get(i + 1), 3, mPaint);                            
                    }   
                }                                   
            }
            finally {
                if (c != null)
                    mSurface.unlockCanvasAndPost(c);
            }       

        }   
    }

ただし、float配列をクリアし、新しいタッチポイントのみを描画するように更新すると、多くのちらつきが発生します。私が知る限り、これはAndroidがダブルバッファリングを使用しているためです。これらの問題を回避する方法がわかりません。

4

2 に答える 2

1

ビットマップに書き込んでから、毎回ビットマップを再描画してみてください。最後の10ポイントなどを記録して、元に戻すなどを許可することができます。

于 2010-12-19T05:39:51.633 に答える
1

アディルの答えに基づいて、これは私が思いついたものであり、うまくいくようです。ポイントの連続線を描画しようとすると、すべてのポイントを完全に取得するわけではないため、さらに最適化する必要がありますが、作業は完了します。

    @Override
    public void run() {
        mDrawing = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);       
        Canvas tempCanvas = new Canvas();
        tempCanvas.setBitmap(mDrawing);

        Canvas c = null;
        while(mIsRunning) {
            int size = mPoints.getSize();
            for(int i = 0; i < size; i += 2) {
                tempCanvas.drawCircle(mPoints.get(i), mPoints.get(i + 1), 3, mPaint);                           
            }    

            mPoints.empty();

            try {                   
                c = mSurface.lockCanvas(null);
                synchronized(mSurface) {
                    c.drawBitmap(mDrawing, 0, 0, mPaint);
                }                                   
            }
            finally {
                if (c != null)
                    mSurface.unlockCanvasAndPost(c);
            }       

        }   
    }
于 2010-12-20T02:24:05.020 に答える