双缓存绘制所占的内存使用惊人的问题
在写一个控件的时候,因绘制的工作比较大,为避免闪烁,自然是使用双缓存。
没想到,当用户不断引发控件的绘制工作是,内存容量不断增加,最大的内容使用在五、六百兆也是常事。
想一下,回收一下gxOff和m_bmpOffscreen吧。于是控件就能控制在50兆之内。稍做一下尝试,发现gxOff是内存的主要使用者,回收gxOff的效果比回收m_bmpOffscreen明显得好。
Bitmap m_bmpOffscreen = null;
Graphics gxOff; //Offscreen graphics
m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
gxOff = Graphics.FromImage(m_bmpOffscreen);
gxOff.Clear(this.BackColor);
//TODO:添加所有绘制工作,都是绘制在gxOff对象上
//绘制到前台
e.Graphics.DrawImage(m_bmpOffscreen, 0, 0);
Graphics gxOff; //Offscreen graphics
m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
gxOff = Graphics.FromImage(m_bmpOffscreen);
gxOff.Clear(this.BackColor);
//TODO:添加所有绘制工作,都是绘制在gxOff对象上
//绘制到前台
e.Graphics.DrawImage(m_bmpOffscreen, 0, 0);
没想到,当用户不断引发控件的绘制工作是,内存容量不断增加,最大的内容使用在五、六百兆也是常事。
想一下,回收一下gxOff和m_bmpOffscreen吧。于是控件就能控制在50兆之内。稍做一下尝试,发现gxOff是内存的主要使用者,回收gxOff的效果比回收m_bmpOffscreen明显得好。
Bitmap m_bmpOffscreen = null;
Graphics gxOff; //Offscreen graphics
m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
gxOff = Graphics.FromImage(m_bmpOffscreen);
gxOff.Clear(this.BackColor);
//TODO:添加所有绘制工作,都是绘制在gxOff对象上
//绘制到前台
e.Graphics.DrawImage(m_bmpOffscreen, 0, 0);
m_bmpOffscreen.Dispose();//效果不明显
gxOff.Dispose();//回收效果相当明显
Graphics gxOff; //Offscreen graphics
m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height);
gxOff = Graphics.FromImage(m_bmpOffscreen);
gxOff.Clear(this.BackColor);
//TODO:添加所有绘制工作,都是绘制在gxOff对象上
//绘制到前台
e.Graphics.DrawImage(m_bmpOffscreen, 0, 0);
m_bmpOffscreen.Dispose();//效果不明显
gxOff.Dispose();//回收效果相当明显