一种动画播放方法及装置转让专利

申请号 : CN201210079407.9

文献号 : CN103325398B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 周笑宇李昶博

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明实施例公开了一种动画播放方法,该方法包括:在动画播放的主线程之外启动一独立计时线程;所述计时线程被唤醒并确定开始播放动画帧时,计算动画当前的播放进度,并根据该播放进度播放动画帧;在所述动画帧播放完毕后计算计时线程需要休眠的时间并进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。本发明实施例还公开了一种动画播放装置,该方法及装置能够避免动画播放的卡顿现象,提高动画播放的效果。

权利要求 :

1.一种动画播放方法,其特征在于,该方法包括:

在动画播放的主线程之外启动一独立计时线程;

所述计时线程被唤醒并确定开始播放动画帧时,判断是否需要丢弃当前帧;

如果判断不需要丢弃当前帧,则计算动画当前的播放进度,并根据该播放进度播放动画帧;

如果判断需要丢弃当前帧,则丢弃当前帧;

在所述动画帧播放完毕后,计算计时线程需要休眠的时间并进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。

2.如权利要求1所述的动画播放方法,其特征在于,所述确定开始播放动画帧包括:判断当前动画的所有动画帧是否全部播放完毕,若是则结束播放,否则确定开始播放动画帧。

3.如权利要求1所述的动画播放方法,其特征在于,所述判断是否需要丢弃当前帧,包括:根据当前帧的帧序号、理论帧间隔及动画开始时间,计算当前帧理论开始时间以及下一帧的理论开始时间;

如果当前时间在所述当前帧的理论开始时间与下一帧的理论开始时间之间,则判断不需要丢弃当前帧;

如果当前时间超过下一帧的理论开始时间,则判断需要丢弃当前帧。

4.如权利要求3所述的动画播放方法,其特征在于,所述计算动画当前的播放进度包括:根据当前时间和所述动画开始时间,计算动画当前已播放时间;

根据所述动画当前已播放时间和动画总时间,得到当前动画的播放进度。

5.如权利要求3所述的动画播放方法,其特征在于,该方法进一步包括:如果当前时间早于当前帧的理论开始时间,则不丢弃当前帧,也不进行当前帧的播放,直接计算计时线程需要休眠的时间并进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。

6.如权利要求3~5中任一项权利要求所述的动画播放方法,其特征在于,所述计算需要休眠的时间,包括:如果当前时间大于等于所述下一帧的理论开始时间,则休眠时间为0,如果小于所述下一帧的理论开始时间,则休眠时间为所述下一帧的理论开始时间减去当前时间。

7.一种动画播放装置,其特征在于,该装置包括:

计时线程模块,用于在动画播放的主线程之外启动一独立计时线程;

动画播放模块,用于在所述计时线程被唤醒并确定开始播放动画帧时,计算动画当前的播放进度,并根据该播放进度播放动画帧;

休眠模块,用于在所述动画帧播放完毕后计算计时线程需要休眠的时间并令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒;

其中,所述动画播放装置进一步包括:

丢帧模块,用于在所述计时线程被唤醒,且所述动画播放模块确定开始播放动画帧时,判断是否需要丢弃当前帧;如果判断需要丢弃当前帧,则丢弃当前帧;

所述动画播放模块进一步用于在所述丢帧模块判断不需要丢弃当前帧时,计算动画当前的播放进度,并根据该播放进度播放动画帧;

所述休眠模块进一步用于在所述丢帧模块判断需要丢弃当前帧时,计算计时线程需要休眠的时间并令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。

8.如权利要求7所述的动画播放装置,其特征在于,所述动画播放模块包括:播放确认单元,用于判断当前动画的所有动画帧是否全部播放完毕,若是则结束播放,否则确定开始播放动画帧;

