一种基于3d实时渲染的动画处理方法和系统的利记博彩app
【专利摘要】本发明公开了一种基于3D实时渲染的动画处理方法和系统,所述方法包括:动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内;采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听控制动画的执行;当在任务队列中添加动画时,通过单件模式获取所需添加的动画,并对其设置一唯一的名称;再将所述动画关联场景中的节点。其规避大量复杂的判断逻辑;令渲染场景与动画处理进行分离,有利于模块的复用,简化渲染场景的管理中场景节点的逻辑控制、并使得动画有了更简单灵活的动画延时开启管理;又进一步地通过Task任务队列管理,消除了多线程间交互带来的野指针导致系统死机的隐患。
【专利说明】一种基于3D实时渲染的动画处理方法和系统
【技术领域】
[0001]本发明涉及3D动画【技术领域】,尤其涉及一种基于3D实时渲染的动画处理方法和系统。
【背景技术】
[0002]随着近几年兴起的Iphone、Android智能手机,OpenGL ES开发绘制的嵌入式3D图形效果,越来越受到广大用户的青睐,3D UI (即3D界面)已然成为智能手机、智能电视的首选。但在嵌入设备中不管是3D游戏或者3D UI,都需要实时动画渲染的支持来增加画面的感染力和真实感。对于在智能平台中如何更有效率的、更方便的控制实时动画渲染是一个瓶颈问题。通常随着上层应用的需求,动画即需要满足实时渲染控制,又要满足设计效果,动画的逻辑会越写越复杂,最终变得难以扩充,难以维护。
[0003]目前,3D实时渲染主要存在以下问题:
(1)在3D渲染的中,动画的实现原理是:先依据动画算法改变渲染物体位置、大小、旋转或者物体自身的形态,然后再以改变的结果做为渲染的属性参数在下一帧渲染改变后状态,如果动画依附在渲染节点上,该节点隐藏后,就无法实现动画对渲染物体的自身属性的改变;
(2)动画挂在每一个渲染节点,即使动画任务结束后,(实现这个动画的函数)也会每一帧执行一次。执行函数时:需要开启函数栈、保存现场、出栈,传递函数参数效率低,在嵌入式紧缺的CPU资源下,无疑是一个巨大的浪费;
(3)目前渲染引擎的动画机制没有实现监听通知的功能,通常3D场景中会有执行完一个动画,再启动一个动画或者开启一个逻辑处理的需求,现行的动画管理结构中不存在消息分发的机制,导致场景管理的逻辑复杂化;
(4)多线程下动画的动态删除异常。渲染场景需要接受按键、鼠标等用户的输入,一般是事件线程,而与渲染线程相对独立,如果在事件线程触发了一个删除动画的操作,而在动画刚被删除完,渲染线程进行渲染,那么野指针就会导致系统的崩溃死机。
[0004]有鉴于此,现有技术有待改进和提闻。
【发明内容】
[0005]鉴于现有技术的不足,本发明目的在于提供一种基于3D实时渲染的动画处理方法和系统。旨在解决现有技术的书3D实时渲染中存在的逻辑复杂、资源浪费等问题。
[0006]本发明的技术方案如下:
一种基于3D实时渲染的动画处理方法,其中,包括以下步骤:
Sa、动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内;Sb、动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听控制动画的执行;
Sc、当在任务队列中添加动画时,通过单件模式获取所需添加的动画,并对其设置一唯一的名称,将所述动画关联场景中的节点。
[0007]所述的基于3D实时渲染的动画处理方法,其中,在所述步骤Sa之前还包括步骤Sal、将动画模块划分为共有部分和私有部分,其中,所述共有部分包括动画执行算法和动画类型,所述私有部分包括动画播放时间和动画执行状态。
[0008]所述的基于3D实时渲染的动画处理方法,其中,所述步骤Sb中Task任务队列管理,按照动画对象的优先级进行排序,并进一步包括以下步骤:
Sbl、遍历任务队列进行更新;
Sb2、按照需进行更新的动画的更新次数进行若干次迭代,直至更新次数为O ;
Sb3、判断动画是否要重新初始化,若是则重新初始化,否则将动画移除活动队列放入删除队列中。
[0009]所述的基于3D实时渲染的动画处理方法,其中,所述步骤Sa中的共用算法池内设置有关联位置类型的函数指针和关联渐变类型的函数指针。
[0010]所述的基于3D实时渲染的动画处理方法,其中,还包括步骤,当在任务队列中的动画的状态迁移时,执行:
Sd、动画初始化后添加到活动队列中,并向监听集合发送动画创建状态;
Se、事件完成后,将动画放入动画删除队列中,并向监听集合发送动画删除状态,判断是否要彻底删除所述动画;
Sf、接收用户发送的删除指令后,将动画放入动画结束队列中,彻底删除所述动画。
[0011]所述的基于3D实时渲染的动画处理方法,其中,所述步骤Sb中动画执行过程中,对动画状态按照百分比进行执行,其具体包括:取实际连续η个渲染帧的时间差值,再求取n-Ι个时间差的平均数做为实际动画每帧的时间增加量,其中,所述η为大于2的自然数。
[0012]—种基于3D实时渲染的动画处理系统,其中,包括:
初始化模块,用于进行动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内;
队列管理及监听模块,用于动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听,控制动画的执行;
动画添加模块,用于通过单件模式获取所需添加的动画,并对其设置一唯一的名称,并将所述动画关联场景中的节点。
[0013]所述的基于3D实时渲染的动画处理系统,其中,还包括:
动画划分模块,用于将动画模块划分为共有部分和私有部分,其中,所述共有部分包括动画执行算法和动画类型,所述私有部分包括动画播放时间和动画执行状态。
[0014]所述的基于3D实时渲染的动画处理系统,其中,所述步骤队列管理及监听模块中Task任务队列管理,按照动画对象的优先级进行排序,并进一步包括:
遍历单元,用于遍历任务队列进行更新;
迭代单元,用于按照需进行更新的动画的更新次数进行若干次迭代,直至更新次数为
O ;
删除单元,用于判断动画是否要重新初始化,若是则重新初始化,否则将动画移除活动队列放入删除队列中。
[0015]所述的基于3D实时渲染的动画处理系统,其中,所述初始化模块中的共用算法池内设置有关联位置类型的函数指针和关联渐变类型的函数指针。
[0016]有益效果:
本申请的基于3D实时渲染的动画处理方法和系统,规避大量复杂的判断逻辑;令渲染场景与动画处理进行分离,有利于模块的复用,简化渲染场景的管理中场景节点的逻辑控制、并使得动画有了更简单、灵活的动画延时开启管理;又进一步地通过Task任务队列管理,消除了多线程间交互带来的野指针导致系统死机的隐患。
【专利附图】
【附图说明】
[0017]图1为本发明的基于3D实时渲染的动画处理方法的流程图。
[0018]图2为图1中的动画场景管理器模块示意图。
[0019]图3为图1中动画状态按照百分比执行的示意图。
[0020]图4为本发明的基于3D实时渲染的动画处理系统的结构框图。
【具体实施方式】
[0021]本发明提供一种基于3D实时渲染的动画处理方法和系统,为使本发明的目的、技术方案及效果更加清楚、明确,以下对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0022]请参阅图1,其为本发明的基于3D实时渲染的动画处理方法的流程图。如图所示,所述基于3D实时渲染的动画处理方法,包括以下步骤:
51、动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内;
52、动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听控制动画的执行;
53、当在任务队列中添加动画时,通过单件模式获取所需添加的动画,并对其设置一唯一的名称,并将所述动画关联场景中的节点。
[0023]下面分别针对上述步骤进行具体描述。
[0024]所述步骤SI是将动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内。具体来说,为了保证动画管理类的唯一性,从设计上继承单例模式的模板类,本方法并不以全局变量的方式在程序启动前加载,而是作为场景管理的类成员,在场景管理类初始化时构建,能够保证在场景管理获取唯一的动画管理对象,降低了模块间的耦合度。初始化过程中,需要注册动画的共用执行算法,按照动画的类型,注册到一个容器中,即共用算法池。如图2所示,在本实施例中,动画场景管理器内包括的动画管理模块,在程序启动前加载,其包括:任务队列管理(下面会介绍到)、私有动画对象池(包括私有动画的对象指针)和共用算法池(设置有关联位置类型的函数指针和关联渐变类型的函数指针)。其中,注册预定义的动画类型以及动画执行的函数指针中,程序员也可以通过接口注册相应的类型和执行函数。在执行状态下,所有的动画都会调用其中的一种,或者不同类型的多种(算法,曲线、直线等)函数进行自我状态的更新。
[0025]所述步骤S2是在动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听控制动画的执行。其中,采用Task任务队列管理,能够把将有限状态机的状态迁移管理融入动画执行的过程中。具体来说,其可以解决多线程下动画的动态删除异常,非线程安全带来的异常情况。渲染场景需要接受按键、鼠标等用户的输入,一般是事件线程,而与渲染线程相对独立,如果在事件线程触发了一个删除动画的操作,而在动画被刚删除完,渲染线程即进行渲染,那么野指针就会导致系统的崩溃死机;而采用队列管理后,我们将事件线程要删除的动画,移动到动画删除队列中,这时不执行真正的delete操作,真正的删除需要对是否真正要删除后,移动到结束队列中,完成真正的delete操作,保证了数据的正确性,也解决了动画野指针带来的系统崩溃的问题(后续会介绍到)。进一步地,嵌入式平台的资源是非常紧缺的,动画挂在每一个渲染节点,即使动画任务结束后,也会每一帧执行一次。执行函数时:需要开启函数栈、保存现场、出栈,传递函数参数效率低,而且都是无用,在嵌入式紧缺的CPU资源下,无疑是一个巨大的浪费。通过状态队列管理机制,可以将超过生命周期的动画,移动到动画删除队列中,进行删除处理,避免函数的重复多次执行带来的不必要的资源浪费。
[0026]另外,建立相应的监听机制对动画进行监听,其降低了场景管理的逻辑复杂化。目前渲染引擎的动画机制没有实现监听通知的功能,通常3D场景中会有执行完一个动画,再启动一个动画或者开启一个逻辑处理的需求,现行的动画管理结构中不存在消息分发的机制,导致场景管理的逻辑复杂化。在本发明中,对动画的执行状态需要进行监听,从而触发不同的行为状态,例如:焦点切换时,需要启动一个位移的动画,使得焦点框从A点移动到B点,到达B点后,需要启动一个图标抖动的动画,这就需要动画状态队列管理来分发焦点动画的执行状态,通知控制程序是否启动图标抖动的动画。目前的实现方式为在渲染过程中通过if的条件逻辑判断,造成了动画控制逻辑的异常复杂,可维护性低,调试成本高。
[0027]当在任务队列中添加动画时,执行步骤S3,其具体包括:通过单件模式获取动画管理的对象,创建一个唯一名称的动画对象,关联场景中Node (即节点),添加到动画活动队列中,此时用户也可以将针对此动画对象的监听者注册到动画对象中,该对象在每帧执行时都通知监听者的状态,以方便用户实时针对动画的状态做出响应。另外,当在任务队列中的动画的状态迁移时,首先,动画初始化后添加到活动队列中,并向监听集合发送动画创建状态;事件完成后,将动画放入动画删除队列中,并向监听集合发送动画删除状态,判断是否要彻底删除所述动画;接收用户发送的删除指令后,将动画放入动画结束队列中,彻底删除所述动画。即删除队列中的动画不执行真正的delete操作,真正的删除需要对是否真正要删除进行判断为删除后,移动到结束队列中,做真正的delete操作,保证了数据的正确性,也解决了动画野指针带来的系统崩溃的问题。
[0028]进一步地,所述步骤S2中Task任务队列管理,按照动画对象的优先级进行排序,并进一步包括以下步骤:
521、遍历任务队列进行更新;
522、按照需进行更新的动画的更新次数进行若干次迭代,直至更新次数为O;
523、判断动画是否要重新初始化,若是则重新初始化,否则将动画移除活动队列放入删除队列中。
[0029]具体来说,在本实施例中,首先按照动画对象的优先级排序。排序后,优先级高的对象先得到执行。
[0030]在执行过程中,遍历任务队列进行更新,会判断动画任务是否要结束?即判断Finish函数中,判断是否存在更新次数,存在则进行迭代,迭代后,更新次数减1,进一步判断更新次数是否小于O,小于O执行Finish函数返回。结束后继续进入判断:动画是否要重新初始化,若是则重新初始化,否则将动画移除活动队列放入删除队列中,在本实施例中,通过特殊标记位来确定是否进行初始化:特殊标记位-1则无限循环,重新初始化开始;如果没有标志位则返回将动画对象移除活动队列,放入要删除队列中。在本实施例中,所述标志位采用整形枚举变量,其标识着动画执行循环类型:LOOP循环一直播放,Once执行一次,还有往复运动等。另外,对一组动画进行串行执行,一般的引擎的管理方式为:在逻辑中每帧判断是否动画结束,如果结束就启动下一个动画。缺陷是,如果串行的动画比较多,则在逻辑需要写很多的判断条件来划分动画执行状态。针对此情况,本发明设计一种方法,其基于人脑的认知和动画添加的先后次序,来进行动画的停止和启动,避免了逻辑层写大量的逻辑判断,减轻了程序开发与控制的复杂程度。其中,根据人脑认知,简单来说就是添加了 A任务、B任务、C任务后,我们便认为A任务执行完,执行B任务,B任务完后,再执行C任务;是一个按照添加顺序排列的串行执行的规则。具体的更新为:先获取组内所有的动画对象,并初始化第一播放的索引为O,在更新过程中,增加索引值,当索引值大于所有的动画对象的个数时,将整组动画添加到删除队列中。
[0031]更进一步地,在所述步骤SI之前还包括步骤S0、将动画模块划分为共有部分和私有部分,其中,所述共有部分包括动画执行算法和动画类型,所述私有部分包括动画播放时间和动画执行状态。因为,一般来说同一个动画可能会应用到多个节点上,如果为每个节点都创建一个相同类型的动画,就非常浪费嵌入式系统有限的系统资源。我们设计为上述动画模块的结构以解决动画公用的问题。
[0032]更进一步地,所述步骤S2中动画执行过程中,对动画状态按照百分比进行执行,其具体包括:取实际连续η个渲染帧的时间差值,再求取n-Ι个时间差的平均数做为实际动画每帧的时间增加量,其中,所述η为大于2的自然数。如图3所示,在本实施例中,η为6,渲染帧依次为1000、1003、1008、1012、1020和1025,其时间差值依次为3、5、4、8、5,如此一来,实际动画每帧的时间增加量即为(3+5+4+8+5)/ 5 =25/5 = 5。
[0033]本发明还提供了一种基于3D实时渲染的动画处理系统,如图4所示,其包括:初始化模块100、队列管理及监听模块200以及动画添加模块300。
[0034]其中,所述初始化模块100用于进行动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内;所述队列管理及监听模块200用于动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听控制动画的执行;所述动画添加模块300用于通过单件模式获取所需添加的动画,并对其设置一唯一的名称,并将所述动画关联场景中的节点。
[0035]进一步地,所述基于3D实时渲染的动画处理系统还包括:动画划分模块,所述动画划分模块用于将动画模块划分为共有部分和私有部分,其中,所述共有部分包括动画执行算法和动画类型,所述私有部分包括动画播放时间和动画执行状态。更进一步地,所述的基于3D实时渲染的动画处理系统,其中,所述步骤队列管理及监听模块中Task任务队列管理,按照动画对象的优先级进行排序,并进一步包括:
遍历单元,用于遍历任务队列进行更新;
迭代单元,用于按照需进行更新的动画的更新次数进行若干次迭代,直至更新次数为
O ; 删除单元,用于判断动画是否要重新初始化,若是则重新初始化,否则将动画移除活动队列放入删除队列中。
[0036]上述系统中的功能模块及单元都已经在方法步骤中进行了详细描述,这里就不再 赘述了 O
[0037]本发明的基于3D实时渲染的动画处理系统应用于智能电视开发平台3D渲染引擎中,解决以往引擎动画管理的缺陷,提高渲染效率,减少逻辑控制的复杂度,以及规避多线程间交互带来野指针导致系统死机的隐患。
[0038]下面通过一个具体的例子来说明其是如何进行动画创建和监听的。首先,通过单件模式获取动画管理的对象,创建一个唯一名称“focus”的动画对象,在本实施例中,所述动画的类型为直线飞行动画,插值方式为线性插值,插值公式为:
Value = A *radio + B* (1-radio),公式(I)
,A表示起点位置A, B表示结束位置;radio表示动画运行的百分比:起点是0%,终点是100%,动画运行期间介于0.0到1.0的值,用于插值计算。在本实施例中,动画时间为500ms,并将场景中Focus Node关联起来,之后将动画的指针添加到活动队列中,进行动画更新,更新时调用公共的线性插值函数,计算当前焦点框的位置,并将计算出的位置设置给Focus Node。
[0039]当进行动画监听时,添加监听者,监听focus动画对象的动画状态,当focus位移动画对象的状态从活动状态切换到删除状态时,启动B点位置focus的放缩动画,通过value值控制焦点框在B点从小到大变化;动画的类型为直线飞行动画,插值方式为线性插值,插值公式为
Value = Al *radio + BI*(1-radio);公式(2)
其中,Al为起点缩放大小,BI为结束位置的缩放大小,radio含义如同公式(I),同时,设置迭代标识为true。
[0040]综上所述,本发明的基于3D实时渲染的动画处理方法和系统,其中,所述方法包括:首先,动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内;动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听控制动画的执行;当在任务队列中添加动画时,通过单件模式获取所需添加的动画,并对其设置一唯一的名称;再将所述动画关联场景中的节点。其规避大量复杂的判断逻辑;令渲染场景与动画处理进行分离,有利于模块的复用,简化渲染场景的管理中场景节点的逻辑控制、并使得动画有了更简单、灵活的动画延时开启管理;又进一步地通过Task任务队列管理,消除了多线程间交互带来的野指针导致系统死机的隐患。
[0041]应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
【权利要求】
1.一种基于3D实时渲染的动画处理方法,其特征在于,包括以下步骤: Sa、动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内; Sb、动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听控制动画的执行; Sc、当在任务队列中添加动画时,通过单件模式获取所需添加的动画,并对其设置一唯一的名称,将所述动画关联场景中的节点。
2.根据权利要求1所述的基于3D实时渲染的动画处理方法,其特征在于,在所述步骤Sa之前还包括步骤Sal、将动画模块划分为共有部分和私有部分,其中,所述共有部分包括动画执行算法和动画类型,所述私有部分包括动画播放时间和动画执行状态。
3.根据权利要求1所述的基于3D实时渲染的动画处理方法,其特征在于,所述步骤Sb中Task任务队列管理,按照动画对象的优先级进行排序,并进一步包括以下步骤: Sbl、遍历任务队列进行更新; Sb2、按照需进行更新的动画的更新次数进行若干次迭代,直至更新次数为O ; Sb3、判断动画是否要重新初始化,若是则重新初始化,否则将动画移除活动队列放入删除队列中。
4.根据权利要求1所述的基于3D实时渲染的动画处理方法,其特征在于,所述步骤Sa中的共用算法池内设置有关联位置类型的函数指针和关联渐变类型的函数指针。
5.根据权利要求1所述的基于3D实时渲染的动画处理方法,其特征在于,还包括步骤,当在任务队列中的动画的状态迁`移时,执行: Sd、动画初始化后添加到活动队列中,并向监听集合发送动画创建状态; Se、事件完成后,将动画放入动画删除队列中,并向监听集合发送动画删除状态,判断是否要彻底删除所述动画; Sf、接收用户发送的删除指令后,将动画放入动画结束队列中,彻底删除所述动画。
6.根据权利要求1所述的基于3D实时渲染的动画处理方法,其特征在于,所述步骤Sb中动画执行过程中,对动画状态按照百分比进行执行,其具体包括:取实际连续η个渲染帧的时间差值,再求取n-Ι个时间差的平均数做为实际动画每帧的时间增加量,其中,所述η为大于2的自然数。
7.一种基于3D实时渲染的动画处理系统,其特征在于,包括: 初始化模块,用于进行动画场景初始化,并按照动画类型,注册动画的共用执行算法到一共用算法池内; 队列管理及监听模块,用于动画执行过程中,采用Task任务队列管理,并建立相应的监听机制对动画进行监听,并通过监听,控制动画的执行; 动画添加模块,用于通过单件模式获取所需添加的动画,并对其设置一唯一的名称,并将所述动画关联场景中的节点。
8.根据权利要求7所述的基于3D实时渲染的动画处理系统,其特征在于,还包括: 动画划分模块,用于将动画模块划分为共有部分和私有部分,其中,所述共有部分包括动画执行算法和动画类型,所述私有部分包括动画播放时间和动画执行状态。
9.根据权利要求7所述的基于3D实时渲染的动画处理系统,其特征在于,所述步骤队列管理及监听模块中Task任务队列管理,按照动画对象的优先级进行排序,并进一步包括: 遍历单元,用于遍历任务队列进行更新; 迭代单元,用于按照需进行更新的动画的更新次数进行若干次迭代,直至更新次数为O ; 删除单元,用于判断动画是否要重新初始化,若是则重新初始化,否则将动画移除活动队列放入删除队列中。
10.根据权利要求7所述的基于3D实时渲染的动画处理系统,其特征在于,所述初始化模块中的共用算法池内设置有关联位置类型的函数指针和关联渐变类型的函数指针。
【文档编号】G06T13/20GK103530898SQ201310003466
【公开日】2014年1月22日 申请日期:2013年1月6日 优先权日:2013年1月6日
【发明者】赵智宝, 卢伟超 申请人:Tcl集团股份有限公司