25
1 A* 의 의의 의의의 (GEM1- 3.5 의 )

A* 의 속도 최적화

Embed Size (px)

DESCRIPTION

A* 의 속도 최적화. (GEM1- 3.5 장 ). A* 의 속도 최적화. A* 의 속도는 검색 공간의 크기에 크게 영향받음 검색 공간 자체를 최적화 A* 구현 자체의 최적화 A* 수행 도중의 메모리 할당과 관리의 최적화 정렬도 빈번히 수행됨 ( 특수화된 자료구조를 이용하여 효율적이고 빠르게 처리 가능 ) A* 의 속도를 올리는 최고의 방법 A* 를 사용해야 할 때와 그럴 필요가 없을 때를 적절히 구분하는 것임 - PowerPoint PPT Presentation

Citation preview

Page 1: A* 의 속도 최적화

1

A* 의 속도 최적화

(GEM1- 3.5 장 )

Page 2: A* 의 속도 최적화

2

A* 의 속도 최적화 A* 의 속도는 검색 공간의 크기에 크게 영향받음

검색 공간 자체를 최적화 A* 구현 자체의 최적화

A* 수행 도중의 메모리 할당과 관리의 최적화 정렬도 빈번히 수행됨 ( 특수화된 자료구조를 이용하여 효율적이고

빠르게 처리 가능 ) A* 의 속도를 올리는 최고의 방법

A* 를 사용해야 할 때와 그럴 필요가 없을 때를 적절히 구분하는 것임

( 예 ) 시작으로부터 목표까지 직선을 그었을 때 어떠한 장애물이나 벽도 만나지 않는다면 그냥 직선 알고리즘을 이용해서 경로를 결정하면 됨

Page 3: A* 의 속도 최적화

3

검색 공간의 최적화 검색 공간의 단순화

검색 공간이 작을수록 검색 속도의 향상이 크다는 점을 감안

게임 세계를 단순화된 연결 그래프로 표현할 수 있다면 A* 는 상당히 만족스러운 결과를 보여주게 됨

검색 공간을 단순화하기 위한 4 가지 기법 사각 또는 육각형 격자 실제 다각형 바닥 특수화된 다각형 바닥 가시점 방식

Page 4: A* 의 속도 최적화

4

검색 공간을 단순화하기 위한 4 가지 기법

사각 또는 육각형 격자

게임 세계 위에 단일한 간격의 사각 또는 육각형 격자를 놓음 각 격자 칸의 크기는 가장 작은 캐릭터의 크기에 비례 캐릭터는 그 격자의 한 칸 단위로 이동하며 , 장애물들 역시 칸 단위로 존재

장점 피해가야 할 장애물이나 캐릭터들을 격자 안에서 표현하기 쉬움 , 따라서 검색

전에 필요한 작업이 거의 없음 2D 타일 맵에 적합

단점 검색 공간의 크기가 가장 크다 . 사각형 격자는 3D 세계와 그리 잘 맞지 않음 이동 경로가 부자연스럽다 .

Page 5: A* 의 속도 최적화

5

실제 다각형 바닥

3D 게임의 맵 데이터 자체에 어떠한 특별한 형식으로 저장되어 있는 바닥 다각형들을 그대로 검색 공간으로 간주하는 방식

맵이 복잡하다면 바닥 다각형들의 개수나 복잡함도 크다

장점 데이터 구조가 이미 3D 맵에 들어있다 . BSP 트리를 이용한 빠른 검색이 가능하다 .

단점 3D 맵이 복잡하면 다각형들의 개수가 매우 많은 가능성이 있다 . 공간 안의 캐릭터들이나 바닥 위에 놓여진 탁자나 의자 같은 장애물들을 표현할 수

없다 다각형 안의 제어점들을 선택하기 위한 알고리즘이 필요하다 .

Page 6: A* 의 속도 최적화

6

참고 BSP 트리란 무엇인가 ?

BSP(Binary Space Partitioning) 이란 공간을 분할하는 정보를 담고있는 2 진 트리를 의미

BSP 는 원래 은면 제거 (Hidden Surface Removal) 을 목적으로 고안하였으나 BSP 의 공간 분할에 대한 특성으로 인해 그 응용 범위는 넓게 확장됨

