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

本文关键字:非常 绘制 图像 文档 情况下 任何 性能 问题 | 更新日期: 2023-09-27 18:29:20

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

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

问题是持续时间很长,如何渲染所有的??一次或者当用户滚动到一个点时,如果它没有渲染,我会渲染它?究竟呈现了什么?用户需要很长时间才能放大,等等如何在不影响性能的情况下进行

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

如果你要处理一个大图像和大量数据,我建议这样做:

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

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

以未缩放的比例将图像渲染到位图对象中。当您需要显示部分时,如果使用Bitmap.Clone将该位图的一部分复制到显示给用户的图片中。有点困难的部分是渲染当前需要查看的基础位图的一部分。

这可能需要内存。它实际上是一种缓存机制,在这种情况下,您可以通过使用更多内存来获得速度。

类似于谷歌地图的工作方式。

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