zoukankan      html  css  js  c++  java
  • “疑难杂症”又二记


    “疑难杂症”又二记


    0. 引子

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

    1. 都是WaitForSeconds 惹的祸 ~

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

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

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

      yield return new WaitForSeconds(<duration time>);

      Hotween.To(...);

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

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

      

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

      当中动画(tween)的时间durationHotween大抵上便是由Time.time - tweenStartTime这类形式来加以控制的,这样的控制方式非常直观,一般来讲也没什么问题。可是结合上WaitForSeconds就出岔子了……

      

      问题出在WaitForSeconds的计时方式与Hotween的计时方式并不同样!

    (怎样不同我并不十分清楚,有了解的朋友最好还是告之中的一个下)“天真的”推測一下,我估摸着非常有可能WaitForSeconds的计时要略快于Hotween的计时。也就是说,假设WaitForSeconds显示时间已经过去了1sHotween这方可能仍然认为时间仅仅经过了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.WTFAndroid版本号随机崩溃!?

      眼下将游戏公布了一个Android測试版本号。在Galaxy NoteAndroid 4.1.1)上跑的还算能够,可是放到红米NoteAndroid 4.4.2)上就各种崩溃(差点儿是“随时随地”Crash),日志上看大抵就是一个段错误,实在是令人费解。几番google、多方尝试之后,才算找到了一个Fix方案:

      

      

      这里有个仔细讨论(上面的截图也来自于此)。有兴趣的朋友能够看看 :)

      OK,就这些了 ~


  • 相关阅读:
    Ansible template中j2文件调用var中定义变量报错解决办法
    Ansible 获取hosts中的分组ip
    VUE UI网站汇总
    vue rules详解与实例
    Python 获取设备ip地址
    Flask && Vue 虚拟机申请平台(从开发到部署)
    Vue 把获取到的可编辑表格的值传给后端
    SQLAlchemy基本使用,创建表,增删改查
    Ansible 角色(roles)一键部署redis集群(三主三从)
    Flask 数据库相关操作
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7352489.html
Copyright © 2011-2022 走看看