각각의 선들의 segment 들 (3D 에서의 polygon 이나 ) 을 잘려져있는 plane( 공간안의 남아 있는 모든 object 들을 그 plane 의 "front" 나 "back" 등으로 categorize 하는데 사용되는 ) 으로써 다루는 ' 공간 ' 에 대한 재귀적 sub_division 방법

한 partition 이 트리에 삽입될 때 우선 root node 의 측면에서 이를 categorize 하고 , 각각의 적절한 child 의 측면에서 재귀적으로 분석을 함

Page 7: A* 의 속도 최적화

7

어떻게 BSP 를 생성할 것인가 ?

폴리곤으로 구성된 입체를 BSP 트리 형태로 표현하는 방법은 다음과 같다 .

1. 입체를 구성하는 폴리곤 리스트에서 하나를 선택하여 기준으로 삼는다 .2. 새로운 BSP 노드를 생성하여 선택한 폴리곤을 노드에 추가한다 .3. 선택한 폴리곤의 평면의 방정식을 구한 후에 나머지 폴리곤을 모두 테스트하여 평면의 앞에 있는 폴리곤과 뒤에 있는 폴리곤을 분류하여 리스트를 만든다 . 즉 , 앞쪽 리스트와 뒤쪽 리스트를 완성한다 .

4. 앞쪽 리스트에서 하나의 폴리곤을 선택하여 기준으로 삼는다 . 선택한 폴리곤은 이전에 선택한 폴리곤의 하위 Front 노드에 저장한다 . 리스트에 남는 폴리곤이 없을 때 까지 2 의 과정을 재귀적으로 반복한다 .

5. 뒤쪽 리스트에서 하나의 폴리곤을 선택하여 기준으로 삼는다 . 선택한 폴리곤은 이전에 선택한 폴리곤의 하위 Back 노드에 저장한다 . 리스트에 남는 폴리곤이 없을 때 까지 2 의 과정을 재귀적으로 반복한다 .

Page 8: A* 의 속도 최적화

8

위의 그림을 보면 이 맵은 4개의 폴리곤으로 이루어짐 . 3차원적으로 폴리곤을 표현하고 있지만 아래 그림은 동일한 내용을 2차원적으로 표현 .

Page 9: A* 의 속도 최적화

9

1. A 를 기준 폴리곤으로 선택한다 . K와 L이 동일 평면에 위치하므로 A 를 포함하는 노드에 추가한 후에 하위 Front 와 하위 Back노드를 추가한다

Page 10: A* 의 속도 최적화

10

2. 하위 Front 노드를 구성하는 B, C, D, E, F, G중에서 B 를 기준 폴리곤으로 선택하여 다시 분류한다 . 이때 B 는 E를 분할 (Subdiv) 하여 앞쪽에 위치한 E1과 뒤쪽에 위치한 E2 를 얻은 후에 각각의 하위 노드에 저장한다 .

Page 11: A* 의 속도 최적화

11

3. 나머지 폴리곤들도 위의 요령으로 재귀적으로 구성한다 .

Page 12: A* 의 속도 최적화

12

특수화된 다각형 바닥

맵 데이터의 바닥 다각형들을 그대로 사용하는 대신 레벨 디자이너가 길찾기에 적합한 형태의 바닥 데이터를 직접 만드는 방식

탁자나 의자 아래 등 캐릭터가 지나갈 수 없는 장소에 있는 다각형은 제외시키면 됨

장점 검색 공간이 작고 , BSP 트리를 이용한 빠른 검색이 가능하다 . 바닥 위에 놓인 장애물들을 표현할 수 있다 .

단점 레벨 디자이너의 수작업이 필요하다 . 공간 안의 캐릭터들을 표현할 수 없다 . 다각형 안의 제어점들을 선택하기 위한 알고리즘이 필요하다 .

Page 13: A* 의 속도 최적화

13

가시점 (point of visibility) 방식

게임 맵 안의 볼록한 모서리들에 제어점들을 놓는다 ( 모서리로부터 약간 떨어뜨려서 ) 그리고 서로 “볼 수 있는 ( 직선으로 연결되는 )” 점들을 서로 잇는다 벽들을 피해가는데 필요한 최단 경로를 의미하는 연결 그래프를 만들 수 있다 .

