我刚刚开始在Android上学习OpenGL,我只是注意到一些gl调用,例如glTexCoordPointer(...)或glVertexPointer(...),只接受Buffer对象中的数据,其他如glDrawTexvOES(),glTexParameteriv(),也接受一个float []。
我很好奇为什么会这样? :)
答案 0 :(得分:2)
基本区别在于glTexCoordPointer和glVertexPointer函数的输入不会立即使用,只有在调用glDraw方法时才使用它们,例如glDrawArrays,glDrawElements。
由于不立即使用数组,因此需要将指向发送到这些函数的数组的指针保持足够长的时间,以便绘制例程访问它。数据必须位于本机堆上,否则垃圾收集器可以移动基础本机指针,即使数据未被删除也是如此。为了在本机堆上获取指针,您需要将数据包装在Buffer对象中。
类似glTexParameteriv的函数使用你传递的数组中的值,因此不必担心指针从被调用函数下面移出,也不需要在本机堆上有它们。
如果您使用glTexCoordPointer和来自本机代码的朋友,则必须保留指向它的指针,直到您调用glDraw函数为止。从本机代码中,您的优势在于指针不需要包装在对象中,但您的缺点是必须手动管理任何堆分配。