0

我对 wxWidgets 还很陌生,所以请多多包涵。假设我有一个 10Kx10K 的图像,而我的 wxScrolledWindow 的大小为 640x480。我将整个图像加载到我在绘制函数中使用的 wxBitmap 中。

现在在我的 OnPaint 函数中,我只是说

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

这在最初的几幅画中有些作用,但很快 Window 内容就出现了问题,并且出现了伪影。当我非常快速地来回移动滚动条时,这种情况发生得非常快。

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

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

非常感谢,克里斯蒂安

4

3 回答 3

3

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

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

然后你可以通过使用双缓冲来优化你的绘图(在 Windows 7 下它相对无用,它自己双缓冲所有内容),但你应该使用大小合理的后备存储位图。

于 2012-08-29T23:10:33.320 回答
1

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

开始尝试的第一件事是用wxBufferedPaintDC替换 wxPaintDC

如需更多建议,请参阅关于该主题的 wiki 文章:http ://wiki.wxwidgets.org/Flicker-Free_Drawing

于 2012-08-29T21:59:05.150 回答
0

正如 Ravenspoint 好心指出的那样,wxWidgets 的 wiki 上有一篇文章。因此,根据那篇文章,需要发生两件事。首先用一个空函数覆盖 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。这就是为什么我将视图起始坐标相乘。

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

谢谢,克里斯蒂安

于 2012-08-29T22:22:02.043 回答