【问题标题】:GDI+ Offscreen Buffered ScrollingGDI+ 离屏缓冲滚动
【发布时间】:2010-07-21 00:29:07
【问题描述】:

我正在使用 C# GDI+ 创建一个自定义控件。

快速解释...该控件将在屏幕上显示 500 像素,但可能包含 500000 像素的信息。因此,虽然我一次只显示 500 像素,但我显然需要在水平面(左右)滚动。棘手的部分是每个 500px 的位图块需要一段时间(在 100ms - 1000ms 之间)来渲染。

所以我的计划是在内存中维护一个 1500px 的位图。即 500px 可见部分和 500px 可见区域的任一侧,并在用户滚动时异步绘制屏幕外部分。

我想要一些反馈、建议、批评或代码示例来帮助我实现这一目标。这似乎相当简单,但经过几次初步测试尝试后,它被证明比想象的要困难。

谢谢。

【问题讨论】:

  • 您遇到了什么样的问题?闪烁?您是否已经渲染到缓冲区,然后在您的绘制事件中从缓冲区复制到您的控件?
  • 是的,我目前能够构建一个 1500 像素的位图并滚动它。我遇到的问题确实是当用户滚动到缓冲区边缘时更新位图的最佳方法。
  • 我在想一种方法是拥有三个 500px 位图的数组,这些位图可以根据需要滚动和更新。
  • 另一种方法可能是拥有一个 1500 像素的大位图,当用户滚动到边缘时,我必须将当前可见区域位图的另一端,重新绘制无效区域,然后开始再次滚动。我似乎无法在网上找到任何此类事情的示例。

标签: c# gdi+ drawing scroll buffer


【解决方案1】:

这种方法的有效性取决于,除其他外,用户会做的移动量。如果用户正在做小动作,然后停下来考虑新信息,这可能会起作用。但是,如果用户来回呼啸而过,您仍然会遇到问题。

您的应用程序是否有助于逐步提高图像质量 - 即提供快速可用的图像,然后在用户停止考虑时对其进行改进?

【讨论】:

  • 不幸的是,控件显示的是医疗趋势数据,因此它并不能真正帮助逐步提高质量。此外,用户从左向右滚动的速度也可能相当快,并且分页速度也很慢。
【解决方案2】:

几年前我也遇到过类似的问题。正如 dommer 所提到的,如果您在显示它们之前处理图像的块,那么您最好显示一些东西并稍后改进它。如果您在对原始图像进行 blitting 时遇到问题,则说明您的方法有问题。 GDI+ 对像素深度非常特别(你想要 32bpp 和 alpha)。

在我们的例子中,我们处理了 500 像素的图块,并在可见视图周围填充了一个图块 Ff 用户滚动到我们处理的区域之外,我们用叠加在其上的深色半透明矩形对原始图像的位进行了 blitted他们。这些块已排队等待处理。当我们处理图像的大块(居中)时,它们半透明的矩形会消失。

它工作得相当好,反应灵敏且速度非常快。将原始位图blit到屏幕上非常快,在我们的例子中,处理通常非常紧随其后。瓷砖变亮的效果其实还是蛮漂亮的。

【讨论】:

  • 不要以为你有任何你的代码让我有任何砍掉的代码?
【解决方案3】:

仅绘制可见区域。 构建一个方法

Bitmap DrawGraph(leftMargin, rightMargin) {...}

然后在OnPaint()

Bitmap bmp = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height);
bmp = DrawGraph(e.ClipRectangle.Left, e.ClipRectangle.Right);

e.Graphics.DrawImageUnscaled(bmp, e.ClipRectangle.Location);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多