【问题标题】:How can be Autocad so fast to pan and zoom?Autocad 怎么能如此快速地平移和缩放?
【发布时间】:2015-10-26 13:45:08
【问题描述】:

我正在开发一个图像查看器,其中图形以抗锯齿模式呈现。图像可以首先使用生成 DXF 文件的 Autocad 进行编辑。

应用程序是使用 Visual C++ 和 Direct2D 编写的。

虽然我能够非常快速地加载图像,但与 Autocad 对相同图像(相同数量的形状)的性能相比,缩放和平移对我来说仍然是一个问题。

以下是用于渲染图形的代码:

auto shapes = quadTree.get_visible_shapes();
shapes.sort_by_Zorder();

for each shape in shapes:
   shape.draw();

在分析之后,我可以说超过 90% 的计算时间都花在了旨在绘制形状的循环中。

由于四叉树的实现,只绘制可见的形状,性能得到了巨大的提升;我也在平移时以别名模式渲染图形,但与 Autocad 仍有很大差异。

我想知道 Autocad 是否会绘制图像的位图表示,即使我还没有尝试过这种方法,所以我不知道是否可以有效地提高速度。

考虑到这些假设,有什么方法可以改善平移和缩放的动作吗?

【问题讨论】:

    标签: c++ directx rendering autocad direct2d


    【解决方案1】:

    在 AutoCAD 中,有一种称为自适应降级的机制,当 FPS 低于预定义值时会中止渲染:

    而且还有很多优化。你无法与这样的大项目竞争。

    【讨论】:

    • 你绝对可以竞争!这与程序有多大无关!
    【解决方案2】:

    在 2D/3D 场景上进行平移时几乎没有注意事项,尤其是在重绘世界成本高昂的情况下。

    1. 离屏画布

      使用稍大的画布(例如 w+N * h+N)将您的屏幕渲染到屏幕外位图上,在 PAN 上,您会立即放置屏幕,并在后台更新屏幕外位图。在这个方向上还有很多方法可以进一步优化。

      编辑:更多细节:

      比如你的场景屏幕是640x480,场景本身是1000x1000,你要显示区域(301, 301) ~ (940, 780)。您将改为创建一个屏幕外缓冲区,例如,从 (251,251) ~ (990, 830) 的 740x580(即 N=50)。因此,如果 PAN 操作移动小于 50 像素(例如 PAN 左移 5 像素),您已经拥有可以立即渲染到屏幕的此类内容。 此外,在 PAN 之后,您可能希望在后台(或空闲时)准备新的屏幕外缓冲区,以便可以立即执行后续 PAN。 如果 PAN 太远,您仍然需要等待它,或者降低中间屏幕的渲染质量,并仅在 PAN 停止时渲染完整的细节 - 无论如何移动时用户不会注意到细节。

    2. 限制更新频率

      PAN 操作通常由鼠标(或手势触摸)触发,这可能会在大量事件中出现。您应该限制更新频率,而不是在一秒钟内将所有 20 个鼠标移动事件排队并花费 3 秒重绘世界 20 次。

    【讨论】:

    • 感谢您的努力 +1
    • @Non-maskableInterrupt 非常有价值的见解。您对用户缩小的时间有什么建议吗?现在我们有了所有的细节,在背景中绘制它甚至位图都需要时间。当然,我们不应该绘制非常小以至于可见的细节,但是我们如何决定保持绘图的质量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2015-08-08
    • 2013-12-12
    • 2016-03-10
    相关资源
    最近更新 更多