进度确定单元,用于在所述播放确认单元确定开始播放动画帧,且所述丢 帧模块判断不需要丢弃当前帧时,根据当前时间和所述动画开始时间计算动画当前已播放时间;根据所述动画当前已播放时间和动画总时间,得到当前动画的播放进度;

播放单元,用于根据所述播放进度对应的理论播放位置播放动画帧。

9.如权利要求8所述的动画播放装置,其特征在于,所述丢帧模块包括:计算单元,用于在所述计时线程被唤醒,且所述动画播放模块确定开始播放动画帧时,根据当前帧的帧序号、理论帧间隔及动画开始时间,计算当前帧理论开始时间以及下一帧的理论开始时间;

判断单元,用于在当前时间在所述当前帧的理论开始时间与下一帧的理论开始时间之间时,判断不需要丢弃当前帧;在当前时间超过下一帧的理论开始时间时,判断需要丢弃当前帧;

丢帧单元,用于在所述判断单元判断需要丢弃当前帧时,将当前帧丢弃。

10.如权利要求9所述的动画播放装置,其特征在于,所述判断单元进一步用于,在当前时间早于当前帧的理论开始时间时,判断不丢弃当前帧;

所述休眠模块直接计算计时线程需要休眠的时间并进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。

11.如权利要求10所述的动画播放装置,其特征在于,所述休眠模块包括:休眠时间计算单元,用于计算休眠时间,如果当前时间大于等于所述下一帧的理论开始时间,则休眠时间为0,如果小于所述下一帧的理论开始时间,则休眠时间为所述下一帧的理论开始时间减去当前时间;

休眠控制单元,用于在所述动画帧播放完毕,或丢弃当前帧,或者既没有丢弃当前帧也没有进行动画帧的播放时,令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。

说明书 :

一种动画播放方法及装置

技术领域

[0001] 本发明涉及计算机技术领域,特别涉及一种动画播放方法及装置。

背景技术

[0002] 传统动画采用主线程计时器(timer)方式来播放,该方案通过设置一个timer实现动画帧的定时回调,具体动画播放过程如图1所示,包括如下步骤:
[0003] 步骤101,启动一个timer,假设Timer的间隔为T-Interval,T-Interval=动画总时间/动画总帧数;
[0004] 步骤102,首先记录完整动画开始的时间T-AniStart;
[0005] 步骤103,timer被触发;
[0006] 步骤104,判断动画是否播放完毕,若是,则结束播放,否则进入步骤105;
[0007] 步骤105,进行动画渲染,即具体动画帧的播放;
[0008] 步骤106,记录当前帧的开始时间T-Frame;
[0009] 步骤107,检测是否需要丢帧;
[0010] 具体地,先计算最近一次T-Frame到当前时间T-Now所消耗的时间T-Elapse(第一帧不执行此步骤),然后进一步计算出下一次timer触发时,应该播放第几帧,公式为(T-Now–T-AniStart)/T-Interval+T-Elapse/T-Interval(此公式假定下一次Timer回调的周期与本次相同),若计算出应该播放的帧数(N)和当前实际播放的帧数(M)相差大于1,既M-N>1,则判断需要丢帧,进入步骤108,否则进入步骤109;
[0011] 步骤108,丢帧;具体地,若上述丢帧计算结果为应该播放第N帧,而当前实际播放到第M帧,则将M+1~N的帧全部丢弃。
[0012] 步骤109,本次timer执行完毕,返回步骤103。
[0013] 上述方法假设timer总能按时回调,但实际运行过程中,主线程受到CPU繁忙程度和线程池中线程数量的双重影响,实际上主线程中启动的timer无法总是按时回调,此时就导致了动画播放的卡顿、不流畅,或是播放速度不均匀,或是动画严重拖慢甚至卡死,影响了最终的动画播放效果。

发明内容

