我正在开发的游戏正在进步,添加的元素越来越多,但我当然也面临着新的问题,其中之一就是性能。
目前,我有 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 而没有其他游戏引擎的原因,而且我确信它也必须像这样工作 - 不知何故。