好的,所以今天我決定嘗試進一步優化我的平鋪引擎的碰撞檢測代碼。平鋪引擎碰撞優化
這就是我所做的:
Circle類檢查是否有範圍內的點。如果有,則檢查玩家與平鋪之間的碰撞。
代碼:
int tileWidth = 128;
int tileHeight = 128;
int[,] Layer3 = { 1, 1, 1, etc... };
int tileMapWidth = Layer3.GetLength(1);
int tileMapHeight = Layer3.GetLength(0);
Rectangle tile, tile2;
for (int x = 0; x < tileMapWidth; x++)
{
for (int y = 0; y < tileMapHeight; y++)
{
int wallIndex = Layer3[y, x];
if (wallIndex == 1) //Full-sized Tile Collision (128 x 128)
{
if (collisionCircle.Contains(new Vector2(x * tileWidth + (tileWidth/2) + (int)Player.camera.Position.X,
y * tileHeight + (tileHeight/2) + (int)Player.camera.Position.Y))) //+ tile/2 is for centering the point
{
tile = new Rectangle(x * tileWidth + (int)Player.camera.Position.X, y * tileHeight + (int)Player.camera.Position.Y, tileWidth, tileHeight);
Collide(tile);
}
}
}
}
這將檢查整個三層如果有一個 「1」。如果有,則指定矩形,並在碰撞半徑內檢查碰撞。
此外,我檢查了這個代碼(用繪圖方法),我知道它工作正常,至少是行爲。
我添加了大約120,000(32 x 3888)的圖塊,試圖使它滯後,並且在代碼之前,它有一點點滯後。但是在我加入代碼之後,它就更加落後了。
我認爲,因爲它是隻檢查是半徑不會甚至遠程滯後內的地磚(點)之間的碰撞,但事實並非如此......
任何幫助/如何思路優化這將是偉大的。
非常感謝, Shyy
編輯:
Cirlce.Contains()代碼:
public bool Contains(Vector2 Point)
{
return ((Point - position).Length() <= radius);
}
我用了一個圓,因爲我聽說它比使用矩形更快。
嘗試用矩形進行預測試,尤其是如果你的圈測試使用sqrt而不是比較平方距離 – LearnCocos2D 2014-09-29 08:04:38
@Cocos,謝謝你的回覆。我上面發佈了我的Circle.Contains()代碼。我只使用一個圓圈,因爲我聽說它比使用矩形快。 – 2014-09-29 14:38:27
你從哪裏聽到的?如果您比較長度的平方,那麼它的性能只與性能相當,但由於您使用的是Length(),這意味着使用平方根使其變慢。查看@OSborn的答案。 – LearnCocos2D 2014-09-30 09:37:25