1. 尽量使用顶点缓冲区对象(VBO)减少CPU到GPU之间的数据拷贝次数。
    VBO(Vertex Buffer Object)是让APP存储和操作GPU内存中数据的一种机制。当GPU处理数据时,不需要从CPU内存中读取,可以节约内存带宽。

2.减少DrawCall次数,最大化一次性传入数据给显卡
避免使用glVertex之类,转而使用glDrawArray,对数据集进行批次传送.在这里它的作用不仅仅只是优化数据传递带宽需求,它更可以减少函数调用在系统当中的消耗(在某些系统下,消耗相当可观)

3.图元类型优化
尽可能地使用GL_TRIANGLE_STRIP替代GL_TRIANGLES。
使用状态集合,降低驱动程序的CPU处理时间,
三角形Stripe的成熟软件:
http://www.cs.sunysb.edu/~stripe/

4.纹理优化
(1)使用纹理组合
将多个小纹理组合为一个大纹理,这样既减少了纹理加载次数,也可以提高渲染批次。
(2)尽量使用MipMap纹理
(3)使用压缩纹理
检查OpenGL extension支持的压缩纹理格式
(4)除非必要,尽量不要使用大纹理

  1. 删除调试信息
    1) 尽量少使用printf,但logcat对性能影响不大
    2) 尽量不要调用glGetError(),如果需要,每帧不要超过一次,因为它需要占用较多的时间

6.避免调用阻塞图形管道的函数。
1) glReadPixels()
2) glCopyTexImage()
3) glTexSubImage()

7 不要每一帧都编译Shaders

  1. 禁止使用24位纹理
    可使用16位或32位纹理,而不要使用24位纹理。24位纹理不完全适合高速缓存。采用24位纹理可能会导致数据使用超过一个高速缓存行,这对性能和内存带宽将产生负面影响。

  2. 减少内存带宽
    可减少内存带宽的方法
    • Activate back face culling.
    • Utilize view frustum culling.
    • Ensure textures are not too large.
    • Use a texture resolution that fits the object on screen.
    • Use low bit depth textures where possible.
    • Use lower resolution textures if the texture does not contain sharp detail.
    • Only use trilinear filtering on specific objects.
    • Utilize Level of Detail (LOD).

  3. 避免过度调用Query OpenGL ES 查询状态的函数,glGet()之类的.像glGetError().