[0014] 有鉴于此,本发明提供了一种动画播放方法及装置,能够避免动画播放的卡顿现象,提高动画播放的效果。
[0015] 为达上述目的,本发明的技术方案具体是这样实现的:
[0016] 一种动画播放方法,该方法包括:
[0017] 在动画播放的主线程之外启动一独立计时线程;
[0018] 所述计时线程被唤醒并确定开始播放动画帧时,判断是否需要丢弃当前帧;
[0019] 若判断不需要丢弃当前帧,则计算动画当前的播放进度,并根据该播放进度播放动画帧;
[0020] 如果判断需要丢弃当前帧,则丢弃当前帧;
[0021] 在所述动画帧播放完毕后计算计时线程需要休眠的时间并进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0022] 较佳地,所述确定开始播放动画帧包括:
[0023] 判断当前动画的所有动画帧是否全部播放完毕,若是则结束播放,否则确定开始播放动画帧。
[0024] 较佳地,所述判断是否需要丢弃当前帧,包括:
[0025] 根据当前帧的帧序号、理论帧间隔及动画开始时间,计算当前帧理论开始时间以及下一帧的理论开始时间;
[0026] 如果当前时间在所述当前帧的理论开始时间与下一帧的理论开始时间之间,则判断不需要丢弃当前帧;
[0027] 如果当前时间超过下一帧的理论开始时间,则判断需要丢弃当前帧。
[0028] 较佳地,所述计算动画当前的播放进度包括:
[0029] 根据当前时间和所述动画开始时间计算动画当前已播放时间;
[0030] 根据所述动画当前已播放时间和动画总时间,得到当前动画的播放进度。
[0031] 较佳地,所述计算需要休眠的时间,包括:
[0032] 如果当前时间大于等于所述下一帧的理论开始时间,则休眠时间为0,如果小于所述下一帧的理论开始时间,则休眠时间为所述下一帧的理论开始时间减去当前时间。
[0033] 一种动画播放装置,该装置包括:
[0034] 计时线程模块,用于在动画播放的主线程之外启动一独立计时线程;
[0035] 动画播放模块,用于在所述计时线程被唤醒并确定开始播放动画帧时,计算动画当前的播放进度,并根据该播放进度播放动画帧;
[0036] 休眠模块,用于在所述动画帧播放完毕后计算计时线程需要休眠的时间并令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒;
[0037] 其中,所述动画播放装置进一步包括:
[0038] 丢帧模块,用于在所述计时线程被唤醒,且所述动画播放模块确定开始播放动画帧时,判断是否需要丢弃当前帧;如果判断需要丢弃当前帧,则丢弃当前帧;
[0039] 所述动画播放模块进一步用于在所述丢帧模块判断不需要丢弃当前帧时,计算动画当前的播放进度,并根据该播放进度播放动画帧;
[0040] 所述休眠模块进一步用于在所述丢帧模块判断需要丢弃当前帧时,计算计时线程需要休眠的时间并令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0041] 较佳地,所述动画播放模块包括:
[0042] 播放确认单元,用于判断当前动画的所有动画帧是否全部播放完毕,若是则结束播放,否则确定开始播放动画帧;
[0043] 进度确定单元,用于在所述播放确认单元确定开始播放动画帧,且所述丢帧模块判断不需要丢弃当前帧时,根据当前时间和所述动画开始时间计算动画当前已播放时间;根据所述动画当前已播放时间和动画总时间,得到当前动画的播放进度;
[0044] 播放单元,用于根据所述播放进度对应的理论播放位置播放动画帧。
[0045] 较佳地,所述丢帧模块包括:
[0046] 计算单元,用于在所述计时线程被唤醒,且所述动画播放模块确定开始播放动画帧时,
[0047] 根据当前帧的帧序号、理论帧间隔及动画开始时间,计算当前帧理论开始时间以及下一帧的理论开始时间;
[0048] 判断单元,用于在当前时间在所述当前帧的理论开始时间与下一帧的理论开始时间之间时,判断不需要丢弃当前帧;在当前时间超过下一帧的理论开始时间时,判断需要丢弃当前帧;
[0049] 丢帧单元,用于在所述判断单元判断需要丢弃当前帧时,将当前帧丢弃。
[0050] 较佳地,所述判断单元进一步用于,在当前时间早于当前帧的理论开始时间时,判断不丢弃当前帧;
[0051] 所述休眠模块直接计算计时线程需要休眠的时间并进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0052] 较佳地,所述休眠模块包括:
[0053] 休眠时间计算单元,用于计算休眠时间,如果当前时间大于等于所述下一帧的理论开始时间,则休眠时间为0,如果小于所述下一帧的理论开始时间,则休眠时间为所述下一帧的理论开始时间减去当前时间;
[0054] 休眠控制单元,用于在所述动画帧播放完毕,或丢弃当前帧,或者既没有丢弃当前帧也没有进行动画帧的播放时,令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0055] 由上述技术方案可见,本发明的这种动画播放方法及装置,采用计时线程的线程等分cpu时间片的特性来保证计时线程总会在规定的时刻从等待中醒来,同时保证计时线程中仅处理独立的动画事件,不受其他事件的干扰,这样采用独立计时线程来代替timer回调,保证动画的流畅性和不可打断性,从而避免动画播放的卡顿。

