Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于动画事件机制的疑问 #14

Open
deltaCN opened this issue Jun 13, 2017 · 7 comments
Open

关于动画事件机制的疑问 #14

deltaCN opened this issue Jun 13, 2017 · 7 comments
Labels

Comments

@deltaCN
Copy link

deltaCN commented Jun 13, 2017

作者实现的动画事件似乎是根据播放时间和fps来计算frameIndex
然后用frameIndex来查找动画事件
如果某一帧卡顿时间特别长,导致越过该帧。是不是有可能导致漏事件?
只是猜测,没有具体验证过。

@chengkehan
Copy link
Owner

你分析的非常正确,这个问题我也考虑过。

如果卡顿了很久,那么当卡顿结束后,卡顿的这段时间内所有的event是否需要触发呢,还是跳过?我觉得这个需要看情况,重要的event如果漏了还是需要处理的,非重要的事件可不处理。打个比方,卡顿的这段时间内k了3个events,这3个events会触发3个特效,那我认为这是可以不处理的(非重要),如果处理还会导致3个原本不同步的特效,在卡顿结束后同时播放出来,而且特效和动作也对不上了(显示效果上是不对的)。

我这里的实现比较简单,或者还有其它更好的方法,不知道 Unity 内部是如何处理这种情况的,我没有深入研究过。谢谢你提的建议,如果有好的方法欢迎指正。

@funnydavid
Copy link

通常实现都是所有产生时间小于等于当前时间的未触发过的事件都会触发出来。
个人观点是引擎功能的底层机制无法判断事件是否重要,而是尽量保证逻辑上的正确性,或者设置事件的重要程度,但这个就比较复杂了,延迟多少要不触发其实即使设计者也未必能有一个很好的标准吧。

@deltaCN
Copy link
Author

deltaCN commented Jun 14, 2017

之前手动实现过类似Unity的动画事件,是记录上一帧和当前帧,然后播放这2帧之间的动画事件。这样就可以避免漏事件的问题。

@chengkehan
Copy link
Owner

按event重要程度分只是临时的设想,没有实现过。当前的实现确实会漏事件,如果用到真实项目是需要修改的。@deltaCN@funnydavid 的方法都很好。

@chengkehan
Copy link
Owner

提了一个相关的 bug #15,希望使用这个代码的话能注意到问题。

@deltaCN
Copy link
Author

deltaCN commented Jun 14, 2017

@funnydavid 只判断小于等于是有问题的,如果是循环动画 恰好进入了下一次循环 一样会漏事件

@funnydavid
Copy link

@deltaCN 的确是的
如果动画从头播放这件事情可以在底层监测,相当于补充一个结束的逻辑处理,然后这个逻辑中会去补发上次中的事件。
当然,这依然不是最完备的方案,比如动画很短,卡顿很长,就会导致循环动画已经播放了很多遍,这里需要额外计算和补发其他逻辑。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants