纳金网
标题:
第五章、行为引擎(CK2)
[打印本页]
作者:
会飞的鱼
时间:
2011-10-19 16:57
标题:
第五章、行为引擎(CK2)
(一)概述
行为引擎执行行为处理,是Virtools的中心构件。也叫做CK2(此后,你会在界面上经常CK,如CKID, CKClass等等),行为引擎使Virtools如此的灵活。
CK2做什么的?CK2执行你的作品,处理场景和管理所有在用户和作品元素之间的交互。CK2也处理作品的元素,使它们附加上一个行为,即行为对象。
给定帧内,一旦所有的行为被处理,CK2提供适当的信息给渲染引擎(CK2-3D),所以交互作用的结果能被显示给用户。
当一个作品被播放时,连续执行下面的任务。
注意:为了适当地解释下述一系列任务(算法),你必须注意陈述中的数字标号。优先序列任务中必须执行的子任务在一个同样的主数字标号下。例如,任务3.1.1陈述了“每个被附加到开始的BB还没有被激活,激活的BB具有最高的优先权。”这意味着所有的子任务(3.1.1.1,3.1.1.2和他们的子任务)必须先运行来完成任务3.1.1。任务的"For each"意思是那个任务(或者所有子任务)被重复的执行,直到必需的条件-所有附加到开始的
BBs
已经被激活-出现。
1.对于层级中的每个活性元素,以优先权顺序分类来建立元素的处理顺序。
2.对于附加了脚本的元素,以优先权顺序分类来建立元素的脚本处理顺序。
3.对于每个元素,从最高优先权到最低优先权,保持处理最高优先权的元素。
3.1对于每个附加上当前运行元素的脚本,保持处理最高优先权的脚本。
3.1.1对于每个没有被激活但附加上开始的 BB,优先权最高的BB被激活。
3.1.1.1处理BB,计算pOuts,激活所有的bOuts和发送消息。
3.1.1.2对于每个bOut,激活一个行为链接。
3.1.1.2.1如果行为链接延迟为0,激活并运行下一个BB。以这种方式直到所有在脚本中的
BBs
被处理,或者行为动作链接延迟比0大。
3.1.1.2.2如果行为链接延迟大于0,在帧内增加BB到堆栈用于处理。例如,如果链接延迟是1,BB在下一帧被处理。如果链接延迟是n,脚本激活,BB在当前帧后的第n帧执行。
注意:层级总是激活状态,最高优先权的元素存在于每一帧中。在余下任务中,忽视所有未激活的元素。
当前帧连续处理,直到所有的BB被运行或者链接延迟大于0。
当所有的行为处理完成,CK2提供信息给渲染引擎在屏幕上渲染图象,图象被渲染,所有大于0的链接延迟减1,行为处理再次开始。
通过激活脚本流程图中的轨迹模式,你能够观察到行为处理起作用。当作品被播放时,激活顺序和BB运行在脚本流程图中以红色高亮显示。
要点:BB内部循环(例如等待消息BB或者停止/启动BB),BB的执行顺序不遵循上述的算法大纲。代之的是,执行顺序受分派给BB的优先权控制。如果作者没有指定优先权,执行顺序是不确定的。所以例如,如果有两个可能激活的流程,并在BB上没有优先权,预知那个流程先激活是不可能的。当下一个流程被处理,激活的流程继续运行直到完成。因此,为了保证在一个脚本内连续执行,指定BB内部循环的优先权关系非常重要。
(二)行为循环
当一系列BB通过blinks链接(某种意义,以重复方式激活或者触发了
BBs
),形成了一个行为循环。
换句话说,行为循环是重复操作的直观表示。重复操作也可以被认为是反复和重复处理一个操作。
在重复操作执行中,重要的是要保证限制重复的次数。换句话说,需要一个机制来保证一个操作不被不确定地重复。
Virtools Dev在脚本流程图中,通过“最大行为重复”,定义在一个单独帧内完成的最大操作数量。
注意:最大的行为重复缺省值是8000。这个最大的行为重复缺省值被存储在作品中。
只要循环不经常激活或者在一帧内的重复次数不超过行为重复的最大数值,那么行为循环的累计延迟有可能是0。如果在一个帧内的重复次数超过了最大的行为重复数,比如发生了无限循环,那么行为引擎马上停止工作。
例如,阵列和组通常循环延迟为0,所以在阵列和组内的所有元素工作在一个单帧内。
然而,要切记,要划分进程处理每帧所需的最小值(维持合适的帧速率)。因此,除非必需,一个行为循环在至少一个帧中应当有一个积累延迟。实际的行为循环延迟值在0到32767范围内都是可能的。
注意:循环BB(例如Timer)是基于时间的,需要每帧内有一个积累循环延迟,或者BB自动改变为基于帧的处理。
(三)优先级
一旦CK2已经分类哪些元素激活,CK2怎样知道哪个元素最先处理。答案是元素的优先权:最高优先权最先处理。
你能给行为对象、脚本和BB设置优先级。行为对象和脚本的优先级在层级管理器中建立,BB的优先级在脚本流程图中建立。
如果一个或者更多的元素有相同的优先级,那么处理的顺序是随机的。
图1-9 优先级
看图1-9,注意Counters和Priority都连接到开始并且帧延迟为0。因此,行为引擎决定哪个BB首先被激活,取决于每个BB的优先级。
BB名字 进程优先级
All But One 50
Counter(顶部) 20
Counter(底部) 0
第一帧的处理顺序如下:
1.All But One优先级为50:随着开始,顶部的bIn(In 0)被激活,然后下面的二个bOuts(Out1和Out2)被激活。
2.顶部的Counter(优先级为20):计数2000次以后,触发All But One(沿着0帧链路延迟路径)。
3.All But One(优先级为50):中间的bIn(In 1) 随着开始被激活,然后外面的二个bOuts(Out0和Out2) 被激活。
4.低部的Counter(优先级为0):计数2000次以后,触发All But One(沿着0帧链路延迟路径)。
5.All But One(优先级为50):最低处的的bIn(In 2) 随着开始被激活,然后最上面的二个bOuts(Out0和Out1)被激活。
在第一帧结束时,All But One已经被启动了三次—也许不是预期的结果。
注意:通常规则是,当多样性的
BBs
激活同样的BB时,接受BB比能激活的
BBs
有较低的优先级,确保优先的
BBs
能被首先处理。也可以参考关于内部循环
BBs
和进程循环。
作者:
菜刀吻电线
时间:
2012-2-1 23:30
发了那么多,我都不知道该用哪个给你回帖了,呵呵
作者:
奇
时间:
2012-3-18 23:32
不错哦,谢谢楼主
作者:
tc
时间:
2012-3-22 23:26
顶!学习了!阅!
作者:
C.R.CAN
时间:
2012-4-13 23:21
赞一个,哈哈
作者:
晃晃
时间:
2012-4-25 23:20
我来顶个
作者:
C.R.CAN
时间:
2012-6-11 23:18
我看看就走,你们聊!
作者:
晃晃
时间:
2012-8-4 01:38
好`我顶``顶顶
作者:
晃晃
时间:
2012-12-6 23:21
提醒猪猪,千万不能让你看见
作者:
晃晃
时间:
2013-1-30 23:24
好可爱的字,学习了
作者:
晃晃
时间:
2013-2-9 23:32
加精、加亮滴铁子,尤其要多丁页丁页
作者:
晃晃
时间:
2013-2-13 23:26
既来之,则看之!
欢迎光临 纳金网 (http://rs.narkii.com/club/)
Powered by Discuz! X2.5