Opengl es glBufferData在Cocos2d-x 3.3中使用大纹理(精灵表)时速度非常慢

Opengl es glBufferData在Cocos2d-x 3.3中使用大纹理(精灵表)时速度非常慢,opengl-es,cocos2d-x,Opengl Es,Cocos2d X,我正在使用Cocos2d-x将我的电脑游戏移植到安卓系统。 对于精灵部分,我想优化渲染过程,所以我决定动态创建包含所有精灵帧的精灵图纸 不幸的是,这使得渲染过程比使用仅包含当前精灵帧的小纹理慢10-15倍(在移动设备上,在Windows上,一切都运行平稳) 我最初认为这可能与渲染过程显示一张图纸中的一个精灵,然后显示另一张图纸中的另一个精灵等时在图纸(大纹理,如4096*4096)之间切换有关。。。在巨大纹理之间进行大量切换。 因此,在将其帧“放入”精灵表之前,我对精灵进行了排序,我可以确认开关

我正在使用Cocos2d-x将我的电脑游戏移植到安卓系统。 对于精灵部分,我想优化渲染过程,所以我决定动态创建包含所有精灵帧的精灵图纸

不幸的是,这使得渲染过程比使用仅包含当前精灵帧的小纹理慢10-15倍(在移动设备上,在Windows上,一切都运行平稳)

我最初认为这可能与渲染过程显示一张图纸中的一个精灵,然后显示另一张图纸中的另一个精灵等时在图纸(大纹理,如4096*4096)之间切换有关。。。在巨大纹理之间进行大量切换。 因此,在将其帧“放入”精灵表之前,我对精灵进行了排序,我可以确认开关现在不存在

经过长时间的调查、分析、测试等。。。我最终发现一个OpenGL函数需要花费所有的时间:

glBufferData(GL_ARRAY_BUFFER, sizeof(_quadVerts[0]) * _numberQuads * 4, _quadVerts, GL_DYNAMIC_DRAW);
如果我使用大的纹理,调用这个函数需要很长时间(分析器说每次调用超过20毫秒),如果我使用小的纹理(大约2毫秒),调用速度相当快

我真的不知道OpenGL,我之所以使用它是因为Cocos2d-x使用它,而我不愿意尝试调试/优化引擎,因为我真的认为他们在这方面比我好得多:)

我可能误解了一些事情,我被困在这几天,我不知道我现在能做什么

有什么线索吗

注意:我说的是glBufferData,但我对glBindFramebuffer也有同样的问题,对于大纹理,速度非常慢。我想这都是同一个话题


由于glBufferData涉及CPU到GPU的传输,因此通常这是一个代价高昂的调用。 但是Renderer::tractedquads背后的逻辑是刷新临时数组中已缓冲的quads。渲染的四边形越多,传输的数据就越多。 由于四边形属性(位置、纹理、颜色)可能会更改每一帧,因此需要按照标志GL_DYNAMIC_DRAW的提示,在每一帧中进行CPU到GPU的传输

根据规范:

GL_DYNAMIC_DRAW:数据存储内容将被反复修改并多次用作GL drawing命令的源

glBufferData有一些可能的替代品,如glMapBuffer或glBufferSubData,可用于比较