【发布时间】:2012-06-15 22:01:28
【问题描述】:
如果您开始渲染点,渲染大量顶点,然后结束,您获得的性能明显优于开始点、渲染顶点、结束并重复大量次(例如,在平移和例如,200,000 点的缩放动作要平滑得多)。
我想这可能是有道理的,但令人失望。有没有办法恢复性能,同时仍然在自己的开始-结束块中渲染每个点?
背景:
我想设计一个控件,它可以包含大量(在极端情况下超过一百万)“对象”,每个对象都进行自己的渲染。其中许多对象将自己表示为点。
如果我让十万个点分别在它们自己的开始端块中呈现自己,我会受到重大的性能影响(而不是在单个开始端块中呈现它们)。因此,似乎我可能必须让容器知道对象呈现自己的方式(例如,开始点,告诉所有需要呈现点的东西,然后结束)。
这弄乱了我想要的显示-对象关系的独立性。它还会通过选择来搞乱命中测试,因为我认为您不能将名称添加到 inside 起始点块的顶点,对吧?
仅供参考(以防万一)我的项目将显示 2D 场景(使用正射投影)并需要点击测试以确定用户可能单击的相关对象。通常,对象将表示“轨迹”,其中包含用线连接的各个点。位置数据通常是静态的,但点和轨迹颜色以及显示表示可能会因用户设置和选择信息而改变。一个例外——“回放”模式可能允许用户一次只能看到一个轨迹点(回放中的“当前”点),并从一个点到下一个点逐步进行时间。但是,即使在那种情况下,我也假设我会根据播放中的当前时间简单地更改每个轨道上实际显示的点(在其“静态”位置)。如果其中任何一个让我想起对 OpenGL 新手的进一步建议,那么非常感谢!
【问题讨论】:
-
如果您想要真正好的性能,就没有办法绕过巧妙的数据组织和批处理。它不必变成一团糟,但它确实需要思考。除此之外,如果可以的话,你应该真正使用 VBO(我怀疑你不能),不仅仅是为了性能,还因为它更好,未来,并且可以很好地扩展到更复杂的东西。
-
感谢您的评论。我已经开始研究 VBO(目前我的原型使用显示列表)并且仍然需要阅读以完全了解它们。我不认为他们一定会把我带到我想去的地方(我假设一堆顶点在它自己的 VBO 中不会像一个带有一堆顶点的单个 VBO 那样有效)但我试图学习我能做的,以确保我不会走上错误的设计道路,只是后来发现“哦,你可以那样做吗?”我将在有关我的情况的问题中添加更多信息,以防提供建议。