「疑難雜症」又二記
0. 引子
近來工作又遇到一些「疑難雜症」,在此簡單記下,自省省人 ~
1. 都是waitforseconds 惹的禍 ~
目前開發的遊戲很多地方都用到了hotween
,個人感覺還是挺不錯的(題外話,hotween
的第二版
dotween
應該也快正式release
hotween
的使用還挺順暢,不過小坑還是踩到了乙個:
對於一些連續的tween
效果,使用
hotween + yield return new waitforseconds
的組合方式個人感覺還是挺容易理解的,於是專案中的不少地方都出現了類似下面這種形式的**:
hotween.to();
yield return new waitforseconds();
hotween.to(...);
大部分情況下,上面的**都執行的很好,但是在極少數的情況下(真機測試下情況尤甚),會出現動畫(tween
)出錯的情況,而且極難重現,非常隨機,自己斷斷續續的查了好久,設想了不少可能原因,也依此做了不少
fix,心裡依然覺得惴惴不安,因為個中「病根」自己並沒有找到,後來又經過了不少測試才算找到了些門路,「順藤摸瓜」式的總算「確診」了**,原來這一切都是
waitforseconds
惹的禍 :)
自己大概學習過一些hotween
的實現原始碼,原理上來說還是挺傳統的,大概就是通過乙個
update
來不斷更新由
hotween.to
或者from
等api
產生的abstweencomponent
(hotween
中的tweener
,sequence
都繼承於他),當然個中細節很多,在此就不一一贅述了,值得一提的就是
hotween
在時間相關的邏輯上大抵都仰仗於
unity
中的time
,也就是說,如果拿上面的**舉例:
hotween.to();
其中動畫(tween
)的時間
duration
,hotween
大抵上便是由
time.time - tweenstarttime
這類形式來加以控制的,這種控制方式很直觀,一般來講也沒什麼問題,但是結合上
waitforseconds
就出岔子了……
問題出在waitforseconds
的計時方式與
hotween
的計時方式並不相同!(如何不同我並不十分清楚,有了解的朋友不妨告之一下)「天真的」猜測一下,我估摸著很有可能
waitforseconds
的計時要略快於
hotween
的計時,也就是說,如果
waitforseconds
顯示時間已經過去了1s,
hotween
這方可能仍然覺得時間只經過了
0.9s
……當然,實際程式執行中兩者的差距遠沒有如此誇張,但是不會一致基本上是肯定的,而當兩者的差距偶爾偏大,譬如說超過一幀時,「詭異」的動畫問題可能就會出現了,考慮上述**:
hotween.to();
yield return new waitforseconds();
// previous tweener could still running ……
hotween.to(...);
雖然你使用waitforseconds
等待了duration
時間,但實際上相對
hotween
而言,duration
時間還沒有到(感覺頗有些相對論的味道 :)),動畫仍然會在
yield
之後繼續執行,這與你**的邏輯假設是相悖的,自然就會出現或這或那的奇怪問題……
基於此,我改變了一下動畫的控制方式,**大概是這個樣子:
bool istweenend = false;
hotween.to();
while (!istweenend) {
yield return null;
hotween.to(...);
此番改動之後,之前各種奇怪的動畫問題總算是「消停」了,呼……
2.wtf,
android
版本隨機崩潰!?
目前將遊戲發布了乙個android
測試版本,在
galaxy note
(android 4.1.1
)上跑的還算可以,但是放到紅公尺
note
(android 4.4.2
)上就各種崩潰(幾乎是「隨時隨地」
crash
),日誌上看大抵就是乙個段錯誤,實在是令人費解,幾番
、多方嘗試之後,才算找到了乙個
fix方案:
這裡有個細緻討論
(上面的截圖也來自於此),有興趣的朋友可以看看 :)
ok,就這些了 ~
Hadoop疑難雜症
前天安裝了pig,本來寫了條pig latin,但一直卡在 17 05 07 17 47 07 info mapreduce.job running job job 1494150363568 0001跑不通,想著肯定是mapredcue自身有問題,於是開始了艱苦的檢錯之旅,從csdn到stackf...
Appium疑難雜症
坑之初體驗 1.session大於60秒沒接收到命令自動關閉 python desired caps 在啟動配置裡面加入newcommandtimeout引數 desired caps newcommandtimeout 200 但是注意cnpm預設在當前目錄安裝npm包。3.uiautomatio...
疑難雜症 列舉
1.列舉是使用者自定義的整數型別 2.關於列舉的一般用法,參照 c 中的列舉 3.從字串中獲取列舉值 定義如下的列舉 public enum timeofday 從乙個字串得到列舉值,並轉換為整數 timeofday time timeofday enum.parse typeof timeofda...