识字粗堪供赋役,不须辛苦慕公卿。这篇文章主要讲述在Android上将Canvas移植到OpenGL相关的知识,希望能为你提供帮助。
我正在制作2D android游戏,目前,我在Canvas上绘图。
当我尝试绘制很多圆形笔划时,帧率会下降很多。所以我想我应该尝试用更强大的东西来绘图。
将基于画布的游戏移植到例如OpenGL ES或任何其他游戏引擎的最简单方法是什么?我应该将游戏移植到哪个游戏引擎?
答案我碰巧正在使用我自己的2D引擎进行类似的端口/扩展,我曾经自己有这个问题。
我假设您的引擎目前的工作方式如下:
- 它使用
SurfaceView
。 - 在游戏循环中(在单独的线程上),它调用
lockCanvas()
。 - 然后,它使用一些
Canvas
,drawCircle()
,drawLine()
等方法(引擎盖下的Skia库)吸引drawPath()
。 - 然后,它调用
unlockCanvasAndPost()
。 - 在此之后,它可能会等待一段时间使用
Thread.sleep()
。
【在Android上将Canvas移植到OpenGL】首先,帧率可能很低的原因有多种(例如,在游戏循环中创建任何对象,从而导致垃圾收集进入)。如果你已经测量过它(使用
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
的纹理,通过绘制圆圈来初始化。这是“移植”当前绘图的最简单方法,但它仍然非常复杂。我建议先尝试基于
Bitmap
的方法。关于游戏引擎,它们可能基于OpenGL ES本身(它不是游戏引擎,而是低级GPU API)。它们可以使过程更容易,但您的选择将类似于最后一种方法。
推荐阅读
- 如何在Android上将OpenGL ES 1.0代码转换为OpenGL Es 2.0()
- 如何在android上定义glsl的“time”参数
- 使用OpenGL ES 2.0在Android上创建Audio wave
- PixelBuffer对象和Android上的glReadPixel(ARCore)阻塞
- 如何在Android上的GvrView中显示2D图像()
- 如何确定Android OpenGL ES上的最大纹理内存
- 如何在android中实现Drag Distortion Image过滤器()
- 没有引擎的Android 2D游戏开发
- 在OpenGL ES(Android)中使用带纹理的索引缓冲区有什么意义吗()