0

今週アンドロイドプログラミングを始めたばかりで、現在ライブ壁紙に取り組んでいます。

背景画像 (720x1280 png) とエンドレス ループで右から左にスライドするスライドバー (2276x290 png) の 2 つの画像があります。私の問題は、フレームあたり1ピクセルで約3〜4fpsでしかスライドできないことです(実際の電話では、AVDでは約1/3fpsになります)。これは、ライブ壁紙を途切れさせる方法です。コードはこれまでのところ正常に動作していますが、遅くなります。

誰かがこれを「はるかに」速くする方法を知っていれば、とてもいいでしょう。

私のコード:

private class WEngine extends Engine {
    private final Handler handler = new Handler();
    private final Runnable drawRunner = new Runnable() {
        @Override
        public void run() {
            draw();
        }

    };
    private Paint paint = new Paint();
    private int width;
    int height;
    private boolean visible = true;
    int x = -1;
    int x2 = 0;
    int y = -1;

    public WEngine() {
        SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(WService.this);
        handler.post(drawRunner);

    }

    @Override
    public void onVisibilityChanged(boolean visible) {
        this.visible = visible;
        if (visible) {
            handler.post(drawRunner);
        } else {
            handler.removeCallbacks(drawRunner);
        }
    }

    @Override
    public void onSurfaceDestroyed(SurfaceHolder holder) {
        super.onSurfaceDestroyed(holder);
        this.visible = false;
        handler.removeCallbacks(drawRunner);
    }

    @Override
    public void onSurfaceChanged(SurfaceHolder holder, int format,
            int width, int height) {
        this.width = width;
        this.height = height;
        super.onSurfaceChanged(holder, format, width, height);
    }

    private void draw() {
        SurfaceHolder holder = getSurfaceHolder();
        Canvas canvas = null;
        Resources res = getResources();
        Bitmap backgroundimg = BitmapFactory.decodeResource(res, R.drawable.background);
        Bitmap slidebarimg = BitmapFactory.decodeResource(res, R.drawable.slidebar);

        try {
            canvas = holder.lockCanvas();
            canvas.drawBitmap(backgroundimg, 0, 0, paint);
            if (canvas != null) {
                if (x<0 && y<0) {
                     x = 0;
                     y = Math.round(height / 2);
                 } else {
                     x -= 1;
                 }

                if (x - width < -height * 1.778125) {
                    x2 -= 1; 
                }

                if (x < -height * 1.778125) {
                    x = x2;
                    x2 = 0;
                }

                canvas.drawBitmap(slidebarimg, x, y, paint);

                if (x2 < 0) {
                    canvas.drawBitmap(slidebarimg, x2, y, paint);
                }
            }
        } finally {
            if (canvas != null)
                holder.unlockCanvasAndPost(canvas);

        }

        handler.removeCallbacks(drawRunner);
        handler.postDelayed(drawRunner, 30);
    }
}

編集:

画像をjpgファイルに変更した後、約6 fpsになりますが、それでも遅くなります。

編集2:

.lockCanvas() を使用している間はハードウェアアクセラレーションが不可能であることがわかりました ハードウェアアクセラレーションを提供するライブ壁紙 (サーフェスビュー) に画像を描画する別の方法はありますか?

4

2 に答える 2

1
private void draw() {
    ...
    Bitmap backgroundimg = BitmapFactory.decodeResource(res, R.drawable.background);
    Bitmap slidebarimg = BitmapFactory.decodeResource(res, R.drawable.slidebar);
    ...

これをしないでください。フレームごとにビットマップをデコードすると、遅くなります。非常に遅い。ハードウェア アクセラレーションを使用しているかどうかは関係ありません。それらを一度デコードし、各フレームに描画するだけです。

于 2013-08-01T19:43:04.053 に答える
0

OpenGl ハードウェア テクスチャ サイズの制限があります。新しいデバイスでは、ほとんどが 2048px です。最大限に維持してみてください。(ハードウェア アクセラレーション アクティビティ - OpenGL テクスチャ サイズ制限を取得する方法は? ) また、アプリでハードウェア アクセラレーションがオンになっていることを確認してください http://developer.android.com/guide/topics/graphics/hardware-accel.html

于 2013-08-01T09:16:39.923 に答える