“疑难杂症”又二记

“疑难杂症”又二记

0. 引子

近来工作又遇到一些“疑难杂症”,在此简单记下,自省省人 ~

1. 都是WaitForSeconds 惹的祸 ~

  目前开发的游戏很多地方都用到了Hotween,个人感觉还是挺不错的(题外话,Hotween的第二版Dotween应该也快正式Release了,各种改进令人期待 :)),推荐有兴趣的朋友试试,虽说自己感觉Hotween的使用还挺顺畅,不过小坑还是踩到了一个:

  对于一些连续的tween效果,使用Hotween + yield return new WaitForSeconds的组合方式个人感觉还是挺容易理解的,于是项目中的不少地方都出现了类似下面这种形式的代码:

  Hotween.To(<effect run duration time>);

  yield return new WaitForSeconds(<duration time>);

  Hotween.To(...);

  大部分情况下,上面的代码都运行的很好,但是在极少数的情况下(真机测试下情况尤甚),会出现动画(tween)出错的情况,而且极难重现,非常随机,自己断断续续的查了好久,设想了不少可能原因,也依此做了不少Fix,心里依然觉得惴惴不安,因为个中“病根”自己并没有找到,后来又经过了不少测试才算找到了些门路,“顺藤摸瓜”式的总算“确诊”了病因,原来这一切都是WaitForSeconds惹的祸 :)

  自己大概学习过一些Hotween的实现源码,原理上来说还是挺传统的,大概就是通过一个Update来不断更新由Hotween.To或者From等API产生的ABSTweenComponent(Hotween中的Tweener,Sequence都继承于他),当然个中细节很多,在此就不一一赘述了,值得一提的就是Hotween在时间相关的逻辑上大抵都仰仗于Unity中的Time,也就是说,如果拿上面的代码举例:

  Hotween.To(<effect run duration time>);

  其中动画(tween)的时间duration,Hotween大抵上便是由Time.time - tweenStartTime这类形式来加以控制的,这种控制方式很直观,一般来讲也没什么问题,但是结合上WaitForSeconds就出岔子了……

  问题出在WaitForSeconds的计时方式与Hotween的计时方式并不相同!(如何不同我并不十分清楚,有了解的朋友不妨告之一下)“天真的”猜测一下,我估摸着很有可能WaitForSeconds的计时要略快于Hotween的计时,也就是说,如果WaitForSeconds显示时间已经过去了1s,Hotween这方可能仍然觉得时间只经过了0.9s……当然,实际程序运行中两者的差距远没有如此夸张,但是不会一致基本上是肯定的,而当两者的差距偶尔偏大,譬如说超过一帧时,“诡异”的动画问题可能就会出现了,考虑上述代码:

Hotween.To(<effect run duration time>);

yield return new WaitForSeconds(<duration time>);

// previous tweener could still running ……

Hotween.To(...);

  虽然你使用WaitForSeconds等待了duration时间,但实际上相对Hotween而言,duration时间还没有到(感觉颇有些相对论的味道 :)),动画仍然会在yield之后继续运行,这与你代码的逻辑假设是相悖的,自然就会出现或这或那的奇怪问题……

  基于此,我改变了一下动画的控制方式,代码大概是这个样子:

  bool isTweenEnd = false;

  Hotween.To(<effect run duration time when end it will set “isTweenEnd” to true>);

  while (!isTweenEnd) {

      yield return null;  

  }

  Hotween.To(...);

  此番改动之后,之前各种奇怪的动画问题总算是“消停”了,呼……

2.WTF,Android版本随机崩溃!?

  目前将游戏发布了一个Android测试版本,在Galaxy Note(Android 4.1.1)上跑的还算可以,但是放到红米Note(Android 4.4.2)上就各种崩溃(几乎是“随时随地”Crash),日志上看大抵就是一个段错误,实在是令人费解,几番google、多方尝试之后,才算找到了一个Fix方案:

  这里有个细致讨论(上面的截图也来自于此),有兴趣的朋友可以看看 :)

  OK,就这些了 ~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程微刊

进阶攻略|前端完整的学习路线

28350
来自专栏腾讯移动品质中心TMQ的专栏

腾讯TMQ在线沙龙回顾|UI自动化中阶思考与实践

UI自动化中阶思考与实践 活动时间:2017年4月17日 QQ群视频交流 活动介绍:TMQ在线沙龙第十九期分享活动 本次分享的主题是:UI自动化中阶思考与实践 ...

31690
来自专栏刺客博客

谈谈云免原理

8.3K20
来自专栏IMWeb前端团队

RAIL简介:一个以用户为中心的性能模型

本文作者:IMWeb huscot 原文出处:IMWeb社区 未经同意,禁止转载 web性能优化,这是大家耳熟能详的东西了。 一说到性能优化,大家可能...

27270
来自专栏编程坑太多

css写出爱心版加载效果

19030
来自专栏腾讯Bugly的专栏

《腾讯大家》小程序开发总结

腾讯大家小程序与公众号精密结合运营,通过传播引发网友关注,扩大腾讯大家内容的出口。

2.7K110
来自专栏非著名程序员

Kotlin 实现仿开眼 App

开眼视频是一款精品短视频日报应用,该项目是用kotlin,借助已知的一些开眼接口写的一个仿《开眼App》,主要是为了学习kotlin和一些UI效果。 GitHu...

25980
来自专栏IMWeb前端团队

聊聊移动端跨平台开发的各种技术

介绍 最近出现的 React Native 再次让跨平台移动端开发这个话题火起来了,曾经大家以为在手机上可以像桌面那样通过 Web 技术来实现跨平台开发,却大多...

32550
来自专栏张叔叔讲互联网

什么是网络爬虫,每天都在忙乎什么?(下篇)

上篇文章中提到我成功到达了B站服务器,并且成功拿到了所需要的Cosplay图片,但是除了图片之外还有一些其他内容,带着很多疑问我开着车以光速回家了。

13520
来自专栏Data Analysis & Viz

(送福利)BDP绘制微博转发动态热力图

先把效果图放上来,酷炫压场。看完本文,你就能轻松实现这个动态效果,全程只需几分钟!

20020

扫码关注云+社区

领取腾讯云代金券