代码之家  ›  专栏  ›  技术社区  ›  Axarydax

如何在Android画布上绘制包含大量原语的游戏

  •  4
  • Axarydax  · 技术社区  · 14 年前

    我在游戏中画了很多线,每一帧都是长方形的——这是一个老式手持电子游戏的重现。那些有粗点阵显示的主游戏和自定义图像的文本或一些图像。

    我在一个虚拟点阵屏幕上有20x20个大的“像素”,我还在屏幕上画了一些7段的显示器和其他一些东西。

    根据TraceView,大多数时间都花在DrawLine和DrawRectangle方法上,因为它们太多了。我画出点阵显示器的每一个“像素”,7段显示器的每一段 每一个 框架。

    我想到了一个优化方法,我只重新绘制那些改变了的像素/片段,所以我保存了以前的像素/片段状态,并尝试只重新绘制改变了的像素/片段。基本上这是一个粗略的无效宣告。

    我所期望的行为是画布将保持在最后一帧完成绘画后的状态,我只会重新绘制必要的东西。

    唉,我的画布正闪烁着变黑,每当我的屏幕状态改变时,只有点阵显示/片段的像素会闪烁一帧。我确保没有清理我的画布。

    我在一个SurfaceView内的画布上画画,更新线程,如登月器Android示例所述。在月球着陆器样品中,他们重新粉刷每一帧中的所有东西。

    也许我可以在第一帧将所有内容呈现为位图,然后在其他帧上更新该位图?

    我的paint()方法应该使用哪种技术?

    2 回复  |  直到 14 年前
        1
  •  2
  •   cris.h    14 年前

    surfaceholder.unlockCanvasandbost()实际上会在表面上翻转页面,因此即使上一帧没有清除,您也会得到第二个最老的帧,而不是刚刚绘制的帧。在一个曲面上执行lock()每次都会实例化一个新的画布,该画布可能正在其构造函数中执行清除操作。

    你最好像别人建议的那样画成位图,然后每次你想把图像呈现给显示器时都在画布上画位图。你可以从位图中提取画布来绘制它。

    和其他人建议的一样(非常含糊),您可以为点阵显示生成精灵,并直接从位图缓存中绘制这些精灵,而不是使用基本命令绘制。例如,对于点矩阵计算器,您可以将所有0-9生成10个位图,并将它们简单地放到画布上,而不是调用一组drawline/rect操作。

    如果上面的速度仍然太慢,那么还有OpenGL,它利用了硬件加速的优势。

        2
  •  0
  •   Vladislav Rastrusny    14 年前

    为什么不去呢 Sprites ?