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