box2djs 一個bug world.Step運行數秒鐘的調試記錄

在項目中用到box2d

動態增加了一個剛體,並設置了剛體的位置bd.SetPosition(x,y);

結果遊戲循環被卡死

調試後發現world.Step這個函數和正常的情況相比,執行速度非常慢,要幾秒鐘才運行結束

單步調試該函數

函數體內的代碼片段如下

 if (step.dt > 0.0) {
         this.Solve(step);
      }
      if (b2World.m_continuousPhysics && step.dt > 0.0) {
         this.SolveTOI(step);
      }

最後定位到是this.SolveTOI(step);消耗最多的時間

單步進入this.SolveTOI(step);函數體內,發現this.m_contactList內的元素多達900多個

      for (c = this.m_contactList;
      c; c = c.m_next) {
         c.m_flags &= ~ (b2Contact.e_toiFlag | b2Contact.e_islandFlag);
      }

問題基本可以定位下來了是碰撞方面的問題

this.SolveTOI(step);函數體內代碼並不能直接定位問題,嘗試從別的角度看看情況

對 listener.BeginContact = function (contact) {
           var p1=contact.m_nodeA.other.GetPosition();
            var p2=contact.m_nodeB.other.GetPosition();
            var u1=contact.m_nodeA.other.m_userData;
            var u2=contact.m_nodeB.other.m_userData;
            var n=u1.type+u2.type;}

下斷點

發現不斷的發生碰撞事件,與this.m_contactList元素過多的狀況相吻合

再仔細分析發生碰撞時候的body的座標,發現p1的值總是爲undefined,看來這就是問題的關鍵了

通過排查終於發現是前面bd.SetPosition(x,y);出現了問題,這樣的調用會導致bd.GetPosition()爲undefined

正確的做法應該是bd.SetPosition({x:x,y:y});

 總結了下這是筆誤引起的bug,解決的辦法是通過調試定位問題



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