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