【问题标题】:Canvas, drawing of multiple items, performance issues画布,多个项目的绘制,性能问题
【发布时间】:2013-08-08 03:04:03
【问题描述】:

我目前正在开发某种游戏。这是一个横向卷轴,所以很多项目都在移动 - 这导致被重绘。我在另一个(不是 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 类时,它变得更快了,它保持对每个旋转位图(以及“标准”位图)的引用。但它仍然有点滞后。

关于如何在“更专业”的游戏中做到这一点有什么建议吗?由于学习因素,我真的很想自己开发它而不使用任何第三方库。

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

【问题讨论】:

    标签: android android-canvas


    【解决方案1】:

    您不应该在每一帧中创建新的位图对象。这样一来,您将永远无法获得良好的帧速率。

    尝试改用drawBitmap(Bitmap, Matrix, Paint) 版本。这样就可以让系统处理每个物体的旋转。

    或者,您可以使用rotate() 进行简单的基于度数的旋转。不要忘记在你的画布之前save(),之后restore()

    【讨论】:

    • 不知道我可以将我的矩阵直接传递给绘图函数,谢谢。以为我必须使用矩阵重新创建位图。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多