我是OpenGL的新手。 我的问题是:glMapBuffer在幕后做了什么?它是否分配一个新的主机内存,将GL对象数据复制到它并返回指针?
是否可以接收相同的指针以便后续调用此方法?当然是在两者之间释放。
答案 0 :(得分:9)
它可以做任何这些。 glMapBuffer
的具体内存行为是实现定义的。
如果映射缓冲区以进行读取,它可能会为您提供指向该缓冲区对象内存的指针。或者它可能会分配一个指针并复制它。如果映射缓冲区进行写入,它可能会为您提供指向该缓冲区对象内存的指针。或者它可能会分配一个指针并交给你。
没有办法知道;你不能依赖它做任何一个。它应该比glBufferSubData
提供更好的性能,假设您可以将数据(从文件或其他地方)直接生成到从glMapPointer
返回的内存中。最糟糕的情况是glBufferSubData
的性能相同。
是否可以接收相同的指针以便后续调用此方法?
绝对不是。
答案 1 :(得分:9)
像往常一样,答案是“它取决于”。在某些情况下, glMapBuffer 确实会通过 malloc 分配内存,将数据复制到那里供您使用, glUnmapBuffer 将其释放。
然而,实现 glMapBuffer 的常用方法是通过内存映射。如果您不知道这是什么,请查看syscalls mmap (* nix系统,如Linux,MacOS X)或 CreateFileMap 的文档。会发生什么有趣的事情:现代操作系统管理虚拟内存中运行进程的地址空间。每次访问某些“内存”时,操作系统的内存管理都会使用访问过的地址作为转换表的索引,将操作重定向到系统RAM,交换空间等。(当然,细节非常复杂,内存管理是内核中难以理解的事情之一)。驱动程序可以安装自己的访问处理程序。因此,一个进程可以mmap
由驱动程序管理到其地址空间的内容,并且每次都对此执行访问,驱动程序的 mmap 处理程序被调用。这允许驱动程序将一些GPU内存(通过DMA)映射到进程的地址空间并执行必要的簿记。在这种情况下, glMapBuffer 将创建这样的内存映射,并且您收到的指针将指向进程中的某些地址空间,该地址空间已映射到为GPU保留的DMA内存。