2013-05-13 5 views
2

저는 단순한 우주 범인을 위해 일해 왔고, 프로젝트에서 요긴하게 쓰여진 코드가 실제로 작업 속도를 늦추는 지점에 도달했습니다. EQATEC을 실행 한 후에는 대부분의 문제가 충돌 탐지의 모든 부분에 이상이 없는지 확인합니다. 나는 QuadTree에 넣을 것을 고려하고 있었지만 충돌의 대부분은 소행성에 관한 것이 었습니다. 많은 것들이 돌아 다니기 때문에 (많은 업데이트가 필요할 것입니다). 나의 다음 대안은 충돌 검사 자체를 마이크로 최적화하는 것이 었습니다. 여기있다 :C#/XNA - Bounding Circle Collision (Micro) 최적화?

public bool IsCircleColliding(GameObject obj) //simple bounding circle collision detection check 
    { 
     float distance = Vector2.Distance(this.WorldCenter, obj.WorldCenter); 
     int totalradii = CollisionRadius + obj.CollisionRadius; 

     if (distance < totalradii) 
      return true; 
     return false; 
    } 

내가 Vector2.Distance는 비용이 많이 드는 SQRT를 포함 들었습니다, 그래서를 방지 할 수있는 방법은 무엇입니까? 아니면 멋진 계산을 사용하여 거리를 근사시키는 방법이 있습니까? 본질적으로 더 빠른 속도를위한 것.

또한 실제 질문과 약간 관련이 없지만 빠르게 움직이는 개체를 공간적으로 파티셔닝하는 데 좋은 방법 (QuadTree 제외)이 있습니까?

답변

1

실제 거리 대신 거리의 제곱을 계산하고이를 충돌 임계 값의 제곱과 비교하십시오. 조금 더 빨라야합니다. 대부분의 소행성이 같은 크기라면, 다시 계산하지 않고 충돌 임계 값에 동일한 값을 재사용 할 수 있습니다.

다른 유용한 트릭은 먼저 경계 상자를 기반으로 간단한 검사를 수행하고 경계 상자가 교차하는 경우에만 거리를 계산하는 것입니다. 그렇지 않은 경우 두 객체가 충돌하지 않는다는 것을 알게됩니다 (값이 싼 경우).

+0

괜찮습니다. Vector2를 DistanceSquared로 대체하고 각 반경에 자체를 곱하면 이제 충돌 반경이 파손 된 것으로 보입니다. 모든 것이 서로 가라 앉는 것처럼 보입니다. 나는 브레이크 포인트로 놀아 볼 것이다. : P – Lexusjjss

+1

각 반경이 아닌 전체 반경을 제곱해야합니다. – redtuna

+1

Aaaand 이제 작동합니다. 글쎄, 그게 내 바보 같아. 감사. – Lexusjjss