game programing gems 4.11

23
Game Programing Gems [4.11] 느슨한 옥트리 2015 – 07 – 30 NHN NEXT 남세현

Upload: sehyeon-nam

Post on 16-Aug-2015

43 views

Category:

Education


3 download

TRANSCRIPT

Game����������� ������������������  Programing����������� ������������������  Gems����������� ������������������  [4.11]����������� ������������������  느슨한����������� ������������������  옥트리

2015 – 07 – 30 NHN NEXT 남세현

옥트리 - 복습   옥트리란  ◦  연산 좀 더 빠르게  

◦  Divide  and  Conquer  ◦  공간을 나누는 자료구조 기법  

  어떻게?  ◦  공간을 8조각으로 나누어서  ◦  왜 8조각?  

◦  (x축 +,  -) * (y축 +,  -­‐)  * (z축 +,  -­‐)  =  2 * 2 * 2  =  8  

  1차원의 Binary-­‐Tree(약간 다르지만)  2차원의 Quad-­‐Tree  3차원의 OcTree  

옥트리 - 생김새 1.  가장 큰 공간에 넣어봄  

2.  자식 공간에 넣을 수 있나?  

3.  자식 공간에 넣어봄.  

4.  자식of자식 공간에 넣을 수 있나?  

5.  반복.  

6.  자기에게 딱 맞는 공간에 넣음.  

  공간 나누는 법 : 현재의 ½  

근데 문제가 있더라

옥트리 - 문제점

걸쳐 있을 때는?  

옥트리 - 문제점   애매하게 걸쳐있는 경우  ◦  상위 공간에 넣어야 되더라.  

  속도 저하 -­‐ 동적인 사물  ◦  움직이는 게임 캐릭터들  

◦  금방 경계를 넘어가니까  

  이런 문제를 어떻게 해결할까?  

옥트리 - 문제점   문제점 정의  ◦  충분히 작은데도, 상위 공간에 들어가게 됨.  

  문제 발생하는 원인  ◦  경계에 걸쳐있어서.  

  문제의 근본적인 원인  ◦  공간을 너무 칼같이 나눠서.  

◦  부모 공간의 가로 ½ 세로 ½    

  ㅇㅋ 근본적인 원인을 해결하자  

  à 공간을 느슨하게 만들자 à 느슨한 옥트리  

무지 간단함요

자식 공간의 중심점은?

  자식의 중심점  = 부모의 중심점 ± 부모 변의 길이/4  

부모라능  

자식 공간의 중심점은?

  자식의 중심점  = 부모의 중심점 ± 부모 변의 길이/4  

부모라능  

자식 공간의 모서리의 길이는?

  자식의 모서리 길이  = 부모 변의 길이/2  

부모라능  

L/2  

자식 공간의 모서리의 길이는?

  자식의 모서리 길이  = 부모 변의 길이/2  

부모라능  

L/2  

이게 근본적인 원인 자식 모서리 길이 = 부모 모서리 길이 /  2  

K  *  부모 변 길이 /  2  

자식 공간의 모서리의 길이는?

  자식의 모서리 길이  = 부모 변의 길이/2  

부모라능  

L/2  

K  *  부모 변 길이 /  2  

이거시 느슨한 옥트리

중심  

원래 모서리  (L/2)  

느슨한 모서리  (K  *  L/2)  

느슨한 옥트리   핵심은 자식 공간의 모서리의 길이  ◦  L  /  2  가 아니라  ◦  K  *  L  /  2  

  그러면 K의 값은 어떻게 되나요?  ◦  백종원 선생님 : 설탕 얼마나 넣어유?  ◦  <적당히>  

  저자왈 -­‐  “  k가 2면 왠만해선 ㅇㅋ다요!  ”  ◦  민나!! 젠카이노!!  아이돌마스터!!  

  숙제 :  K가 2보다 작을 경우,  2보다 클 경우    어떤 문제가 있는지 알아오시오  

K가 2면 좋은 이유 1.  다 들어갈 수 있다.  ◦  옥트리 : 들어갈 수 있는데 못들어가는 경우가 있음.  

◦  경계에 걸쳐있는 애들.  

◦  공간의 모서리 길이가 L이라고 하자.  ◦  이때 이 공간 안에 들어갈 수 있는 가장 큰 원의 지름은?  

◦  L입니다.  ◦  그때 그 원이 조금이라도 움직이면?  

◦  경계에 걸립니다.  

◦  경계에 걸리면 어케됨?  ◦  부모공간에 들어가야 합니다.  

◦  근데, 느슨한 옥트리고 K가 2라서 공간의 길이가 2*L면?  ◦  아무리 원이 움직여도 N번째 레벨의 자식 공간에는 무조건 들어갈 수 있음  

◦  즉, 그 공간 레벨대에서 가장 큰 지름 L의 원이 아무리 움직여도 들어갈 수 있다!!  

제가L입니다  

기존 옥트리에선 캐릭터가 움직이면 경계에 부딪혀서 자식공간 à 부모공간 올라가고 그랬다는거임  

느슨한 옥트리 사용법 1.  노드 삽입  ◦  똑같습니다.  ‘나를 포함할 수 있는 가장 작은 공간’에 넣으면 됨.  ◦  AABB연산 ㄱㄱ  

2.  충돌 등 연산  ◦  약간 달라짐.  

◦  기존에는 모서리 길이, 중심까지의 길이 등 딱딱 맞았으니까  ◦  몇가지 편법? 계산법이 있었음  

◦  하지만 크게 달라지는 것은 없음  ◦  부모공간 > 자식공간 은 달라지지 않음  ◦  부모공간 먼저 계산 후 자식공간 계산하던거 그대로 하시면 됨요  

PERFORMANCE - 가시성 •  정확도 증가  •  하지만 연산 횟수는 증가.      연산횟수 증가한 이유?  공간과 공간 겹치는 것 때문에.  (옥트리는 하나도 안겹침)  (옥)2번 vs    (느옥)4번  

PERFORMANCE - 충돌체크

•  객체 대 노드는 증가  (아까 같은 이유로)  •  하지만 합계는 감소  (정확도 증가로,    불필요한 계산을 줄이기 때문)  

결론 1.  옥트리 Is  Good  

2.  But 항상 Is  not  Good  

3.  깐깐한 옥트리 Xuck  you  

4.  전통적인 자료구조는 항상 게임에 맞지 않는다.  

5.  왜 맞지 않을까, 근본적인 문제 원인을 찾아 해결해서  

6.  실용적인 대안, 실용적인 자료구조 만들자구욧!  

7.  그럴려면 아마 기초를 잘 공부해야게쬬?  

Game����������� ������������������  Programing����������� ������������������  Gems����������� ������������������  [4.11]����������� ������������������  느슨한����������� ������������������  옥트리

2015 – 07 – 30 NHN NEXT 남세현