我是OpenGL新手。
我的问题是:glMapBuffer在幕后做什么?它是否分配了新的主机内存,将GL对象数据复制到其中并返回了指针?
是否保证在以后对该方法的调用中收到相同的指针?当然在两者之间释放。
最佳答案
像通常一样,答案是“取决于”。在某些情况下,glMapBuffer确实会通过malloc分配内存,将数据复制到那里供您使用,然后glUnmapBuffer释放它。
但是,实现glMapBuffer的常见方法是通过内存映射。如果您不知道这是什么,请查看syscalls mmap(* nix系统,如Linux,MacOS X)或CreateFileMap的文档。发生的事情很有趣:现代操作系统管理虚拟内存中正在运行的进程的地址空间。每次访问某些“内存”时,操作系统的内存管理都将访问的地址用作转换表的索引,以将操作重定向到系统RAM,交换空间等。(当然,其中涉及的细节很多,内存管理内核中较难理解的事物之一)。驱动程序可以安装自己的访问处理程序。因此,进程可以将由驱动程序管理的内容mmap
到其地址空间中,并且每次对此执行访问时,都会调用驱动程序的mmap处理程序。这使驱动程序可以将一些GPU内存(通过DMA)映射到进程的地址空间中,并进行必要的簿记。在这种情况下,glMapBuffer将创建这样的内存映射,并且您收到的指针将指向进程中的某些地址空间,该地址空间已映射到为GPU保留的DMA内存中。