Graphics API的特点就是从名字上很难看出背后做了什么,所以会用和做到Best Pratice中间要经历很多曲折。昨天看了一下OpenGL中传输和更新Buffer的方法,发现了一些之前没有留意到的东西。
在创建了Buffer对象之后,可以通过glBufferData/glBufferSubData将数据从CPU Memory传输到GPU Memory,首先,数据会被memcpy到一块page-locked memory中,这一内存区域可以直接被GPU访问,至此,glBufferData将直接返回,后面数据从page-locked memory到GPU Mempry的DMA数据传输将异步执行。
更好的更新数据的方式是使用glMapBuffer/glUnMapBuffer,glMapBuffer将直接在page-locked memory中分配空间,返回指针,通过直接写page-locked memory,避免了一次memcpy。并且一些扩展支持将地址对齐,这样就可以在其内存空间上执行SSE指令。
不知道是否有不准确的地方,暂先记录下来,有时间测试一下。
原文地址:http://www.cnblogs.com/3dimensions/p/3943929.html