【问题标题】:Scroll Buffering in Windows ApplicationsWindows 应用程序中的滚动缓冲
【发布时间】:2009-08-31 21:21:45
【问题描述】:

在要渲染计算量大的图形的 Windows 应用程序中,通常如何处理滚动?例如,如果我正在渲染声音的波形图,在处理来自 peakfile 的波形之后,我应该:

  • 整个图形表示渲染到内存中的 GDI 表面,然后简单地让可滚动控件更改渲染区域的开始/结束?

  • 仅渲染波的可见部分。在一个单独的线程中,处理出现在视图中的任何新的图形块。

  • 渲染波的可见部分,加上一个缓冲区。这样,用户看到波形的“空白”或“当前呈现”部分的机会就更少了。尽管如此,如果用户快速滚动到一个较远的区域,整个部分将是空白的,直到渲染完成。

问题是,许多应用程序以不同的方式处理这个问题。

例如:

Adobe Acrobat - 在滚动期间呈现空白页面,除非页面在缓存中。在文档呈现区域中可见的任何页面都将在单独的线程中呈现,并在完成时呈现。

Microsoft Word - 本质上与上述相同。文档被分成不同的页面,因此每个页面都会根据需要进行处理/呈现并添加到缓存中。

Internet Explorer - 未知。似乎整个“网页”都在图形内存中呈现,无论它消耗多少“屏幕”的图形数据。理论上,对于滚动 10 或 15 个屏幕长度的网页,这可能意味着 50-60MB 的图形内存消耗。有使用 WebKit 或 FireFox 经验的人能否解释一下渲染引擎是否倾向于消耗大量内存,或者尝试“动态”渲染页面的各个部分以节省内存?

如果有帮助,我的应用程序基于 C#、.NET 3.5 和 WinForms。

【问题讨论】:

    标签: c# winforms scroll


    【解决方案1】:

    这是复杂性与用户体验的权衡。您的第三个选项将为您提供最佳的用户体验(他们可以立即开始看到事物并开始工作)。它也是最复杂的代码(开发时间最长,需要消除的错误最多)。

    “正确”的解决方案取决于“昂贵”的昂贵程度以及用户群的需求。我会选择复杂度最低的选项,以提供满足大部分客户的用户体验:

    让它尽可能复杂,但不要比这更复杂。

    【讨论】:

      【解决方案2】:

      我认为这实际上是内存使用与处理器使用的权衡。假设您有足够的内存,您的第一个选项(在适当大小的画布上渲染整个波浪,然后移动该画布,只显示可见的窗口部分)可能是最好的方法。在初始渲染延迟之后,用户体验将变得流畅和无缝。

      如果您没有足够的内存,那么您必须即时渲染可见部分。我已经多次编写过这个应用程序(WAV 数据查看器),通常 GDI+ 的速度足以实时渲染 WAV 数据的部分(甚至大部分)(具有 30 fps 以上的高帧率,可以产生完美流畅的动画) .然而,关键是不要将每个样本值呈现为一个单独的点——这会很慢。您要做的是针对 X 轴上的每个像素,扫描相应的 WAV 样本块以获得最小和最大样本值,然后在这些值之间渲染一条线。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        相关资源
        最近更新 更多