關於搶紅包線程卡頓的問題解決流程筆記

最近的項目模仿了支付寶做搶紅包的功能。我額外的做了一個界面生產雙紅包的功能。(但是隻是在一個刷新週期用產生一個紅包的方式調用兩次,卻發現這樣子引起了問題,後來由於上線期限的原因先把雙紅包特性取消掉(安卓沒有做我自己加上去的)並沒有深究。現在來找下原因。)

 首先,頁面卡頓肯定是由於 主線程之間發生了相互卡頓引起的。

假設1 :音效的 和 定時器阻塞
答案,否。 關閉音效一樣出現

突然發現,跟位置生成函數有關。
突然想起,是否因爲屏幕插不進去引起。
用po命令打出 self.sprites , 用筆記本畫圖,確實這裏卡住了。

找到一個阻塞點。

假設2:
是因爲之前的紅包還沒有被sprite數組 remove掉引起的。
答案,否,使用po命令發現實際上sprite superview 都還在

假設3:
新生成的紅包和新紅包互相卡
答案,確實。但是這種互相卡是因爲沒位置插入引起的。沒有位置插入應該等待而不是引起主線程阻塞。 

解決方式: 
採用子線程等待主線程的方式,但是這樣子最然解決了互相阻塞的問題,但是因爲子線程和主線程使用了同樣的數組,子線程在不斷地遍歷這個變量來判定

  for (UIButton * buttonin self.sprites)

        {

            NSLog(@"xy %f",hypotf(x-button.center.x,y- button.center.y));


            if (hypotf( x-button.center.x,y- button.center.y)*2 < half_hypotenuse +250) {

                isGot = NO;

                break;

            }

        }

而在主線程self.sprites會在動畫執行完成後會對self.sprites進行remove成員的操作。則樣主子線程共享變量是非常危險的事情。因爲這是一個數組,會引起一同時遍歷數組時移除數組成員的crash。

解決的方案
1在邏輯上去除阻塞。我覺得此坑略大但是可以努力。
2信號量 加持 鎖,每個線程訪問時都上一把鎖,訪問後,恢復鎖。其中主線程訪問這個變量是有助於解除阻塞的。所以不會有問題。這個是 上os 系統給的啓示。
3 這個功能可以砍掉嗎。最喜歡這個方案了。- _-.
 
恩,我把他砍掉了因爲本來就是我做出來玩的。現在只是不能加到項目裏。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章