2013-08-26 99 views
0

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

目前,我有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,没有其他游戏引擎,我相信它也必须像这样工作 - 不知何故。

+0

如果您绘制到屏幕外画布,然后只需翻转它们以呈现它,那么该怎么办。将有两个画布(帆布?)需要太多内存为您的应用程序? –

+0

但是这不会使情况变得更糟吗?绘图完成得很好,只是有很多旋转,它正在放慢速度。将它绘制到另一个画布上,然后复制画布只需要更多的CPU时间,不是吗? – damian

回答

0

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

+0

getCurrentBitmap执行以下操作:public Bitmap gettCurrentBitmap(){ return mResourceBitmaps [mFrame]; },在mResourceBitmaps(针对每个ViewObject实例)中,每个帧的位图都在初次初始化对象时加载,所以这不应该创建位图,而更可能返回引用?或者“最终的位图位图”总是创建一个全新的位图,即使它只是参考? – damian

+0

从drawPlayer()的范围中,每次调用它时,都会创建一个新的位图对象(在此范围内),并且当此对象超出范围(drawPlayer()退出)时,此对象不再被引用,并且是垃圾收集(与Matrix对象相同) –