我对wxWidgets很新,所以请耐心等待。假设我有一个10Kx10K的图像,而我的wxScrolledWindow的大小为640x480。我将整个图像加载到我在paint函数中使用的wxBitmap中。
现在在我的OnPaint功能中我只是说
wxPaintDC dc(this);
dc.DrawBitmap(_Bitmap, 0, 0 );
这有点适用于前几个画面,但很快Window内容就出现了,并且出现了工件。当我非常快速地来回移动滚动条时,这种情况发生得非常快。
我在Windows 7计算机上使用最新的wxWidgets。
那么,我该如何改进我的绘画代码?
非常感谢, 基督教
答案 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.这就是我将视图起始坐标相乘的原因。
非常欢迎任何更多的见解。
谢谢, 基督教