OpenGL 是否处理 GPU 内存碎片?

gal*_*ner 1 opengl memory-management memory-fragmentation

所以基本上每当我创建缓冲区对象时,Opengl 都会在 GPU 上分配一些内存。

考虑场景 1,其中我为 2 个统一变量生成 2 个统一缓冲区。

现在考虑场景 2,其中我创建一个缓冲区并将 2 个统一变量包含在接口块内。

我的理解是,对于场景 1,分配两个独立的内存区域,而对于场景 2,分配一个大的连续内存块。如果是这样,那么场景 1 可能容易受到内存碎片的影响,如果发生这种情况,它是由 OpenGL 或其他东西管理的,还是我们应该在编写性能关键代码之前记住这一点?

dat*_*olf 5

事实上我必须为你解决这个问题。它是

\n\n
\n

所以基本上每当我创建缓冲区对象时,Opengl 都会分配一些内存。

\n
\n\n

你不知道 \xe2\x80\x93 并且对这个内存所在的位置做出假设 \xe2\x80\x93 是无效的。您只需确信它就在那里(某处)并且您可以使用它。

\n\n
\n

由OpenGL或其他东西管理

\n
\n\n

是的。事实上,合理的 OpenGL 实现确实必须定期移动数据。想一想:在现代计算机系统上,有多个应用程序会执行以下操作:使用 GPU,并且两个进程(通常)都不关心或尊重共驻同一台计算机的其他进程的内部工作。然而,用户(自然地)期望所有进程都将“正常工作”,而与情况无关。

\n\n

GPU 驱动程序在后台执行大量数据推送,在系统内存、GPU 内存甚至存储设备上的交换空间之间移动数据,而进程不会注意到这些。

\n\n
\n

或者在编写性能关键代码之前我们应该记住这一点吗?

\n
\n\n

Average-joe-programmer 只需以简单的方式使用 OpenGL API 即可获得最佳性能,而无需试图超越实现。每个 OpenGL 实现(= GPU 模型 + 驱动程序版本的组合)都有“快速路径”,但是如果无法获得有关 GPU 和驱动程序细节的详细知识,这些知识就很难实现。

\n\n

通常只有GPU制造商自己才具备这些知识;如果您是一家 AAA 游戏工作室,通常会有一些 GPU 供应商通过快速拨号来访问您的办公室并实施他们的巫术;大多数访问此网站的人可能不会。

\n