알까기게임 충돌 탐색 알고리즘 최적화 문제입니다.
글쓴이: dflkj2323k@GitHub / 작성시간: 목, 2018/09/20 - 1:39오전
단순한 알까기 게임을 만들고있습니다.
중심 ax ay 에 알이 있습니다. amax는 알 최대개수, distance는 두 좌표간의 거리를 리턴합니다.
그 알들간의 충돌을 검사하기위해 이런 코드를 만들었습니다.
.
for(i=0; i<amax; i++){ for(j=i+1; j<amax; j++){ if(distance(ax[i],ay[i],ax[j],ay[j])<=aradius*2) { //i, j 알은 충돌함 } } }
그런데 문제는 이걸 프레임마다 검사를 하다보니
알이 한두개 있다면 상관없겠지만
알이 80개 이상 넘어갈경우
렉이 걸린다는 겁니다.
지금 시간복잡도가 O(n^2)인데 더 줄일수있는 방법이 있는지 알아보고싶습니다.
전혀 부딪힐 가능성없는 먼곳이나 각도가 안맞는 알까지 충돌검사를 해야된다는게 확실히 시간낭비인거 같습니다.
Forums:
k-d tree를 검색해 보세요.
k-d tree를 검색해 보세요.
정말 감사합니다.
k-d트리를 검색해보니 이게 최근접 이웃 알고리즘이라는 보편적 문제로 있었습니다.
시간복잡도를 O(n)으로 줄일수 있다고 하니 한번 공부해보고 적용해봐야겠습니다.
프루닝
모든 알을 검사할 필요가 있을까요?
알이 움직일 경로를 어떤 직선으로 볼 때, 그 직선과 충돌할 수 있는 범위 내에 있는 구슬들만 검사하면 어떨까요.
처음 알이 움직이기 시작할 때, 충돌할 수 있는 알 목록을 구한 다음, 다음 프레임부터는 그 목록과만 비교 체크하면 일반적인 상황에선 좀 더 빠르게 동작할 수 있을 거 같아요
코드를 만들어봤습니다.
http://codepad.org/D2RyH6QI
//영역을 비교하는 방식
http://codepad.org/5igM638W
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기