流体2D形状平移/滚动

时间:2017-04-21 07:37:02

标签: .net user-interface graph graphics 3d

假设您有一个应用程序绘制一个复杂的流程图(在我的情况下是一个.NET)。用户需要以可接受且一致的帧速率导航流程图,例如10 FPS。这意味着如果流程图很大,您将无法在不阻止UI的情况下绘制所有内容。

此外,形状复杂性差异很大,您希望绘制尽可能多的形状,以便给用户留下在动态移动过程中不会遗漏任何内容的印象。

我测试的第一种方法是计算绘制单帧(保持10 FPS)并在达到该阈值后停止绘制的时间,显然是从屏幕上跳过形状。

结果远非好。没有任何关于首先绘制什么的逻辑,绘图可以卡在一些复杂的形状上并跳过大多数简单的形状(给用户留下他/她丢失图表的印象)。此外,估计的帧率可能会有很大差异,从而导致绘制的形状数量。

你知道更好的方法吗?你知道关于这个问题的任何文章吗?

感谢。

1 个答案:

答案 0 :(得分:0)

要尝试的第一个优化是将形状从不太复杂的分类到更复杂的分类,然后在您拥有的时间内绘制。这样,您应该跳过较少的对象,这意味着屏幕上有更多的对象。 当用户停止移动时,您可以运行完整的绘图。我想我已经注意到PDF文件中某些矢量绘图中的类似行为。

另一种方法是尽可能重复使用已绘制的图像。 您可以将2D矩形参数添加到绘图代码中,并测试每个对象是否触及矩形,该矩形用作绘图的边界框。 当用户移动流程图时,例如左边10个像素 - 您复制当前图像,将其移动10个像素,并在右侧仅绘制10像素宽的垂直条 - 这样您就可以考虑更少的对象。 这种方法在Qt 2D场景中实现,具有许多技巧和优化,使其对编码器几乎透明。非常有趣的实现,但很难阅读:)。

您还可以探索线程及其为您提供的所有可能性:

您可以在另一个线程中进行绘图,以免阻止GUI。如果线程结束绘制图像,则只需在窗口中显示它。

您可以将图表拆分为正方形/矩形,并将每个正方形分配给不同的线程。当视图移动并且新方块变为可见时,您可以为其执行绘制。在主线程中,您只需检查已完成的操作并将其复制到目标位置。移动Web浏览器以类似的方式呈现网页。

根据您在移动过程中的确切内容和偏好,您还可以将图表分成若干层 - 越来越不重要等等。然后在主线程中,您只需混合/混合准备好的图像,等待对于其他人。