画布,绘制多个项目,性能问题

时间:2013-08-06 22:16:41

标签: android android-canvas

我目前正在开发某种游戏。它是一个侧卷轴,所以很多项目都在移动 - 这会导致重新绘制。我在另一个(不是UI)线程的SurfaceView上绘制所有内容,但只要有更多项目要绘制,性能就会下降。 是否有任何“好”的机制来改善性能?我能在多个线程中以某种方式执行此操作吗?

我考虑过创建多个画布,并在每个画布上绘制一部分ViewObject列表(在不同的线程中),但后来我不知道如何“合并”这些。

当我开始添加旋转图像时,性能问题就开始了。我像这样旋转它们:

         Matrix matrix = new Matrix();
            matrix.preRotate(mRotation, (float) (mResourceBitmaps[mFrame].getWidth()), (float) (mResourceBitmaps[mFrame].getHeight()) / 2f);

            Bitmap bmp2 = Bitmap.createBitmap(mResourceBitmaps[mFrame], 0, 0,
                    mResourceBitmaps[mFrame].getWidth(), mResourceBitmaps[mFrame].getHeight(), matrix, true);

所以我在代码中为每个动画帧旋转每个位图。当我开始添加带有LruCache的BitmapHolder类时,它变得更快,LruCache保留了每个旋转位图(以及“标准”位图)的引用。但它仍然有点落后。

有关如何在“更专业”游戏中完成此操作的任何建议?由于学习因素,我真的很喜欢自己开发并且不使用任何第三方库。

所以基本上,我的问题是:如何在单个画布/ surfaceview上绘制“很多”位图/资源(因为它们在我的drawable文件夹中存储为PNG)?或者我是否必须回退到代表对象的多个视图元素而不是SurfaceView?

1 个答案:

答案 0 :(得分:0)

您不应该在每个帧中创建新的Bitmap对象。你永远不会以这种方式获得良好的帧速率。

请尝试使用drawBitmap(Bitmap, Matrix, Paint)版本。这样您就可以让系统处理每个对象的旋转。

或者,您可以使用rotate()进行简单的基于程度的轮换。不要忘记之前的save()画布,之后restore()