Animation Example 注释

来源:互联网 发布:单片机51 编辑:程序博客网 时间:2024/05/22 05:48

该应用程序分为Client 端和Server端,Server端在和Window Server一样高的优先级的进程中直接创建,控制, 删除活动图片。对于在不同地址空间和线程中的对象,Client 端简单地按照一种方式acts,在Window Server通过Server端创建和控制图片时。Window Server 可以控制Redrawing images,但是仅仅允许有限的redraw rates. 利用时间调度器可以提供广泛的redraw rates选择。


活动的方形图片通过重复的绘制,擦除和再绘制表现为移动。redraws 可以在应用程序代码的直接控制下调用,通过时间调度器控制的活动对象的方式。然而,这会运行的在Window Server 的client-side端,它将会遭受Client 端线程较低的优先级。活动对象不是先取得的调度。这就意味着window update 也许会被另一个已经运行的client-side 活动对象所延迟或阻塞。这样就会产生一个变化的redraw rate,并且使得动画不连续,或则完全被阻止一段时间。

为了得到较平滑的动画,绘制过程可由Window Server自身与一些特殊的称为Animation Server的应用对象一起控制。Animation Server 运行在和Window Server 一样高的优先级里。它绘制,擦除和再绘制单个的静止图像,对动画的每一步一个,以Window Server决定的间隔。

 


Animation Server 有一个内置的时间调度器,它周期性的调用Animation Server(在Window Server上调用Animation function)中的函数。依次调用在Animation Server 中的Animation function,擦除动画序列中存在的图像并绘制下一个。这个过程按照Animation Server的时间调度器周期决定的速率反复进行。

 

一个GUI被创建。这依次创建一个animation client DLL 对象和image commander对象。这两个对象创建了一个animation server Dll 对象,该对象开始了这个方形在屏幕上的移动。

用户发出一个Reset命令,这个方形回归到左上角;用户关闭程序, 所有animation client 和server 对象被关闭并销毁。

RClientDll 和RImageCommander 提供client-side interfaces 给animation server,animation server 允许
user-interface代码直接地控制server-side端图片。


RClientDll 的实例是一个用于load 和 destroy animation server的对象。RImageCommander 的实例是一个通过animation server创建新的animated images 的对象。它之后用于动态地控制image 的行为。很有特色的是,每一个不同的animated images 需要一个RImageCommand实例去创建、使用和destroy它。RImageCommander 实例必须在RClientDll 对象之后被创建。

RClientDll 和RImageCommander类各自继承了Symbian OS 类RAnimDll 和RAnim的大部分功能。

RClientDll 类继承于Symbian OS 的RAnimDll 基类。每一个RClient的实例被连接至Window Server session ,Window Server session是类RWsSession的一个实例。就是当server被loaded时,animation server 与之交户影响的session.

RImageCommander类继承于Symbian OS 的RAnim类。每一个RImageCommander的实例附属于RClientDll类的一个实例。当RImageCommander对象被创建时,链接发生。

RImageCommander 从RAnim继承了三个重要的函数:Construct , Command, Close.
Construct 函数造成animation server 创建了一个新的animation image.
Command 函数传递一个整形操作码形式的‘command’给animation server.animation server 被编程去翻译'command'以任何适当的方式。典型的,一个command 会涉及动态地控制活动的image的行为。

Command 函数不返回一个值,是一个缓冲操作。没有返回值的事实意味着该函数应该用于 不会发生leave 或fail 的actions,因为如果action 出现fail的话,Server没有方法发送信号通知Client。action 是缓冲的事实意味着action请求的实现是异步的。这意味着会在请求和正在执行的action之间引入latency(等待时间)。

另一个RAnim函数----CommandReply,与Command函数很类似,但是它返回一个值并且不是缓冲的。由于这个函数返回一个值, 它可用于可能发生 fail的action。通过返回值, client-side端可以被告知任何failures,并相应地回应。action不是缓冲的事实意味着通常它直到请求已经被完成才会返回。由于这个原因,任何执行的行为相对地简短。

注意RAnim类的Command 和CommandReply函数是 protected,因此任何继承于它的类需要建立一个publidc的函数使得这两个函数公开地达到。

