“疑难杂症”又二记

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,就这些了 ~

时间: 2024-11-10 01:13:07

“疑难杂症”又二记的相关文章

“疑难杂症”二记

0. 引子 今日开发遇到些许问题,大抵都很琐碎,但却又颇为扰人,在此随便一记,提醒自己的同时,也可以方便方便遇到类似情况的朋友~ 1. Unity Standalone Build的窗口设置没有作用? Unity一键跨平台的功用确实喜人,但是依旧有些零星的事项需要注意,一旦马虎放过,就让人苦恼不堪~ 譬如其Standalone Build 的窗口设置: Default Screen Width 以及 Default Screen Height选项一目了然,然而很多情况下,这两个设置似乎从不生效!

读理,妙句秒人秒事,二记

妙句改编- 二记 "来到这世上,本就是要好好过日子的话" "少年不识愁滋味,最是青春年少时"  同一句 "少年郎,得多喝些酒" "前进五步怕,退后三步怕,都怕了,哪有此等好事" (下图无关,胡二叔的连环扣) 原文地址:https://www.cnblogs.com/BaiPao-XD/p/10425210.html

软件工程_东师站_总结

一.团队成员介绍 团队名称: 耐撕(Nice) 团队队长: 蕊哥:http://www.cnblogs.com/zhengrui0452/ 团队其他队员: ????亮哥:http://www.cnblogs.com/dendroaspis-polylepis/(超强的代码控制能力者,团队项目核心程序员) ????成林大腿:http://www.cnblogs.com/charliePU/ (服务器端主要控制者,站立会议主要记录者,fork其它团队项目后,团队项目核心程序员) ????张呆呆:ht

42个自我提升的实用技巧

转自:http://blog.sina.com.cn/s/blog_6100a4f10102uwv8.html     1.每天读一本书 书是智慧的源泉,书读的越多,你就会获得越多知识.有哪些书是可以提升自我的呢?我自己读过的有启发的书是<思考致富><谁动了我的奶酪><高能人士的七个习惯><致富之道><80/20生活经>,有些书评价还不错,如<引爆点><异类><赢者的心态> 2.学习一门新语言 作为一名新加坡华

记大一大二经历以及教训

2017  5.10   我目前就读川大本科大二,第一篇文章,纯属个人的大学生活感想.   大一青涩,现在想来可以用无知形容,没找到笃定前行的方向,然而厌恶了现在的专业--风景园林.以下吐槽.此专业在我川真的是巨水,本身国内没多少开这个专业的,2012教育部学科评估排名倒数,在一个985院校里面的专业连个普通一本都比不上,可想而知教学质量和教学环境.何况这个专业挂名工科,实则是搞艺术的,数学物理一概不学,和工科不沾边,要我觉得不喜欢设计千万不要选这种专业,身边动辄就从小开始画画,素描水彩不在话下

简述C疑难杂症_序列点(二)

引问:int i=3;  int b=i++*i++;为什么最后的结果是b=9? 答案:(1)标准规定,两个序列点之间,程序执行的顺序可以是任意的,如果一个对象被修改多次,最后留下的是哪次的结果就不确定.不同编译器运行的结果可能就不一样. (2)在相邻的两个序列点之间,一个对象最多只允许被修改一次. (3)C语句结束标志分号(;)是序列点中的一种.也就是说,C语句中由赋值.自增或者自减等引起的副作用(side effect)在分号之前必须结束. (4)没有任何保证确保自增或自减会在输出变量原值之

蓝的成长记——追逐DBA(20):何故缘起,建库护航 (二次发布-练习使用markdown编辑)

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 深蓝的blog: http://blog.csdn.net/huangyanlong/article/details/48776573 [前言] 自接触oracle至今,愈是深入了解oracle愈是察觉到个人的渺小,时常感受到技术知识可以助推思维方式,一路走来,在汗水中收获着成长的充实,不仅局限于oracle技术,借由此系列文章,分享个人在追逐DBA道路上收获的些许感悟与成长的点滴记录.在

硅谷行记二:走进百度美国研发中心

硅谷行记二:走进百度美国研发中心 牛智超02月01日 12:44 分享到:                                                                                                                                                      4 百度                                       百家                  

张小二求职记之 单例模式(二)

z:大侠,我又回来了. M: 内部类懂了,其实设计模式很多考察的都是基础知识,一个学生能有什么项目工程经验呢?你很上进.咱们聊聊内部类,特别是单例模式中的静态内部类.我们开始吧: M.什么时内部类? 简单来说就是类中有类. M:静态内部类和普通内部类有什么区别? 普通内部类可以理解为外部类的普通方法,需要创建外部对象,说白了普通类是属于某个对象 OutClass.InnerClass obj = outClassInstance.new InnerClass(); 静态内部类可以理解为静态方法,