장점 가장 작은 검색 공간을 만든다 . 장애물들이 함께 포함된다 . 결과로 얻는 경로가 완전히 직접적이다 .

단점 알고리즘 또는 수작업으로 사전에 그래프를 만들어야 한다 . 장애물이 파괴되어도 그래프가 바뀌지 않는다 . 공간 안의 캐릭터들을 표현할 수 없다 넓게 늘어선 캐릭터들처럼 너비가 큰 개체들을 제대로 다루지 못한다 . 곡선으로 된 벽이 존재하면 그래프가 필요 이상으로 복잡해 진다 .

Page 14: A* 의 속도 최적화

14

정리 4 가지 방식이 모두 나름대로 장단점이 있기 때문에 어떤 것이

최고의 기법이라고 말하기는 힘듬 게임 세계가 3D 이며 동적인 장애물들이 별로 없다면 가시점 방식이

가장 적합 2D 타일 기반 맵이거나 움직이는 유닛들이 대단히 많아면 (RTS

게임 ) 사각형 격자 방식이 가장 적합 게임의 특성을 분석 후 속도와 유연성이라는 두 가지 관점에서 가장

적합한 방식을 선택해야 함

Page 15: A* 의 속도 최적화

15

가시점 방식 게임 세계 안에서 어떠한 장애물도 부딪히지 않고 돌아다닐

수 있는 직선들로 구성된 그래프를 만든다 .

각각의 볼록한 모서리에 점들을 놓고 , 서로 볼 수 있는 점들을 모두 연결해서 만들어진 직선들을 따라가기만 한다면 어떠한 벽이나 장애물도 만나지 않게 됨 .

시작 위치나 목표 위치가 가시점들과 일치하는 경우가 거의 없기 때문에 시작 위치를 연결 그래프에 포함 시키는 기법이 필요 .

Page 16: A* 의 속도 최적화

16

계통적 길찾기 효율적으로 공간을 단순화 시켜서 길찾기 과정의 속도를 획기적으로 단축시킬 수 있다 .

게임 세계를 계통적으로 구성하여 거시적인 경로를 먼저 찾고 , 미시적인 경로를 찾아서 길찾기를 수행한다 .

( 예 ) 성 안에서의 길찾기 문들로 연결된 방들의 집합 ( 거시적 연결그래프 ) 시작 위치가 있는 방에서 목표 위치가 있는 방으로 도달하는 방 -

방 경로 각각의 방에서 다음 방으로의 미시적 경로를 찾아감 ( 미시적

경로찾기 )=> 아무리 큰 맵이라고 해도 실제로 검색을 수행하는 공간은

비교적 작은 크기이므로 전체적인 길찾기에 걸리는 시간이 크게 줄어든다

Page 17: A* 의 속도 최적화

17

나선 계단 ( 본래 3D 구조 ) 여러 개의 파이애플 조각 ( 하나의 계단 ) 들이 붙어 있는 구조로 생각하면

의외로 문제가 쉽게 풀림 각각의 파인애플 조각들에 대한 연결 그래프는 그야말로 직선적인

그래프이므로 매우 쉽게 만들 수 있으며 , 조각들 사이의 거시적인 경로 역시 빠르게 얻을 수 있음 ( 검색 공간이 작으므로 )

Page 18: A* 의 속도 최적화

18

지역 경로를 계산하기 위한 시간 지연을 피하려면

새 방에 들어설 때마다 다시 경로를 계산해야 하므로 캐릭터의 이동 중 주기적으로 시간 지연이 발생

이를 피하려면 캐릭터가 새 방의 입구에 도달하기 조금 전에 미리 다음 검색을 시작하는 방식으로 시간 지연을 분산시킬 필요 있음

Page 19: A* 의 속도 최적화

19

알고리즘의 최적화 휴리스틱 비용의 조정

A* 알고리즘의 휴리스틱 비용 (heuristic cost) 은 목표까지의 실제 비용을 미리 추정한 값이다 .

휴리스틱 비용의 과대평가 휴리스틱 비용을 약간 과대평가하면 그럴듯한 경로를 빠르게 얻을