附图说明

[0056] 图1为现有动画播放方法流程图;
[0057] 图2为本发明实施例的一种动画播放方法的流程图;
[0058] 图3为本发明实施例的另一种动画播放方法的流程图;
[0059] 图4为本发明实施例的动画播放装置结构示意图;
[0060] 图5为本发明实施例的动画播放模块结构示意图;
[0061] 图6为本发明实施例的丢帧模块结构示意图;
[0062] 图7为本发明实施例的休眠模块结构示意图。

具体实施方式

[0063] 为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。
[0064] 本发明主要是对现有timer定时回调的部分进行了改进,提出了线程计时的方法,其原理是开启一个独立的计时线程,采用线程等分cpu时间片的特性来保证计时线程总会在规定的时刻从休眠等待中醒来,同时令计时线程中仅处理独立的动画事件,不受其它事件干扰,这样采用独立计时线程来代替timer,从原理上保证动画的流畅性和不可打断性,从而避免动画播放的卡顿。
[0065] 具体地,本发明一种实施例的动画播放方法如图2所示,包括如下步骤:
[0066] 步骤201,在动画播放的主线程之外启动一独立的计时线程;
[0067] 独立计时线程中只进行动画播放事件,不执行其它事件。
[0068] 步骤202,计时线程被唤醒并确定开始播放动画帧时,判断是否需要丢弃当前帧,如果是,则进入步骤204,否则进入步骤203;
[0069] 确定开始播放动画帧,即判断当前动画是否已经播放完毕,如果播放完毕则结束播放,否则确定开始播放动画帧。
[0070] 具体是否需要丢帧的判断方法可以是通过检测当前的时间T-Now,以及要播放的当前帧的帧序号N,通过动画开始播放时间(T-AniStart)+N×两动画帧之间的理论帧间隔T-Interval(T-Interval=动画总时间/动画总帧数),计算出当前帧应当在何时播放,即当前帧的理论开始时间T-N;以及下一帧的理论开始时间T-N+1;
[0071] 如果当前时间T-Now在T-N~T-N+1之间,则判断不需要丢弃当前帧,应该正常播放,如果当前时间T-Now超过了T-N+1,则应当丢弃当前第N帧;
[0072] 步骤203,计算动画当前的播放进度,并根据该播放进度播放动画帧;
[0073] 具体地,可以根据当前时间T-Now和所述动画开始时间计算动画当前已播放时间;再根据动画当前已播放时间和动画总时间,即可得到当前动画的播放进度;播放动画时,可以根据该播放进度,直接从该播放进度对应的理论播放位置播放动画帧。
[0074] 步骤204,计算计时线程需要休眠的时间并进入休眠等待,直至休眠时间到达,计时线程被再次唤醒。
[0075] 具体计算方法是,如果当前时间T-Now大于等于所述下一帧的理论开始时间T-N+1,则休眠时间为0,如果小于所述下一帧的理论开始时间T-N+1,则休眠时间为所述下一帧的理论开始时间减去当前时间即(T-N+1)-(T-Now)。
[0076] 上述流程中,步骤202~204均在计时线程中执行,并且计时线程不执行其它事件,从而保证计时线程能够被精确的唤醒而不受干扰。
[0077] 本发明另一实施例的动画播放流程如图3所示,包括如下步骤:
[0078] 步骤301,在动画播放的主线程之外启动一独立的计时线程;
[0079] 步骤302,计时线程被唤醒;
[0080] 步骤303,判断动画帧是否全部播放完毕,如是,则进入步骤304,否则进入步骤307;
[0081] 步骤304,记录当前帧的开始时间点;
[0082] 当前帧开始的时间点T-FrameStart作为当前时间被记录下来;
[0083] 步骤305,判断是否需要丢帧,如是则进入步骤308,否则进入步骤306;
[0084] 具体判断方法如上述步骤22所述,这里不再赘述,其中T-FrameStart作为当前时间。另外,在特殊情况下,如T-FrameStart早于当前帧的理论开始时间,则可以不丢弃当前帧,但也不进行后续动画帧的播放,而是直接进入步骤309计算休眠时间,由于这次计时线程的唤醒没有执行播放动画帧的动作,因此在计算休眠时间时,若本次计时线程唤醒应当播放的当前帧是第N帧,则下一帧仍然是第N帧,当前帧的序号应该取N-1帧的值。
[0085] 步骤306,计算当前动画播放进度;
[0086] 具体计算方法是:计算步骤304记录的T-FrameStart与动画开始时间点T-AniStart的差,然后将该差值除以动画总时间T-Total,得到当前动画的播放进度;该播放进度可以通过一百分比数值表示,如30%。
[0087] 步骤307,从动画播放进度位置进行动画渲染;
[0088] 假设步骤306的计算结果是50%,且当前动画共有2N帧,那么就直接从第N帧开始进行动画渲染。
[0089] 步骤308,丢弃当前帧。
[0090] 步骤309,计算计时线程需要休眠的时间并进入休眠等待,直至休眠时间到达时,进入步骤302。
[0091] 具体休眠时间的计算方法是:假设当前帧为第N帧,动画开始的时间为T-AniStart,理论帧间隔为T-Interval,当前时间为T-Now,下一帧的理论开始时间为T-N+1;则T-N+1=T-AniStart+T-Interval×(N+1),如果T-Now大于等于T-N+1,则休眠0ms,如果小于T-N+1,则休眠T-N+1–T-Now时间。
[0092] 根据上述流程,例如一个10秒的动画,一共10帧,则理论帧间隔为1秒,如果第3帧的在第2秒开始播放,假定第3帧播放耗时0.5秒(通过渲染完成后的时间点–T-FrameStart可求得),那么线程应该休眠0.5秒;如果耗时1.2秒,那么休眠0秒,当第4.2秒到来时,就直接播放第4帧,如果耗时2.2秒,也是休眠0秒,当前时间已经是5.2秒,就直接播放第5帧,这时第4帧就被丢弃了。
[0093] 另外,本发明还提供一种动画播放装置,如图4所示,该装置包括:
[0094] 计时线程模块401,用于在动画播放的主线程之外启动一独立计时线程;
[0095] 动画播放模块402,用于在所述计时线程被唤醒并确定开始播放动画帧时,计算动画当前的播放进度,并根据该播放进度播放动画帧;
[0096] 休眠模块403,用于在所述动画帧播放完毕后计算计时线程需要休眠的时间并令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0097] 较佳地,所述动画播放装置可以进一步包括:
[0098] 丢帧模块404,用于在所述计时线程被唤醒,且所述动画播放模块402确定开始播放动画帧时,判断是否需要丢弃当前帧;如果判断需要丢弃当前帧,则丢弃当前帧;
[0099] 所述动画播放模块402进一步用于在所述丢帧模块404判断不需要丢弃当前帧时,计算动画当前的播放进度,并根据该播放进度播放动画帧;
[0100] 所述休眠模块403进一步用于在所述丢帧模块404判断需要丢弃当前帧时,计算计时线程需要休眠的时间并令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0101] 其中,所述动画播放模块如图5所示,包括:
[0102] 播放确认单元501,用于判断当前动画的所有动画帧是否全部播放完毕,若是则结束播放,否则确定开始播放动画帧;
[0103] 进度确定单元502,用于在所述播放确认单元501确定开始播放动画帧,且所述丢帧模块404判断不需要丢弃当前帧时,根据当前时间和所述动画开始时间计算动画当前已播放时间;根据所述动画当前已播放时间和动画总时间,得到当前动画的播放进度;
[0104] 播放单元503,用于根据所述播放进度对应的理论播放位置播放动画帧。
[0105] 所述丢帧模块如图6所示,包括:
[0106] 计算单元601,用于在所述计时线程被唤醒,且所述动画播放模块确定开始播放动画帧时,
[0107] 根据当前帧的帧序号、理论帧间隔及动画开始时间,计算当前帧理论开始时间以及下一帧的理论开始时间;
[0108] 判断单元602,用于在当前时间在所述当前帧的理论开始时间与下一帧的理论开始时间之间时,判断不需要丢弃当前帧;在当前时间超过下一帧的理论开始时间时,判断需要丢弃当前帧;
[0109] 丢帧单元603,用于在所述判断单元判602断需要丢弃当前帧时,将当前帧丢弃。
[0110] 较佳地,所述判断单元603可以进一步用于在当前时间早于当前帧的理论开始时间时,判断不丢弃当前帧;
[0111] 所述丢帧单元603不丢弃当前帧;
[0112] 所述进度确定单元502及播放单元503不动作;
[0113] 所述休眠模块403直接计算计时线程需要休眠的时间并进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0114] 如图7所示,所述休眠模块403包括:
[0115] 休眠时间计算单元701,用于计算休眠时间,如果当前时间大于等于所述下一帧的理论开始时间,则休眠时间为0,如果小于所述下一帧的理论开始时间,则休眠时间为所述下一帧的理论开始时间减去当前时间;
[0116] 休眠控制单元702,用于在所述动画帧播放完毕,或丢弃当前帧,或者既没有丢弃当前帧也没有进行动画帧的播放时,令所述计时线程进入休眠等待,直至所述休眠时间到达,计时线程被再次唤醒。
[0117] 由上述的实施例可见,本发明的这种动画播放方法及装置对比timer最重要的改进在于“定时唤醒”精确性的提升,由于Windows下的Timer是利用线程的消息池来实现的,所以当消息池被阻塞或者繁忙的时候,Timer无法及时的被定时唤醒,但在逻辑上依然是按照Timer会被精确唤醒而设计的,这样会导致后续在丢帧的策略中就会导致误差。而本发明计时线程的唤醒是由windows来调度的,可以以cpu时间分片为单位来保证精确的唤醒,避免动画播放被打断,造成卡顿。
[0118] 另外,本发明的动画播放方法还有一个提升点,在现有timer方案中,是通过计算两帧之间的T-Elapse来预测下一次Timer到来时,应该播放第几帧的,由于Timer每一次回调不一定是等时差的,这种预测也是不可信的,而本发明中,是当回调到来时,实际检测现在的时间,动态的计算动画播放的进度,然后再进行动画渲染播放,这样就避免了不可靠的预测行为,可以使动画在最大程度上表现出流畅的感觉。
[0119] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。