在Android上将Canvas移植到OpenGL

时间:2017-12-22 03:28:28

标签: android opengl-es android-canvas

我正在制作2D Android游戏,目前,我在画布上绘图。

当我尝试绘制大量的圆形笔划时,帧率会下降很多。 所以我想我应该尝试用更强大的东西来绘图。

将基于画布的游戏移植到例如OpenGL ES或任何其他游戏引擎的最简单方法是什么? 我应该将游戏引导到什么游戏引擎?

1 个答案:

答案 0 :(得分:1)

我碰巧正在用我自己的2D引擎做一个类似的端口/扩展,我以前自己也有这个确切的问题。

我假设您的引擎目前的工作方式如下:

  1. 它使用SurfaceView
  2. 在游戏循环中(在单独的线程上),它调用lockCanvas()
  3. 然后,它使用CanvasdrawCircle()drawLine()等方法(引擎盖下的Skia库)吸引drawPath()
  4. 然后,它会调用unlockCanvasAndPost()
  5. 在此之后,可能会使用Thread.sleep()等待一段时间。
  6. 如果这个假设是正确的,那么:

    首先,有很多原因为什么你的帧率可能很低(例如,在游戏循环中创建任何对象,从而导致垃圾收集进入)。如果您已经对其进行了测量(使用System.nanoTime()),并且调用drawCircle()方法的时间过长,那么:

    您可以尝试创建位图:

    Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    c.drawCircle(...);
    

    您可以在初始化期间将圆圈绘制到它们中,然后在游戏循环中绘制位图(使用drawBitmap()方法)。这已经比绘制圆圈快得多。

    如果这仍然太慢,您可以尝试使用OpenGL ES 2.0。我建议遵循教程,如书籍OpenGL ES 2 for Android by Kevin Borthaler - 这个版本有2D和纹理的很好的例子。我建议从他的纹理示例源代码开始,并修改它。

    您会发现(并且您可能会惊讶地发现)您无法使用OpenGL ES绘制点,线和三角形以外的任何形状,并渲染它们与纹理。 这意味着这里最简单的方法是为每个圆圈使用2个三角形来形成一个矩形,然后对来自Bitmap的纹理应用一个纹理,通过绘制圆圈来初始化该纹理。

    这是" port"最简单的方法。你当前的绘图,但它仍然很复杂。我建议先尝试基于Bitmap的方法。

    关于游戏引擎,它们可能基于OpenGL ES本身(它不是游戏引擎,而是低级GPU API)。它们可能会使过程更容易,但您的选择将类似于上一种方法。