gal*_*ner 1 opengl memory-management memory-fragmentation
所以基本上每当我创建缓冲区对象时,Opengl 都会在 GPU 上分配一些内存。
考虑场景 1,其中我为 2 个统一变量生成 2 个统一缓冲区。
现在考虑场景 2,其中我创建一个缓冲区并将 2 个统一变量包含在接口块内。
我的理解是,对于场景 1,分配两个独立的内存区域,而对于场景 2,分配一个大的连续内存块。如果是这样,那么场景 1 可能容易受到内存碎片的影响,如果发生这种情况,它是由 OpenGL 或其他东西管理的,还是我们应该在编写性能关键代码之前记住这一点?
事实上我必须为你解决这个问题。它是
\n\n\n\n\n所以基本上每当我创建缓冲区对象时,Opengl 都会分配一些内存。
\n
你不知道 \xe2\x80\x93 并且对这个内存所在的位置做出假设 \xe2\x80\x93 是无效的。您只需确信它就在那里(某处)并且您可以使用它。
\n\n\n\n\n由OpenGL或其他东西管理
\n
是的。事实上,合理的 OpenGL 实现确实必须定期移动数据。想一想:在现代计算机系统上,有多个应用程序会执行以下操作:使用 GPU,并且两个进程(通常)都不关心或尊重共驻同一台计算机的其他进程的内部工作。然而,用户(自然地)期望所有进程都将“正常工作”,而与情况无关。
\n\nGPU 驱动程序在后台执行大量数据推送,在系统内存、GPU 内存甚至存储设备上的交换空间之间移动数据,而进程不会注意到这些。
\n\n\n\n\n或者在编写性能关键代码之前我们应该记住这一点吗?
\n
Average-joe-programmer 只需以简单的方式使用 OpenGL API 即可获得最佳性能,而无需试图超越实现。每个 OpenGL 实现(= GPU 模型 + 驱动程序版本的组合)都有“快速路径”,但是如果无法获得有关 GPU 和驱动程序细节的详细知识,这些知识就很难实现。
\n\n通常只有GPU制造商自己才具备这些知识;如果您是一家 AAA 游戏工作室,通常会有一些 GPU 供应商通过快速拨号来访问您的办公室并实施他们的巫术;大多数访问此网站的人可能不会。
\n