Close函数请求aniamtion server 释放所有属于某个对象的资源。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Animation Client 对象被构造;用于load 和启动animation server, animation server启动活动的方形动画。
从新设置动画,使得跳动的方形调返回左上角,再次移动。被关闭。
-------------------------------------------------------------------------------------------------------------------------------------------------------------Construction of an animation client:
(1)animation client DLL 对象创建 。传递给该对象一个Window Server session ,因此这个DLL能够把一个 animation server附属于这个Window Server session。

(2)RImageCommander实例被创建。构造器是被传递的一个对animation client Dll的引用。在本例中,是由(1)创建的RClientDll对象。

(3)load 一个server-side animation DLL,RClientDll 对象调用load。通过调用animation server DLL的文件名去load。注意不必要把DLL文件扩展名放在文件名里。animation server DLL 文件的位置在模拟器和目标机器是不同的。

(4)Window Server 被load。
(5)Window Server 创建一个animation DLL 对象。
(6)client-side RImageCommander 对象用于创建server-side CImage类的实例。这是通过调用ImageConstruct 来实现的。
(7)RImageCommander 调用RAnim::Construct;
(8)RImageCommander构建 image;
(9)促成Window Server 调用CServerDll::createinstanceL,并且传递一个表明创建什么类型的image的参数。CServerDll 的单个实例可用于创建多个aniamtion images.
(10)然后创建CImage的实例。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
已经创建了一个server-side image。用户也许希望给它传递命令。在本例中,ReSet命令用于在屏幕的左上角重新启动animation.这是通过ImageCommand 函数得到的。
(1)用户选择在菜单上选择ReSet命令。
(2)RImageCommander调用RAnim::Command.
(3)然后RImageCommander给Window Server发送一个消息;
(4)稍后,Window Server调用server-side CImage类的Command函数,并且传递一个表明何种命令的参数。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
最后,image 对象需要被destroy 并且animation server关闭。这是通过调用RImageCommander 和RClientDll对象上的Close 操作。
(1)RImageCommander::Close 被调用。
(2)RImageCommander通知Window Server去destroy相关的server-side CImage对象。
(3)Window Server destroy 相关的server-side CImage 对象。
(4)一旦 所有 server-side image 被destroy, server-side DLL可以被unloaded.这是通过调用RClientDll::Close实现的。
(5)RClientDll通知Window Server去unload 和 destroy server-side Dll.
(6)Window Server unload 并destroy server-side 端的animation Dll.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
animation server:
这部分描述了animation server两种可能的实现(Window Server 和 Timer)。他们之间的差别取决于一种机制,这种机制用于决定单个的animation序列中的image何时被drawn.


第一个实现具有这样的局限性--image 不能以每秒大约两次的速率重新绘制,Window Server limitation 设置该速率。第二个实现较第一个复杂,但是具有 这样的优势,重绘速率的上限较大。


两个实现合并成两个类,CServerDll和CImage。第二个实现有两个额外的timer类,CTimeoutTimer和MTimeoutNotify.

CImage 的一个实例对应于屏幕上一个特定的animated image。在本例中,它计算bouncing square的位置,并绘制该bouncing square。

CServerDll的一个实例是一个‘factory’ 对象,该对象创建CImage 的一个新的实例。这两个类给Window Server两个特定的接口,它们继承于两个Symbian OS 类CAnimDll和CAnim。CreateCAnimDll 函数 用于创建CServerDll 对象。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
重绘速率受限的Animation server:
对于server-side animation 工作,有四个主要的任务必须列示:
(1)Load 并start animation server端;
(2)Start这个bouncing square动画;
(3)ReSet 运行的动画,使得这个bouncing square调回左上角,并再次离开。
(4)关闭动画和animation server。
这部分关注于一旦animation server被创建,将会发生什么。下面说明了从CImage对象被创建到对Animation 的第一次调用的发生。
(1)在WindowServer端,SetSync被调用。指定了image 的重绘速率。
(2)一段特定时间后, 取决于重绘速率,Window Server 端调用CImage 对象的Animate 函数。
(3)调用invalidate函数,该函数告知WindowServer 屏幕需要被更新。
(4)Window Server 调用所有已经无效的animated objects上的Redraw
(5)pen colour 设置成白色。
(6)Redraw 函数利用白色的rectangle覆写动画的上一个位置。这迅速地擦除前面的图片。
(7)pen colour 设置成黑色。
(8)在由(2)计算出的新位置绘制矩形。

