game programing gems 4.11
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. 자기에게 딱 맞는 공간에 넣음.
공간 나누는 법 : 현재의 ½
옥트리 - 문제점 애매하게 걸쳐있는 경우 ◦ 상위 공간에 넣어야 되더라.
속도 저하 -‐ 동적인 사물 ◦ 움직이는 게임 캐릭터들
◦ 금방 경계를 넘어가니까
이런 문제를 어떻게 해결할까?
옥트리 - 문제점 문제점 정의 ◦ 충분히 작은데도, 상위 공간에 들어가게 됨.
문제 발생하는 원인 ◦ 경계에 걸쳐있어서.
문제의 근본적인 원인 ◦ 공간을 너무 칼같이 나눠서.
◦ 부모 공간의 가로 ½ 세로 ½
ㅇㅋ 근본적인 원인을 해결하자
à 공간을 느슨하게 만들자 à 느슨한 옥트리
느슨한 옥트리 핵심은 자식 공간의 모서리의 길이 ◦ 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번
결론 1. 옥트리 Is Good
2. But 항상 Is not Good
3. 깐깐한 옥트리 Xuck you
4. 전통적인 자료구조는 항상 게임에 맞지 않는다.
5. 왜 맞지 않을까, 근본적인 문제 원인을 찾아 해결해서
6. 실용적인 대안, 실용적인 자료구조 만들자구욧!
7. 그럴려면 아마 기초를 잘 공부해야게쬬?