1.CEGUI的属性系统非常方便非常强大,只需向PropertySet::setProperty函数中传人属性名和属性值,就可以设置了。方便的代价是效率,无论何种类型的属性值都是以字符串的形式传人的,在调用真正的属性设置函数进行设置时,再把字符串转化为真正的类型值。如果只是在初始化时,或者界面响应用户操作时,以这种形式进行设置,那也没什么大不了,但如果是在每帧里面都这样设,我感觉效率上有点吃不消。
CEGUI的动画系统就是基于它的属性系统的,所以动画系统可以动画所有属性,这一点非常强大,但就像上面说的,因为属性系统是基于字符串的,而动画每帧都要设置属性,这个效率,我表示怀疑。
不过动画系统设计的还是非常好的,代码很有美感。设计的总体思路除了上面说的以属性为基础外,还有就是动画的定义和动画实例分离。
动画的定义记录静态信息:该动画操控那些属性,每种操控的关键帧的时间位置是什么、值是什么。动画的实例记录动态信息,其实就是一个:该实例播放到什么时间点了。
在每一帧绘制的时候,将流失的时间传人动画实例中,计算当前播到什么时间点了,然后再把时间点传人动画定义中,找到时间点两边的关键帧,进行线性插值,获取该时间点对应的属性值,然后设置该属性就可以了。有些关键帧的值被设置为某些属性的值,动画开始时,会把这些关键帧值刷一遍,以同步到当时的那些属性的值,这些值也记录在动画实例中。
具体的动画系统还有很多小细节,想下次画一下UML图,详细的剖析一下,不过我现在有时想,这样详细研究剖析代码的收益和付出到底是否划得来。
2.Chaine