c# – Windows应用程序中的滚动缓冲

如何在具有计算昂贵的图形渲染的
Windows应用程序中处理滚动?例如,如果我正在渲染声音的波形图,在处理来自peakfile的波形后,我应该:

>将整个图形表示渲染到内存中的GDI表面,然后简单地使用可滚动控件更改渲染区域的开始/结束?
>仅渲染波形的可见部分.在一个单独的线程中,处理进入视图的任何新的graphc块.
>渲染波形的可见部分,加上缓冲区.这样,用户看到波形的“空白”或“当前渲染”部分的可能性就越小.但是,如果用户快速滚动到远处区域,则整个部分将为空白,直到渲染完成.

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

例如:

Adobe Acrobat – 在滚动期间呈现空白页面,除非页面位于缓存中.在文档呈现区域中可见的任何页面都在单独的线程中呈现,并显示为完成.

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

Internet Explorer – 未知.看起来整个“网页”都在图形内存中呈现,无论它消耗多少“屏幕”值的图形数据.从理论上讲,如果网页滚动10或15个屏幕长度,这可能意味着50-60MB的图形内存消耗.任何有WebKit或FireFox经验的人都可以解释渲染引擎是否有利于消耗大量内存,或尝试“动态”渲染页面的peices以节省内存?

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

最佳答案 这是一种复杂性与用户体验的权衡.您的第三个选项将为您提供最佳用户体验(他们可以立即开始查看并开始工作).它也是最复杂的代码(开发时间最长,需要杀死最多的bug).

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

使它变得如此复杂,但并不复杂.

点赞