如何呈现在没有任何性能问题的情况下绘制的非常大的图像或文档

时间:2012-03-29 16:28:15

标签: c# performance memory controls

我想制作一个控件作为时间标尺,用于声音wav文件的波形,如电影制作人或camtasia工作室视频编辑器

  • 我有一个解析声音wav文件的方法
  • 我有一种方法来绘制指定时间段的波浪

问题是持续时间很长,如何渲染所有这些?一次或当用户滚动到一个点时,如果它没有渲染我将渲染它?它全部渲染后会发生什么?这将是如此长的用户将放大等等如何做而不影响性能

2 个答案:

答案 0 :(得分:1)

如果你正在处理一个大图像和大量数据,我会想到这个:

  • 呈现/显示用户当前正在查看的内容
  • 将后台线程中的其余部分呈现为内存图像

在保存在内存中的图像中渲染整个图像后,任何滚动和/或缩放都只是为了定位显示窗口。

以unzoomed缩放比例将图像渲染为Bitmap对象。当你需要显示if的一部分时,使用Bitmap.Clone将该位图的部分复制到显示给用户的图片中。有点困难的部分是呈现当前要求查看的基本位图的一部分。

这可能是对内存的要求。它实际上是一种缓存机制,并且像往常一样,通过使用更多内存来获得速度。

类似于Google地图的工作方式。

答案 1 :(得分:1)

我们不知道你如何渲染你的图形,但我认为你使用不安全的锁定位直接生成一个位图。正如Maciej所说,只需渲染你需要显示的部分 - 当放大时,再次渲染(应该很快)。您可以通过在后台渲染当前,放大1,缩小1,左1/2屏幕,右半屏等等来抢占,但是您需要管理这些(当然可以使用背景并行渲染它们工人线程)。内存的关键是将位图保持在最小(你有图形和渲染器的算法),速度的关键是保持低水平并预取你能做的和并行性。