【发布时间】:2011-08-31 11:46:52
【问题描述】:
标题说明了一切,但为了清楚起见,我会添加一些额外的词。
在这种情况下,resize 的意思是:
- 在旧 vbo 末尾获得更多存储空间
- 将旧数据保存在最前面
- (希望不是复制,但至少不是在 CPU 端,这意味着驱动程序应该处理这个)
编辑
至于解释更多细节并证明我的问题:
我会将(正手)未知大小的数据存储到 VBO,但我只知道一个非常粗略估计的上限(在不寻常的条件下是 10 - 100 倍甚至更多)。
当然,我知道我存储了多少数据,当我完成数据时,最好先存储数据,直到我发现我的 VBO 太小,然后调整它的大小,然后继续存储。
这就是我不想复制的原因(尤其是在 CPU 端):
我在 GPU 上执行所有这些操作以获得交互式帧速率。当我必须复制时,它非常慢甚至不可能,因为没有足够的空间。最糟糕的是通过 CPU 复制数据,从而通过总线将所有内容传递到具有足够大小的新内存区域,然后 glBufferDataing VBO 以新大小和新内存区域作为源。那将是性能杀手。
规避
我通过精确估计所需空间来规避这个问题。但我会让这个问题在一周内无人回答,看看是否有人对此有其他提示,因为我对解决方案不太满意。
【问题讨论】:
-
您是否尝试只使用一个(且巨大的)VBO?
-
@Rookie:我想让 VBO 尽可能小,但它仍然可以很大(>100mb)。但我想并行存储至少 3 个,以及一些大约 40mb 大小的额外数据。
-
我不确定不同卡之间的 VBO 性能如何变化,但是在我的卡上我可以制作最大 1MB VBO,否则我会损失很多性能。考虑 100MB VBO 听起来很疯狂。尝试将它们分成最大 1MB 的部分,我认为即使有 100 倍以上的 VBO(在你的情况下只有 300 个 VBO),你也不会渲染任何东西。这也应该解决您的调整大小问题。更不用说:在我的卡中我不能超过 4MB 或其他东西,之后数据被破坏并且不会呈现其余部分。
-
@Rookie:对我来说,那些大的 VBO 不是问题,它们渲染得很好,没有损坏数据或减速。你的卡几岁了?我认为调用 300 次 glDrawArrays 比在大型 VBO 上调用一次开销更大,但我没有对此进行测试。
-
如果你没有测试它,你应该......也许你的卡太快了,以至于你认为即使你只有 1% 的性能也没有减速;)我的卡不是最好的市场,但它非常好,任何游戏都可以正常工作。如果您只是为自己做这件事,那么其他人是否无法运行您的程序也没关系,否则您应该运行大量测试它在不同用户上的执行情况,我认为我无法运行那件事,甚至可能会爆炸我的卡... ;)