1.2.1、缓存:提供数据的最好方式
OpenGL ES为两个内存区域间的数据交换定义了缓存(buffers) 的概念。缓存是指图形处理器能够控制和管理的连续RAM。程序从CPU的内存复制数据到OpenGLES的缓存。在GPU取得一一个缓存的所有权以后,运行在CPU中的程序理想情况下将不再接触这个缓存。通过控制独占的缓存,GPU就能够尽可能以最有效的方式读写内存。图形处理器把它处理大量数据的能力异步同时地应用到缓存上,这意味着在GPU使用 缓存中的数据工作的同时,运行在CPU中的程序可以继续执行。
几乎所有程序提供给GPU的数据都应该放人缓存中。缓存存储的到底是几何数据、颜色、灯光效果,还是其他信息并不重要。为缓存提供数据有如下7个步骤。
- 生成;(Generate)一请求OpenGLES为图形处理器控制的缓存生成一个独一无二的标识符。
- 绑定(Bind) 一告诉 OpenGL ES为接下来的运算使用一个缓存。
- 缓存数据(BufferData)一让OpenGLES为当前绑定的缓存分配并初始化足够的连续内存(通常是从CPU控制的内存复制数据到分配的内存)。
- 启用(Enable)或者禁止(Disable) 一告 诉OpenGL ES在接下来的渲染中是否使用缓存中的数据。
- 设置指针(SetPointers)-告诉Open-GLES在缓存中的数据的类型和所有需要访问的数据的内存偏移值。
- 绘图(Draw)一告诉OpenGLES使用当前绑定并启用的缓存中的数据渲染整个场景或者某个场景的一部分。
- 删除(Delete)一告诉OpenGLES删除以前生成的缓存并释放相关的资源。
理想情况下,每个生成的缓存都可以使用一个相当长的时间(可能是程序的整个生命周期)。生成、初始化和删除缓存有时需要耗费时间来同步图形处理器和CPU。存在这个延迟是因为GPU在删除一个缓存之前必须完成所有与该缓存相关的等待中 的运算。如果一个程序每秒生成和删除缓存数千次,GPU可能就没有时间来完成任何渲染了。
OpenGLES为一种类型的缓存在使用过程中的每-一个步骤的执行定义了下面的C语言函数,同时为其他类型的缓存提供了类似的函数。
glGenBuffers()
---请求OpenGL ES为图形处理器控制的缓存生成一个独一无二的标识符。glBindBuffer()
---告诉OpenGL ES为接下来的运算使用一个缓存。glBufferData()
或者glBufferSubData()
---让OpenGL ES
为当前绑定的缓存分配并初始化足够的连续内存(通常是从CPU控制的内存复制数据到分配的内存)。glEnableVertexAttribArray()
或者glDisableVertexAttribArray()
---告诉OpenGLES在接下来的渲染中是否使用缓存中的数据。glVertexAttribPointer()
---告诉OpenGL ES在缓存中的数据的类型和所有需要访问的数据的内存偏移值。glDrawArrays()
或者glDrawElements()
---告诉OpenGLES使用当前绑定并启用的缓存中的数据渲染整个场景或者某个场景的一部分。glDeleteBuffers()
--- 告诉OpenGL ES删除以前生成的缓存并释放相关的资源。