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().