OpenGL 会处理 GPU 内存碎片吗?
Does OpenGL takes care of GPU memory fragmentation?
所以基本上每当我创建缓冲区对象时,Opengl 都会在 GPU 上分配一些内存。
考虑场景 1,我为 2 个统一变量生成 2 个统一缓冲区。
现在考虑场景 2,我创建一个缓冲区并将 2 个统一变量包含在一个接口块中。
我的理解是,对于场景 1,分配了两个独立的内存区域,而对于场景 2,分配了一个大的连续内存块。如果是这样,那么场景 1 可能容易受到内存碎片的影响,如果发生这种情况,它是由 OpenGL 还是其他东西管理的,或者我们应该在编写性能关键代码之前记住这一点吗?
实际上,我必须为您解决这个问题。这是
So basically whenever I create buffer objects Opengl allocates some memory.
你不知道——而且做出假设是无效的——关于这个记忆所在的位置。您只需确信它就在那里(某处)并且您可以使用它。
managed by OpenGL or something
是的。事实上,合理的 OpenGL 实现确实必须定期移动数据。想一想:在现代计算机系统上,多个应用程序 do 并行使用 GPU,并且两个进程(通常)都不关心或尊重共存于同一进程的其他进程的内部工作机器。然而,用户(自然地)期望所有进程将 "just work" 独立于情况。
GPU 驱动程序在后台执行大量数据推送,在系统内存、GPU 内存之间移动数据,甚至在存储设备上交换 space 而进程不会注意到任何这些。
OR should we keep this in mind before writing performance critical code?
普通程序员将通过直接使用 OpenGL API 获得最佳性能,而无需试图超越实现。每个 OpenGL 实现(= GPU 模型 + 驱动程序版本的组合)都有 "fast paths",但是如果无法获得有关 GPU 和驱动程序详细信息的详细知识,则很难获得。
通常只有GPU制造商自己有这方面的知识;如果您是一家 AAA 游戏工作室,您通常会快速拨打几个 GPU 供应商的电话来拜访您的办公室并进行他们的巫毒教;大多数访问此站点的人可能不会。
所以基本上每当我创建缓冲区对象时,Opengl 都会在 GPU 上分配一些内存。
考虑场景 1,我为 2 个统一变量生成 2 个统一缓冲区。
现在考虑场景 2,我创建一个缓冲区并将 2 个统一变量包含在一个接口块中。
我的理解是,对于场景 1,分配了两个独立的内存区域,而对于场景 2,分配了一个大的连续内存块。如果是这样,那么场景 1 可能容易受到内存碎片的影响,如果发生这种情况,它是由 OpenGL 还是其他东西管理的,或者我们应该在编写性能关键代码之前记住这一点吗?
实际上,我必须为您解决这个问题。这是
So basically whenever I create buffer objects Opengl allocates some memory.
你不知道——而且做出假设是无效的——关于这个记忆所在的位置。您只需确信它就在那里(某处)并且您可以使用它。
managed by OpenGL or something
是的。事实上,合理的 OpenGL 实现确实必须定期移动数据。想一想:在现代计算机系统上,多个应用程序 do 并行使用 GPU,并且两个进程(通常)都不关心或尊重共存于同一进程的其他进程的内部工作机器。然而,用户(自然地)期望所有进程将 "just work" 独立于情况。
GPU 驱动程序在后台执行大量数据推送,在系统内存、GPU 内存之间移动数据,甚至在存储设备上交换 space 而进程不会注意到任何这些。
OR should we keep this in mind before writing performance critical code?
普通程序员将通过直接使用 OpenGL API 获得最佳性能,而无需试图超越实现。每个 OpenGL 实现(= GPU 模型 + 驱动程序版本的组合)都有 "fast paths",但是如果无法获得有关 GPU 和驱动程序详细信息的详细知识,则很难获得。
通常只有GPU制造商自己有这方面的知识;如果您是一家 AAA 游戏工作室,您通常会快速拨打几个 GPU 供应商的电话来拜访您的办公室并进行他们的巫毒教;大多数访问此站点的人可能不会。