我正在用OpenGL着色器编写一个游戏,它会显示许多在屏幕上移动的对象。物体的数量是动态的,因此物体有时会从游戏中消失,有时会引入新的物体(例如,你试图杀死敌人的游戏)。
我该如何渲染这些物体?
我的第一个想法是每个渲染的对象都有一个VAO,每个都有自己的VBO。当对象死亡时,我从游戏中移除VAO和VBO。当引入新对象时,我创建了一个新的VAO和VBO。这种方法的问题在于可能存在数千个这样的对象,因此拥有如此多的VAO和VBO似乎相当多。
我的第二个想法是拥有一个VAO和一个VBO,以及VBO是动态的。因此,当一个对象死亡时,我从VBO中删除它的顶点数据。引入新对象时,我将顶点数据添加到VBO。这种方法的问题在于,为了使VBO具有要渲染的连续顶点集,每次对象死亡时,我需要在移除死对象时再次复制整个内容。这似乎是相当多的工作。
标准解决方案是什么?
答案 0 :(得分:0)
“标准解决方案”是预先确定您实际在做什么。如果你在游戏中有“等级”,那么你通常会有一组固定的网格,可能需要渲染。您有一些级别几何,级别装饰和您可能想要渲染的各种角色。
您构建一个包含所有数据的缓冲区对象,并根据需要从中呈现所需内容。如果您有3个角色使用相同的网格,则使用不同的统一数据渲染该网格3次,这些数据决定了它的外观(纹理,颜色等)以及渲染(变换等)的位置。
您不会因为实体被杀掉而删除网格数据。
有些情况下您确实需要动态管理内存。但这只是因为你想要呈现的东西的总数超过可用存储空间,和/或当你的世界无法分解成不连续的层次时。