2D游戏,性能改进?

时间:2013-08-26 12:00:06

标签: android bitmap android-canvas

我正在开发的游戏正在进行中,越来越多的元素被添加,但我当然面临新的问题,其中之一就是性能。

目前,我有3个线程,其中两个执行计算,另一个更新画布。这三个线程与CyclicBarrier同步,以便在开始绘制画布时完成所有计算。

我正在使用不同大小的几个位图。在绘图方法中,位图正在旋转(通过使用drawBitmap-matrix组合,缩放/平移/旋转添加到矩阵中,用于“本机”(我猜)管理它)当然是绘制的。我面临的问题是,每当我在屏幕上有太多“移动和旋转”元素时,它就会变得不稳定。

Matrix matrix = new Matrix();
matrix.setTranslate(view.getX(), view.getY());
matrix.preScale((1.0f * view.getWidth() / view.getCurrentBitmap().getWidth()), (1.0f * view.getHeight() / view.getCurrentBitmap().getHeight()));
matrix.postRotate(view.getRotation(), view.getX() + view.getWidth()/2f, view.getY()  + view.getHeight()/2f);
mCanvas.drawBitmap(view.getCurrentBitmap(), matrix, mBasicPaint);

例如,这是根据旋转和位置绘制玩家对象的方式:

private void drawPlayer(final Canvas mCanvas) {
    final Bitmap playerBitmap = mPlayer.getCurrentBitmap();
    mPlayer.nextFrame();
    if(playerBitmap != null) {
        if(mPlayer.getRotation() != 0) {
            Matrix matrix = new Matrix();
            matrix.setTranslate(-mPlayer.getCurrentBitmap().getWidth()/2f, -mPlayer.getCurrentBitmap().getHeight()/2f);
            matrix.postRotate(mPlayer.getRotation());
            matrix.postTranslate(mPlayer.getX() +  + mPlayer.getCurrentBitmap().getWidth()/2f, mPlayer.getY()  + mPlayer.getCurrentBitmap().getHeight()/2f);
            matrix.postScale((1.0f * mPlayer.getWidth() / mPlayer.getCurrentBitmap().getWidth()), (1.0f * mPlayer.getHeight() / mPlayer.getCurrentBitmap().getHeight()), mPlayer.getX(), mPlayer.getY());
            mCanvas.drawBitmap(mPlayer.getCurrentBitmap(), matrix, mBasicPaint);
        } else {
            Matrix matrix = new Matrix();
            matrix.setScale((1.0f * mPlayer.getWidth() / mPlayer.getCurrentBitmap().getWidth()), (1.0f * mPlayer.getHeight() / mPlayer.getCurrentBitmap().getHeight()));
            matrix.postTranslate(mPlayer.getX(), mPlayer.getY());
            mCanvas.drawBitmap(mPlayer.getCurrentBitmap(), matrix, mBasicPaint);
        }
    } else log("bitmap = null!");
}

(这是一种不推荐使用的版本,.getCurrentBitmap()调用在当前版本中减少为一。)

我如何改善表现?我应该创建某种“加载...”屏幕,在其中我预先加载每个位图(最大尺寸)和每个位图的预旋转版本? (这会导致,如果我使用2-4度的步长,每个位图的90-180个版本,这看起来很......很多?)或者,这也是,因为旋转的位图也存储得太多了记忆?我对OpenGL等一无所知,这就是我使用SurfaceView而没有其他游戏引擎的原因,我确信它必须像这样工作 - 不知何故。

1 个答案:

答案 0 :(得分:0)

每次调用Matrix方法时,您都在创建Bitmap(矩阵)和drawPlayer(playerBitmap)对象。据我了解,你会在每一帧都调用这个方法。因此,每个帧,您在创建2个大对象时需要在退出方法时收集垃圾,这会降低帧速率。您只能创建2个对象matrixplayerBitmap作为类级别变量,并在每次调用drawPlayer时刷新它们,从而减少GC调用次数。