如何正确绘制一个巨大的图像

时间:2012-08-29 21:42:56

标签: wxwidgets

我对wxWidgets很新,所以请耐心等待。假设我有一个10Kx10K的图像,而我的wxScrolledWindow的大小为640x480。我将整个图像加载到我在paint函数中使用的wxBitmap中。

现在在我的OnPaint功能中我只是说

wxPaintDC dc(this);
dc.DrawBitmap(_Bitmap, 0, 0 );

这有点适用于前几个画面,但很快Window内容就出现了,并且出现了工件。当我非常快速地来回移动滚动条时,这种情况发生得非常快。

我在Windows 7计算机上使用最新的wxWidgets。

那么,我该如何改进我的绘画代码?

非常感谢, 基督教

3 个答案:

答案 0 :(得分:3)

使用10000x10000 wxBitmap本身是一个坏主意,它可能无法在较旧的系统上创建(即400MiB的视频RAM!)。完全绘制它是纯粹的疯狂。

我不知道您的数据来自哪里,但在典型情况下,例如要在屏幕上显示的地图,您应该将其分解为平铺,将当前在屏幕上可见的平铺转换为wxBitmap(或其中几个)并仅绘制那些。

然后你可以通过使用双缓冲来优化你的绘图(这在Windows 7中相对无用,可以自己双重缓冲一切),否则,你应该使用一个合理大小的后备存储位图。

答案 1 :(得分:1)

这听起来像使用双缓冲可能会有所帮助。

首先要尝试将wxPaintDC替换为wxBufferedPaintDC

有关更多建议,请参阅以下主题的wiki文章:http://wiki.wxwidgets.org/Flicker-Free_Drawing

答案 2 :(得分:0)

正如Ravenspoint所指出的,有一篇关于wxWidgets维基的文章。所以根据那篇文章,有两件事情需要发生。首先使用空函数覆盖EVT_ERASE_BACKGROUND。

void Canvas::EraseBackground( wxEraseEvent& WXUNUSED(event))
{
}

第二个实现基本的双缓冲方案。我就是这样做的。

void Canvas::OnPaint(wxPaintEvent& WXUNUSED(event))
{
    int x, y;
    GetViewStart(&x, &y);
    wxRect Client_Area = GetClientRect();

    int width  = Client_Area.width;
    int height = Client_Area.height;

    wxBitmap Current = _Bitmap.GetSubBitmap(wxRect( x * 10, y * 10, width, height ));

    wxPaintDC dc(this);
    dc.DrawBitmap(Current, 0, 0, false );
}

我的x和y的滚动速率都设置为10.这就是我将视图起始坐标相乘的原因。

非常欢迎任何更多的见解。

谢谢, 基督教