LWJGL: glMapBuffer/Range 旧缓冲区有什么用?

LWJGL: glMapBuffer/Range what is the use of old buffer?

//length > 0 for all cases
ByteBuffer oldBuffer=BufferUtils.createByteBuffer(length);
ByteBuffer newBuffer=GL30.glMapBufferRange(GL15.GL_ARRAY_BUFFER,0,length,GL30.GL_MAP_READ_BIT ,oldBuffer);
   
for(int i=0;i<length;i++){System.out.println(oldBuffer.get(i));}
System.out.println();

它打印出全零,但新缓冲区包含正确的数据,这很好。 如果我将 null 指定为旧缓冲区的参数,它也可以正常工作。

那么在使用非空旧缓冲区时是否有任何 optimization/memory 在幕后进行保存? LWJGL 2.9.3 和 3.1.3

的输出相同

这是 LWJGL 特定的优化。它旨在避免在 OpenGL returns 之前作为 NIO 缓冲区返回的相同地址(您现在提供为 old_buffer 时必须分配指向映射地址的新 NIO 缓冲区对象。

另请参阅 GL15C.glMapBuffer() as well as the called APIUtil.apiGetMappedBuffer() 的 LWJGL 3 来源。

但是,当 OpenGL 驱动程序决定将缓冲内存映射到另一个虚拟地址时,您仍然会得到一个 new/fresh NIO Buffer 实例。