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