1.如果正在使用系统图形上下文,清除上一帧,再构造一下帧,很容易产生屏幕闪烁。是因为屏幕是连续刷新的,在上一帧被清除或者下一帧被构造时,刷新均有可能发生。
另一个原因,如果一个游戏的图形由多个需要被经常更新的运动对象组成,窗口服务器的客户端缓冲可能被充满并且可能会在所有对象都更新的时候溢出,用户可能会发现屏幕出现闪烁。如果一个视图仍然在更新的时候,可能会出现闪烁或者其他不希望的效果。
2.双缓冲技术:在内存中创建位图,并用它在离屏状态构建下一帧,当完全准备好后,被快速地一次性绘制到屏幕上。在系统上下文上就避免了清除构造的耽搁。
3.为了在Series60上实现双缓冲,要综合运用位图,图形设备,图形上下文(GraphicsContext即Gc)三个部分
例 void CDoubleBufferedArea::ConstructL(TSize aSize,TDisplayMode aDisplayMode)
{
//创建离屏位图CFbsBitmap* iBufferBitmap,并设置位图的大小和显示模式
iBufferBitmap= new( ELeave ) CFbsBitmap();
iBufferBitmap->Create( aSize,aDisplayMode) );
//创建位图设备CFbsBitmapDevice* iBufferBitmapDevice
iBufferBitmapDevice= CFbsBitmapDevice::NewL(iBufferBitmap);
//创建图形上下文CFbsBitGc* iBufferGc
iBufferBitmapDevice.CreateContext(iBufferGc);
}
//使用iBufferGc绘制图形到离屏位图上。
iBufferGc.DrawRect(...);
iBufferGc.DrawText(...);
4.当使用自建的绘制函数代替CCoeControl::Draw()函数时,需要一些额外的维护操作
TRect rect(0,0,320,240);
void DrawFrame(TRect aRect)
{
Window().Invalidete(aRect);//使用绘制区域无效,窗口服务器才会重绘窗口的这个区域
ActivateGc();//激活系统图形上下文,以便对象继续生存,这样绘制才能实际发生。
Window().BeginRedraw(aRect);//告知窗口服务器试图绘制到屏幕的一部分
//使用iBufferGc绘制图形到离屏位图BufferBitmap上。
...
//使用屏幕的图形上下文传送离屏位图
CWindowGc& gc=SystemGc();
gc.BitBlt(TPoint(0,0),iBufferBitmap);
Window().EndRedraw();//通知窗口服务器可以为重绘进程清除它所创建的对象。
DeactivateGc();//禁止图形上下文
}
5.