直接屏幕访问,DSA

来源:互联网 发布:师洋淘宝店叫什么 编辑:程序博客网 时间:2024/06/01 07:44

1.Series60设备必须知道当前活动的应用程序的外部的状况,例如:需要得到电话或消息的通知。这需要额外的处理过程来管理设备屏幕,会导致重绘性能降低。

 标准应用程序的重绘较少发生,然而对于图形密集型程序,如游戏,大量的重绘会出现更多的问题。

 直接屏幕访问,Direct Screen Access,用于与窗口服务器一道工作,用来管理外部事件,并且在访问屏幕时提供更佳的性能。

   从编程者角度看,唯一改变的就是图形上下文对象。

   用Windows Sever在屏幕上绘图需要进行上下文切换,这会减慢了绘图速度。越过Windows Sever就
避免了上下文切换,这样就可以直接访问屏幕,即:直接绘图。

2.Symbian OS有三种直接绘图:
(1).创建并使用CFbsScreenDevice

     CFbsScreenDevice 是一个图形设备,使用前需要为它创建一个CFbsBitGc图形描述表,它具有指向屏幕驱动器SCDV.DLL的地址。使用它绘图在屏幕上直接完成而不需要Windows Sever。Windows Sever不知道直接绘图绘图动作,别的窗口出现时直接绘图无法停止,从而有可能使屏幕杂乱。
(2).直接访问显存

     获得显存地址,直接通过指针访问显存对屏幕进操作比CFbsScreenDevice方法快,但其性能会受设备驱动器
的影响。在某些设备中,屏幕会根据显存的变化自动更新,而另一些设备的绘图必须要去激活才行。
显存地址只对目标硬件有效,在模拟器中我们使用临时位图及其数据地址。

 

   上面两种直接描画方法的一个共同的问题是窗口服务器不了解描画,因此它不能通知应用程序是否出现另一个窗口或者窗口组。 即使当应用程序失去焦点的时候得到一个事件,它们也不能停止直接描画,因为直接描画实在太快了,并且屏幕内容有可能被弄乱。 这可能发生在玩游戏的时候,突然有电话打进来的情况下。
(3).使用CdirectScreenAccess
     CdirectScreenAccess是一种较为安全(会得到Windows Sever的通知)的直接访问屏幕的的方法,速度也较快。所以很多时候都推荐用CdirectScreenAccess。当另一个窗口出现在应用程序窗口上时,CDirectScreenAccess从窗口服务器取得一个事件来中断描画。 CDirectScreenAccess然后调用MDirectScreenAccess派生类的AbortNow方法,这个方法必须被应用程序重载以便中断描画。 为了防止屏幕被弄乱,窗口服务器直到中断描画事件被处理的时候才画重叠窗口。

3.为了保证平滑绘制,在绘制到直接屏幕访问所提供的图形上下文以前,也应使用双缓冲。

4.RDirectScreenAccess类代表直接屏幕访问服务器的客户端类

   CDirectScreenAccess类通过为RDirectScreenAccess创建一个高优先级的活动对象“包装器”,隐藏了它的复杂性。

   MDirectScreenAccess类是混合接口类,指定了用于停止和重启直接屏幕访问的函数。

   下面的代码说明CDirectScreenAccess实例是如何构造的,以及直接描画支持是如何激活的。

iDrawer = CDirectScreenAccess::NewL(iEikonEnv->WsSession(), *iEikonEnv->ScreenDevice(), Window(), *this);
iEikonEnv->WsSession().Flush();
iDrawer->StartL();
iDrawer->ScreenDevice()->SetAutoUpdate(ETrue); 

  CDirectScreenAccess的NewL方法获得一个窗口服务器会话CONE的图形设备应用程序窗口一个到MDirectedScreenAccess导出类的指针作为参数。 在CDirectScreenAccess::StartL被调用来激活直接描画支持之前,客户端窗口服务器缓冲应该溢出。 为了能自动更新屏幕,屏幕设备的SetAutoUpdate方法需要使用ETrue参数,否则gc draw指令不会在模拟器中立即显示,而是在下一次冲刷(Flush)视窗服务器时才显示。 当直接描画支持激活的时候,CDirectScreenAccess产生一个CFbsBitGc图形上下文,可以被应用程序用来在屏幕上绘画。

iDrawer->Gc()->BitBlt( TPoint(0,0), iBitmap ); 

 

 

 

 

原创粉丝点击