Step(2)----(8)以重绘速率重复进行。由于Window Server 的有限性,它最大速率是每秒两次。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
重绘速率较少受限的Animation Server:
第二个实现,其重绘速率有较高上限,集结额外一些成员函数和变量在CImage中,并集结两个额外的类,CTimeoutTimer和MTimeoutNotify。

CTimeoutTimer 的实例是一个活动对象,它在一个特定时间后,会暂停片刻。当它暂停时,在‘observer’上调用TimedOut 函数。在timer 创建时,timer observer必须向timer注册。对象也必须是继承于mixin 类MTimeoutNotify的类的一个实例。
这里,注册的observer是CImage对象,因此timer调用TimedOut。这 依次调用Aniamte并使Redraw生效。
(1)CImage 对象在Window Server上调用SetSync,带一个参数ESyncNone.ESyncNone 列明Window Server 不应在CImage 上初始化Animate.
(2)CImage 对象创建CTimeoutTimer 对象。
(3) 然后 调用After函数,在一段规定时间后该函数通知它在CImage上调用TimeOut。
(4)在一段规定时间后,timer在CImage上调用TimedOut.
(5)CImage调用After 函数去安排下一次重绘时期。
(6)CImage 调用Window Server 的Animate 函数。
(7) 这引起CImage::Animate 被调用。注意:由于 Winow Server 需要进行一些初始化,直接调用CImage ::Animate 是不可能的。
(8)Animate 首先计算bouncing square 的位置,然后调用animation Invalidte 函数,告知Window Server屏幕需要更新。
(9)Window Server 调用所有已经无效的animated objects上的Redraw
(10)pen colour 设置成白色。
(11)Redraw 函数利用白色的rectangle覆写动画的上一个位置。这迅速地擦除前面的图片。
(12)pen colour 设置成黑色。
(13)在由(2)计算出的新位置绘制矩形。

一段规定时间之后,timer 在CImage上调用TimeOut。然后重绘过程反复进行。通过改变计时器周期,
是能改变square重绘的时间。。。。。。。。。。因为没有充分的时间去绘制新的位置在square移动之前。注意:模拟器和目标机器的timer resolution是 不同的:对于模拟器是一秒1/10,而对于目标机器是一秒1/64。同样,与模拟器相比,目标机器能够应对一个较低的timer周期(例如: 较高的重绘频率)在开始绘制图像有困难之前。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Animation client class R-Type construction:

Animation application 一个稍微不同寻常的特征是:animation client DLL 和image commander 类都是R-Type类。这意味着这些类控制的对象实际上在别处拥有的,既然被Window Server。由于这些类是R-Type,他们的实例被containing object的构造函数自动地构建。然而,为了正确地构造,构造函数需要带某些参数。参数传递给Constructor 通过明确地调用R-Type类的构造函数在拥有的类的构造函数表中。其中之一的例子是GUI application UI 构建animation client.

Constructor 执行下面的任务:
(1)为UI调用基类的Constructor;
(2)为animation client DLL 类调用Constructor,传递一个对Window Server session 的引用。
(3)为animation client image commander类调用Constructor,传递一个对animation client Dll 对象(由前面一步构建)的引用。

这些对象需要以避免调用默认构造函数(无法正确地初始化这些对象)的方式构造,两个R类对象构造的顺序是很重要的,由于image commander DLL 的Construction 以client Dll 作为一个参数。然而,Construction 的顺序是由类内定义的成员变量的顺序决定的,不是Constructor 初始化表。因此,类的定义必须正确的顺序声明这些变量,为了Construction 正确地工作。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Animation client classes R-Type destruction :
由于Animation Client 类是R-Type,被拥有它们的类自动地destroyed,没有必要在destructor中显示地destroy 它们。然而,必须去释放它们用到的资源,当被UI的destructor执行时,通过调用每一个R-Type 对象的Close 函数执行。

原创粉丝点击