标题已经说明了一切,但为了清楚起见,我会添加一些额外的词语。
在这种情况下,resize 的意思是:
- 在旧的 vbo 结尾获取更多的存储空间
- 在前面保存旧数据
- (希望不需要复制,但至少不是在 CPU 端进行复制,这意味着驱动程序应该处理此操作)
编辑
为了解释更多细节和证明我的问题:
我将把(事先)未知大小的数据存储到 VBO 中,但我只知道一个非常粗略的上限估计(在不寻常的情况下比原来的数据量大 10 到 100 倍甚至更多)。
当然,当我完成后,我知道存储了多少数据,因此如果找到 VBO 太小并进行调整大小,然后继续存储数据,那将是很好的。
以下是我不想复制(特别是不想在 CPU 端进行复制)的原因:
我正在 GPU 上完成所有这些操作,以获得交互式帧速率。 当我必须复制时,速度非常慢或根本不可能,因为没有足够的空间。最糟糕的是在 CPU 上复制数据,因此将所有内容传递到总线上,进入具有足够大小的新内存区域,然后使用新大小和新内存区域作为源 glBufferData
VBO。这将是性能杀手。
避免
我通过对所需空间进行精确估计来避免了问题。但我将让这个问题未被回答一周,看看是否有人对此有其他提示,因为我对解决方案不是很满意。