在項目中用到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,解決的辦法是通過調試定位問題