수 있다 . 그러나 휴리스틱 비용을 과대평가하면 최적이 아닌 경로를 찾을

수도 있고 과대평가의 정확한 양은 실험을 통해서만 얻을 수 있다 . 휴리스틱 비용의 계산 방식을 결정할 때에는 검색속도와 경로의 품질 사이의 적절한 타협점을 찾아야 한다 .

Page 20: A* 의 속도 최적화

20

휴리스틱 비용의 과대평가 휴리스틱 비용을 아주 약간 과대평가하면 그럴듯한 ( 최적은 아니더라도 )

경로를 빠르게 얻을 수 있다 휴리스틱을 얼마나 과대평가해야 할까 ?

휴리스틱 비용은 “열린” 목록 중 어떤 노드를 우선 선택할 것인가의 판단에 영향을 미침

A* 는 항상 총 비용 ( 현재 노드까지의 비용 + 휴리스틱 비용 ) 이 가장 작은 노드를 선택하므로 , 휴리스틱 비용을 크게하면 목표에 좀 더 가까운 노드가 먼저 선택된다 .

휴리스틱이 0이면 검색된 노드들은 시작 지점을 중심으로 한 원을 이룬다 유클리드 거리를 휴리스틱 비용으로 사용하면 검색 노드의 모양은 시작과

목표를 초점들로 하는 타원형태가 된다 휴리스틱 비용을 과대평가하면 시작과 목표를 양 끝 모서리로 하는 마름모나

육각형 모양이 된다

Page 21: A* 의 속도 최적화

21

Page 22: A* 의 속도 최적화

22

Page 23: A* 의 속도 최적화

23

A* 는 각각의 검색 과정을 저장하기 위해 상당히 많은 양의 메모리 소비 격자 방식 – 각 칸마다 길찾기 노드 데이터 저장 다각형 메쉬 – 각 삼각형마다 노드 데이터 저장 => 하나의 검색이 검색 공간의 모든 노드들을 탐색하는 것은 아니므로 , 모든 노드들마다 검색에 필요한 메모리를 할당하는 것은 낭비

=> 검색공간으로부터 길찾기 데이터를 분리 ( 메모리 줄임 , 속도 향상됨 ) 최소량의 메모리를 미리 할당

한 번의 A* 검색에 충분할 정도의 메모리 블록을 미리 할당해 두고 매 번의 A* 검색마다 그것을 재사용하여 메모리의 할당과 해제에 따른 추가적인 부담을 최소화 한다 .

탐색을 마친 노드들을 마스터 노드 목록에 저장 마스터 노드 목록 : 노드 뱅크에서 가져온 탐색된 노드 (포인터 ) 를 담고

있는 목록 노드들의 빠른 조회를 위해서 열린 목록과 닫힌 목록을 적절한 저장공간 (

해시 테이블 ) 에 담아 두어 빠른 검색을 한다 .

Page 24: A* 의 속도 최적화

24

열린 목록의 최적화 A* 는 다음에 검색할 수 있는 모든 노드들을 ‘열린 목록’에

담아두고 그것을 유망한 순서대로 정렬한다 . 그리고 루프를 돌 때마다 ‘가장 유망한’ 노드를 고르는 작업을 한다 .

열린목록에 노드를 추가하거나 제거할 때 자동적으로 정렬상태가 유지되도록 하는 것이 중요하므로 자료구조로 우선 순위 큐 ( priority queue ) ( 이진 힙 (binary heap) ) 를 구현한다 .

Page 25: A* 의 속도 최적화

25

결 론 ( A* 속도 최적화 )1. 가장먼저 노력을 기울여야 할 부분은 게임 세계 ( 검색 공간 ) 자체를

좀더 단순한 방식으로 표현할 수 있도록 하는 일이다 .

2. A* 를 포함한 길찾기 엔진 자체가 제대로 작동하는지 살펴본다 .

3. 검색 공간으로부터 노드 데이터를 분리시키고 자료 구조를 최적화 한다 .

4. 휴리스틱 비용을 조정한다 .

5. 게이머의 ‘체감 시간’을 향상 시키기 위해 길찾기가 끝나지 않은 상황에서 유닛이 길을 알아차리고 움직이려 하는 것처럼 보이게 한다 .