좋아, 오늘은 타일 엔진에 대한 충돌 감지 코드를 더욱 최적화하려고했습니다.타일 엔진 충돌 최적화
이것은 내가 무슨 짓을 : 범위 내에서 포인트가
Circle 클래스를 확인합니다. 있다면, 플레이어와 타일 사이의 충돌을 확인하십시오.
코드 : "1"이있는 경우
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);
}
}
}
}
이 레이어 3을 통해 확인한다. 있다면, 사각형을 할당하고 포인트가 충돌 반경 내에 있다면 충돌을 확인하십시오.
또한이 코드를 (draw 메서드를 사용하여) 검사했고, 적어도 올바르게 작동하고 있음을 알고 있습니다.
약 120,000 (32 x 3888) 타일을 지연시켜 코드를 작성하기 전에 조금 뒤떨어졌습니다. 그러나 코드에 추가 한 후에는 훨씬 더 뒤떨어졌습니다.
내가 생각하는 방법에 단지 그것도 원격으로 지연 않을 것 반경 내에있는 타일 (점)의 충돌을 확인,하지만 그런 경우가 아니다 이후 ...
어떤 도움/아이디어 이것을 최적화하는 것이 좋을 것입니다.
고마워, Shyy
편집 :
Cirlce.Contains() 코드 : 나는 사각형을 사용하는 것보다 빠르다 들었습니다 때문에
public bool Contains(Vector2 Point)
{
return ((Point - position).Length() <= radius);
}
내가 원을 사용했다.
원형 테스트가 제곱 된 거리를 비교하는 대신 sqrt를 사용하는 경우 특히 원형이 아닌 사각형으로 사전 테스트를 시도하십시오. – LearnCocos2D
@ 코코스, 답장을 보내 주셔서 감사합니다. 위 Circle.Contains() 코드를 게시했습니다. 내가 사각형을 사용하는 것보다 빠르다고 들었 기 때문에 원을 사용하고 있습니다. –
어디에서 들었습니까?너비가 제곱 된 길이를 비교하면 성능면에서 동치 일 뿐이지 만 Length()를 사용하기 때문에 제곱근을 사용하므로 속도가 느려집니다. @OSborn의 답변을 참조하십시오. – LearnCocos2D