0

如果您开始渲染点,渲染大量顶点,然后结束,您将获得明显更好的性能,而不是您开始点,渲染顶点,结束并重复大量时间(例如,在平移和缩放操作期间重绘) ,比如说,200,000 点更平滑)。

我想这可能是有道理的,但它令人失望。有没有办法恢复性能,同时仍然在自己的开始-结束块中渲染每个点?

背景:

我想设计一个控件,它可以包含大量(在极端情况下超过一百万)“对象”,每个对象都进行自己的渲染。许多这些对象将自己表示为点。

如果我让十万个点分别在自己的开始-结束块中呈现自己,我会受到重大的性能影响(而不是在单个开始-结束块中呈现它们)。因此,似乎我可能必须让容器知道对象呈现自己的方式(例如,开始点,告诉所有需要呈现点的东西,然后结束)。

这弄乱了我想要的显示对象关系的独立性。它还会通过选择来搞乱命中测试,因为我认为您不能在开始-结束点块内的顶点中添加名称,对吗?

仅供参考(如果这有帮助)我的项目将显示 2D 场景(使用正射投影)并且需要命中测试以确定用户可能单击的相关对象。通常,对象将表示“轨迹”,其中包含用线连接的各个点。位置数据通常是静态的,但点和轨迹颜色以及显示表示可能会因用户设置和选择信息而改变。一个例外——“回放”模式可能允许用户一次只能看到一个轨迹点(回放中的“当前”点),并从一个点到下一个点逐步进行时间。但是,即使在那种情况下,我也假设我会根据播放中的当前时间简单地更改每个轨道上实际显示的点(在其“静态”位置)。

4

1 回答 1

0

为了解决这个问题,我开始使用 VBO(它确实加快了速度)。然后,我允许我的“轨道”对象分别绘制自己的一组点以及连接这些点的线(每个轨道使用两个 DrawArray:一个用于线带,一个用于点)。每个点不必独立于其他点来绘制自身——这是主要的性能改进。

但是,我仍然需要针对这些点进行命中测试,所以..

最后,我需要允许每个显示的对象(在本例中为轨道)执行自己的选择例程,以便每个对象都可以执行有效选择所需的操作。对于轨道,他们采取了两个步骤。首先,轨道用一个名称 (0) 为其整个线带命名并执行选择。如果导致命中,则轨道会进行第二次渲染,命名每个单独的点和线段以针对轨道的每个部分进行命中测试。这使得对每个点的命中测试非常快。

顺便说一句,我正在使用 .Net (C#) 进行编程。有了它,我创建了一个SelectEventArgs派生自的类 ( )EventArgs来描述正在显示的对象的选择标准。我的SelectEventArgs班级包括一个旨在填充选定对象的列表。然后显示类有一个EventHandler<SelectEventArgs>事件。将对象添加到显示时,它会订阅该事件。当事件触发时,每个对象确定它是否被选中,并用其信息填充所选对象的列表(在事件中传递的 SelectEventArgs 中)。事件触发后,我可以访问SelectEventArgs实例中返回的对象列表来处理用户交互。我发现这是创建灵活的显示对象和选择工具的一个很好的模式。

于 2012-06-15T14:01:28.977 回答