我对OpenGL ES 2.0有点困惑,我找不到关于处理2D平铺的正确程序的任何权威信息(或者我有,我也不理解)。
快速而且重要的是,我目前有一些基于Canvas的游戏(它真的不像人们说的那么糟糕,我在1到10秒的CPU上获得30-40的FPS)并且性能很好,但我有一些新的想法,我认为OpenGL是获得表现我令人眼花缭乱的特效所需的表现的唯一方法。
我有一个GameEngine有几千个小时,所以我有点抵制做出巨大的架构改变只是为了“测试”我可以避免它的东西(特别是因为我是OpenGL的新手并且可以'花了一个月的时间来获得最佳表现(时间=金钱)。
我知道纹理切换非常昂贵。并且已经有一个系统用于在单个纹理上保留纹理区域。我还会跟踪屏幕上的哪些对象,因此只有显示场景所需的绘制调用才会被发送到GPU。
所以我在屏幕上有大量的瓷砖/瓷砖层,每个框架都需要重新绘制。会不会更好:
要在屏幕上重新定位一个对象,我应该glTranslate(我明白这会对GPU施加压力)还是更新更新保存QUAD坐标的FloatBuffer会不会更好?
非常感谢!
答案 0 :(得分:0)
首先,如果您使用的是OpenGL ES 2.0,则glTranslate()不可用;它仅在OpenGL ES 1.X中受支持。
效果最佳的解决方案取决于您使用的平台。特别是,GPU的底层图形架构(无论是立即渲染还是平铺渲染系统)将决定您可以在场景中使用多少个绘制调用。由于OpenGL ES没有四边形基元(例如,GL_QUADS,因为您可以在桌面OpenGL的兼容性配置文件中使用),您需要绘制一系列三角形对(每个三角形条带,每个都需要自己绘制)调用),或作为独立三角形的集合,每对三角形组成一个四边形(此模式转换更多位置,但减少绘制调用的数量),或者如果你可以在你的1.建议中做,并跟踪所有将使用相同纹理的四边形,您可以绘制一个带有退化三角形的长三角形条带(区域为零的区域,不会光栅化到屏幕上)。这将需要更多的几何体工作,但可以减少您需要做的纹理交换量。
最后,对于更新顶点位置缓冲区的问题,这也是一个依赖于平台的解决方案,但是,无论如何都要指出使用顶点缓冲区对象(VBOs) 。几乎所有移动GPU都将以这种方式存储顶点数据。