【发布时间】: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。
【问题讨论】: