luce in altisBLUE SKY

category Photo

Blog


AI 최적화 전략들

AI 최적화 전략들

Steve Rabin, Nintendo of America
steve_rabin(at)hotmail.com

복잡한 AI는 상당한 연산 능력을 요구한다. 수 많은 자동화 에이전트들이 지능적으로, 그리고 동시에 게임 세계를 돌아다니도록 하려면 더욱 더 많은 연산 능력이 필요하다. 그러나 AI의 최적화는 비교적 미개척 분야라 할 수 있다. 원래 게임은 기본적으로 실시간-병렬적인 특징이 크게 요구되는 응용 프로그램이지만, AI 분야는 특히나 더 그렇다. 모든 AI 에이전트들이 나름대로, 그것도 동시에 자신의 생각을 가지고 움직이는 것처럼 보이게 하는 것은 여전히 어려운 문제이다.

그러나 뒤집어 놓고 보면 이러한 어려움이야 말로 병렬성을 AI 분야의, 아직은 미개척된 무궁무진한 영역으로 만드는 있는 요인이라 할 수 있다. AI 에이전트들의 다른 고유한 특성들과 함께, 이러한 병렬성은 대부분의 AI 시스템들에서 최적화의 대상이자 수단이 될 수 있다. 다음의 최적화 전략들을 읽어나갈때, 수 백의 AI 에이전트들이 독자적인 행동과 원칙들을 가지고 '동시에' 움직인다는 그림을 머리 속에 담고 있길 바란다. 그런 거시적 차원의 관점을 유지하면 특정 전략의 구체적인 유용성을 좀 더 잘 이해할 수 있을 것이다.

전략 #1: 폴링 대신 이벤트 주도적 행동을 사용한다

이론적으로, 자동화 에이전트(autonomous agent)는 자신의 세계를 끊임없이 주시하고 그에 맞게 행동해야 한다. 매 프레임마다 에이전트들은 자신이 반응해야 할 사건 또는 객체들을 감지해야 한다. 여기에는 충돌 검출에서부터 자신과 관련있는 사건이나 물체에 대한 주목을 비롯한 모든 것들이 포함된다. 이러한 접근 방식의 문제는, 엄청난 양의 계산이 중복된다는 점이다. 즉, 일반적으로 개별적인 폴링(polling)은 낭비가 심하다고 할 수 있다.

이에 대한 대안은 최대한 이벤트 주도적(event-driven) 기법을 사용하는 것이다. 예를 들어서, 야구 게임에서 타자가 공을 치면 공은 야수들에게 '나 맞았어'라는 메시지를 보낸다고 하자. 이는 모든 야수들이 투수와 타자를 계속 주시하고 있는 것보다 훨씬 더 효율적이다. 이것은 이벤트 주도적 방식의 비교적 간단한 예라고 할 수 있으나, 좀 더 복잡하고 방대한 시스템에서 이러한 방식이 얼마나 도움이 될 것인지는 쉽게 짐작할 수 있을 것이다.

또 다른 예는 전장을 날아 가로지르는 화살이다. 일반적으로는 화살이 주체가 되어서 캐릭터들과의 충돌을 검출하게 될 것이다. 한 캐릭터에 적중된 화살은 캐릭터에게 충돌 사실과 충돌 지점을 알려준다. 캐릭터는 그에 반응해서 화살이 꽂힌 부위에 따라 적절한 행동을 취하게 된다. 이 정도가 이벤트 주도적 방식의 기초라고 할 수 있으나, 아직은 특별한 장점을 발견하지 못했을 것이다.

그럼 더 나아가서, 캐릭터가 화살을 피할 수도 있게 만든다고 하자. 그렇다면 캐릭터는 충돌이 일어나기 전에 화살이 날아오는 것을 알아야 한다. 만일 이를 폴링 방식으로 해결한다면, 전장의 모든 캐릭터들은 화살이 현재 어디로, 어떤 속도로 날아가고 있는지를 계속 주시해야 한다. 반면 이벤트 주도적 방식에서는 화살에 중점을 두고 있으므로 화살이 몇 프레임 후에, 그리고 어떤 캐릭터에 꽂힐 것인지 미리 알 수 있다. 따라서 캐릭터들은 화살에 신경쓰고 있지 않다가 때가 되어서 화살이 알려주기만을 기다리면 되는 것이다. 화살이 피하라고 알려주면, 캐릭터는 그에 따라 도망가거나, 웅크리거나, 피할 수 없는 상황이라면 그냥 화살을 맞을 수도 있을 것이다. 이런 방식에서는 모든 캐릭터들이 모든 화살들을 주시하지 않고도 그럴듯한 행동이 일어나도록 만들 수 있다.

이벤트 주도적 AI 시스템의 좋은 예가 Game Programming Gems 1권의 "범용적이고 견고한 AI 엔진의 설계"[Rabin00a]에 설명되어 있다.

전략 #2: 중복된 계산을 줄인다

이 전략의 목표는 여러 AI 에이전트들이 자신의 계산, 처리 결과를 공유하게 만듦으로써 불필요한 중복 계산을 줄이자는 데 있다. 에이전트들은 동일한 정보를 개별적으로 다시 계산하는 경우가 많다. 만일 이미 얻은 정보를 서로 공유할 수 있다면 시간을 상당히 줄일 수 있을 것이다. 이에 대한 간단한 예는 충돌 검출에서 찾을 수 있다. 만일 모든 객체들이 자신의 간단한 충돌 점검을 수행한다면, 시간 복잡도는 O(n^2-n)이 된다. 즉 객체들이 100개이면 9900번의 점검이 일어나게 되는 것이다. 그러나 한 쌍의 객체들에 대한 점검은 한 번만 이루어지면 되므로, 알고리즘의 시간 복잡도는 O((n^2-n)/2)로 줄어든다(100개의 객체이면 4950번의 계산). 이러한 계산 감소는 중복 작업의 제거를 통해 직접적으로 얻게 되는 것이다.

길찾기에서도 이러한 예를 찾을 수 있다. 플레이어가 마우스로 여러 개의 유닛들을 지정한 다음, 모두 맵의 다른 편으로 이동하도록 명령했다고 하자. 이런 경우 각 유닛들이 독자적으로 길찾기 알고리즘을 수행하는 것보다는, 한 유닛만 길찾기를 수행하고 나머지는 그 유닛을 따라가는 것이 훨씬 더 효율적일 것이다. 그렇게 되면 거의 동일한 경로들이 반복적으로 계산되는 일을 피할 수 있으므로 상당한 시간을 절약할 수 있다.

전략 #3: 관리자를 통한 협동의 집중화

에이전트들은 종종 다른 에이전트들과 협동해야 하는 경우가 있다(분대원, 축구팀 등등). 여러 에이전트들이 서로 협동해서 뭔가를 하게 할 때, 하나의 관리자를 두고 복잡한 결정을 전적으로 관리자에게 위임하면 AI를 좀 더 빠르고 간단하게 만들 수 있다. 관리자는 멤버 에이전트들에게 각각의 역할을 지시하게 되며, 실제로 지시된 역할을 어떻게 수행할 것인지는 에이전트의 고유한 AI가 판단하게 된다.

예를 들어서 SWAT 팀이 건물에 침투한다고 하자. 각자의 안전을 보장하면서 효과적으로 건물에 침투하려면 서로 밀접한 협동이 필요하다. 만일 대원들 각자가 자신의 행동을 판단해야 한다면, 효율적인 협동을 위해서는 대원들 간의 상당한 의사소통이 요구될 것이다. 그 대신 하나의 팀장(관리자)이 작전의 각 단계들을 계획하고 개별 대원에게 중간 목표들을 지정한다면 보다 효율적일 수 있다. 뿐만 아니라, 직관적인 이해나 견고하고 효율적인 설계에도 도움이 된다. 야구팀에서의 관리자 중심의 협동에 관한 예가 [Rabin98]에 나와 있다.

이 전략에서는 관리자가 반드시 화면에 나타나는 객체일 필요가 없다는 점이 중요하다. 일반적으로 그러한 관리자는 AI 에이전트들 사이의 복잡한 협동을 조직화하는 가상의 개체일 것이다(역주: 예를 들어, Black & White에서 주민들에게 일거리(벌목, 경작, 건설 등등)를 지시하는 것은 주민 중 한 사람이 아니라 마을 회관이라고 한다. Game Developer 한국어판 7월호 참고). 또는 게임 실행 도중 임의적으로 묶여진 개체들 중 하나를 임시적인 관리자로 삼을 수도 있을 것이다. 그 그룹이 나뉘어지거나 다른 그룹과 합쳐지는 경우에는 새로운 관리자를 배정하면 된다. 이런 식으로 정해지는 관리자는 각 개체에게 공격 대상을 배정함으로써 모든 적들이 한 명의 유닛에 몰려드는 현상을 막을 수 있을 것이며, 또는 주된 공격 대상을 정해서 집중적으로 피해를 입히는 결정을 내릴 수도 있을 것이다. 어떤 경우이든 개별 객체가 나름대로 공격 대상을 정함으로써 생기는 비효율은 피할 수 있다.

전략 #4: AI의 실행 횟수를 줄인다

AI 에이전트가 매 프레임마다 모든 의사 결정 과정을 거쳐야 하는 경우는 별로 없다. 대부분은 에이전트가 2-3 프레임마다 또는 2-3초마다 AI 코드의 일부만 수행해도 무방하다. 실제 생물들은 반응 시간(reaction time, 反應 時間)이라는 것을 가지고 있으므로, AI 에이전트가 사건에 대해 즉각적으로 반응하지 못하는 것이 단점이 되지는 않으며, 오히려 더 자연스러워 보일 수도 있다. 또한 AI 처리에 들어가는 시간을 절약할 수 있다는 장점도 제공한다.

이러한 시간 지연 전략을 구현하는 한 가지 좋은 방법은 에이전트 구조에 임의의 타이머 콜백 메커니즘을 끼워 넣는 것이다. 간단한 과정만으로도 에이전트가 타이머를 설정할 수 있게 한다면(그리고 그 타이머가 끝났을 때 통지를 받을 수 있게 한다면), 시스템이 매우 유연해지며 조율도 쉬워진다. 이러한 전략을 잘 보여주는 예가 Game Programming Gems 1권의 "범용적이고 견고한 AI 엔진의 설계"[Rabin00a]에 나와 있는 타이머 메시징 시스템이다.

이 전략이 지닌 한 가지 문제는, AI 프로세싱 처리 부담이 순간적으로 급격히 올라갈 수 있다는 점이다. 모든 에이전트들이 지금부터 10초 후에 뭔가가 일어나도록 타이머를 맞춰 놓았다면, 10초 후에는 AI 시스템이 대단히 바빠지게 된다. 이에 대한 간단한 해결책은 각 에이전트마다 개별적인 시간 범위를 배정하는 것이다. 예를 들면 하나의 에이전트에 대해서는 매 0.3에서 0.5 초 사이의 범위에서 무작위로 선택된 시간마다 자신의 침입자 감시 코드를 실행하도록 만들 수도 있을 것이다. 이렇게 하면 모든 에이전트들이 동시에 뭔가를 수행하려는, 그래서 처리 부담이 갑자기 치솟는 사태를 피할 수 있다.

전략 #5: 처리 부담을 여러 프레임들로 분산시킨다

일반적으로, AI 부분 중 CPU 사이클를 가장 많이 잡아먹는 것은 A* 길찾기이다. 그런데 길찾기의 대상이 되는 검색 공간은 두 세 프레임만에 크게 변하는 것이 아니므로, 길찾기 계산을 여러 프레임들에 걸쳐 나눠서 수행하는 것이 가능하다. 각 프레임에서의 결과를 보존하고 그것을 다음 프레임에서 이어서 수행하게 만들면, 하나의 경로를 24프레임에 걸쳐서 결정하는 것도 불가능하지 않다. 이런 접근 방식을 사용하면 프레임 당 처리 부담이 줄어든다. 물론 이것은 A* 길찾기에만 해당되는 이야기가 아니다. 최종 결론이 날때까지의 시간을 미리 결정할 수 없는 알고리즘이라면 어떠한 것에도 이와 같은 방식을 적용할 수 있을 것이다.

이 전략은 한 모듈(예를 들면 길찾기 모듈) 안에서의 하나의 특별한 경우로서 구현할 수도 있고, 아니면 AI 시스템의 일부로 통합시킬 수도 있다. 이 책의 다음 글인 Bruce Dawson의 "게임 객체 AI를 위한 미시적 스레드"에서는 미시적 스레드 전략을 이용해서 AI 처리 부담을 최소화하는 방법을 설명한다. 미시적 스레드 구조를 사용하면 AI 에이전트가 계산 부담을 여러 프레임들로 분산시키는 것이 매우 용이해진다. 또한, 처리 부담을 세밀하게 조정하는 데에도 도움이 된다. Bruce의 글 다음에는 Simon Carter의 "미시적 스레드를 통한 AI 관리"가 나오는데, 이 글은 미시적 스레드 환경 안에서 최적의 AI 구조를 만드는 방법에 대해 설명한다.

전략 #6: 세부수준 AI의 적용

세부수준(level-of-detail, LOD)이라는 개념은 그래픽 이외의 분야에서도 많이 쓰이는 현명한 최적화 방법이다. 현재 대부분의 게임 엔진들은 멀리 떨어져 있는 객체들을 빠르게 렌더링하는 문제에 대해 그래픽적인 LOD를 사용한다. 이러한 LOD의 개념은 매우 간단하다. 카메라로부터 멀리 떨어져 있는 객체에는 다각형 갯수가 적은 모델을 사용하고, 객체가 카메라와 가까울 수록 다각형 갯수가 많은 모델을 사용한다는 것이다. 이에 의해 게임의 시각적 품질을 거의 떨어뜨리지 않고도 렌더링 속도를 크게 높일 수 있다. 최근 들어, 이러한 세부수준 개념을 AI 같은 다른 게임 프로그래밍 분야에도 적용할 수 있다는 사실이 인식되고 있다(역주: 이에 대해서는 Game Developer 한국어판 9월호 "2000-2001 게임 AI의 현주소"를 참고할 것).

현실적으로, AI를 위한 LOD 기법은 세 가지 전략들로 나뉘어진다. 첫 번째는 에이전트와 카메라나 플레이어, 사건과의 거리 또는 연관성에 따라 AI의 처리 빈도를 다르게 하는 것이다. 두 번째는 연관성에 따라 에이전트 알고리즘의 복잡성을 다르게 하는 것이다 (예를 들어서 에이전트가 화면 밖에 있으면 경로 찾기의 정확성을 떨어뜨리는 등). 세 번째는 여러 에이전트들의 개별적 특성이 플레이어에게 별로 중요하지 않게 되면 여러 에이전트들을 하나의 단일한 시뮬레이션 알고리즘으로 처리해 버리는 것이다. 세 번째 방식의 극단적인 예는, 화면에 나타나는 전투 장면에서는 병사들과 총알들을 개별적으로 처리하되, 보이지 않는 곳에서 벌어지는 전투는 그 승패를 그냥 간단한 공식으로 단 번에 판정하는 것이다.

세부수준 AI의 개념을 아주 간단하게 말하면, 플레이어의 주목을 끌지 못하는 부분은 작업을 줄여서 부담을 최소화한다는 것이다. 물론 플레이어가 보기에 뭔가 잘못되었거나 다르게 느낄 만한 부분이라면(이는 그래픽 LOD에서의 '튀어 보일만한 부분'에 해당된다) 다시 세밀한 처리를 수행해야 한다.

전략 #7: 문제의 일부분만 해결한다.

어떤 경우에는 하나의 커다란 문제가 주어졌을 때 당장 필요한 부분만 해결하는 것으로도 충분할 수 있다. 나머지 부분은 나중에 실제로 필요해졌을 때 해결하면 된다. 때로는 미뤄뒀던 문제가 상황의 변화에 따라 아예 사라져 버리기도 한다. 이 전략은 '소극적 계산법(lazy evaluation)'과 매우 비슷하다. 이러한 전략을 가장 잘 보여주는 예는 계통적 길찾기(hierarchical pathfinding)이다. 계통적 길찾기에서는, 우선 목표에 이르기 위한 방에서 방으로의 경로를 계산한다. 그런 다음에는 각 방에 도달할 때마다 그 방에서 다음 방으로 가기 위한 세부적인 경로를 계산한다. 만일 어떠한 이유로 해서 캐릭터의 목표 자체가 바뀌었다면, 나머지 경로는 더 이상 계산할 필요가 없어진다. 이러한 점진적인 길찾기는 상당한 속도 향상을 불러온다. 탐색할 공간이 방대한 게임이라면 이와 같은 장점이 매우 유용할 것이다. 계통적 길찾기에 대한 개념과 구현에 대해서는 [Rabin00b]를 참고하기 바란다.

전략 #8: 힘든 일은 미리 처리한다

종종 실시간으로 처리하기에는 너무 어려운 문제도 만나게 된다. 게임 개발의 초창기에는 코사인값 하나 얻는 것에도 매우 많은 시간이 걸렸다. 그래서 코사인 값들을 미리 계산해 테이블에 담아두고 실행 시점에서 참조하는 기법을 즐겨 사용했다. 오늘날 그와 같은 기법 자체는 별 의미가 없지만, 기법에 담긴 기본적인 전략은 여전히 유효하다.

요즘은 이런 전략이 BSP를 미리 계산해 둔다던가, 지형을 미리 분석해 둔다던가, 신경망을 미리 잘 훈련시켜 놓는다던가 하는 예들에서 활용되고 있다. 이 섹션의 글들 중 William van der Sterren의 "3D 액션 게임을 위한 지형 분석"과 Thomas Young의 "가시성 길찾기를 위한 확장된 기하 구조", 그리고 John Manslow의 "게임에서의 신경망 활용: 구체적인 예"에서 이 전략이 쓰이고 있다. 각 글들은 정보를 미리 분석하고, 수정하고, 저장함으로써 실행 시점에서는 단 한 순간의 조회만으로도 의사결정과 판단에 필요한 정보를 얻을 수 있게 만드는 다양한 방법들을 설명한다. 이러한 전략은, 수 천시간의 지혜로 얻어 낸 단 몇 킬로바이트의 데이터로 엄청난 CPU 사이클들을 절약할 수 있게 만들어 준다는 점에서 매우 강력한 최적화 전략이라 할 수 있다.

전략 #9: 창발적 행동으로 스크립팅의 필요성을 제거한다

이 전략은 방금 전 전략의 반대라 할 수 있다. 게임 세계를 채울 수 백의 배경 AI 개체들을 위한 행동이나 스크립트를 미리 준비하기에는 시간이 부족하거나 너무 번거로운 경우가 있다. 이에 대한 해결책은 간단한 규칙들만으로 지능적이고 창발적인 행동(emergence behavior, 創發的 行動)이 나타나도록 만드는 것이다. 이 책에 수록된 Steven Woodcock의 "먹고 먹히는 플로킹: 포식자와 먹이"에서는, 개체들의 행동 방식을 미리 정해주지 않아도 매우 복잡하며 흥미로운, 그리고 실제 생물과 흡사한 행동이 일어나도록 하는데 플로킹이 어떤 도움을 주는지 설명하고 있다.

그러나 이 전략은 양날의 검과 같아서, 사전 처리 작업의 양은 크게 줄일 수 있는 반면, 객체들의 행동은 완전히 제어할 수 없다는 문제점을 가지고 있다. Steven의 글에는 서로가 서로를 잡아먹는 생물들로 가득찬 하나의 세계가 등장한다. 이런 세계에서는 포식자가 먹이들을 모두 잡아먹어서 결국은 스스로도 멸망하는, 그래서 생태계 자체가 소멸되어 버리는 일도 일어날 수 있다. 창발적 행동은 본질적으로 예측불가능하며, 신중한 검증이 매우 어렵다. 따라서 이 전략은 게임의 진행이나 완료에 큰 영향이 없는, 비교적 덜 중요한 AI 개체들(예를 들면 배경에서 돌아다니는 생물들)에 적합하다.

전략 #10: 연속적인 갱신을 통한 상각된 질의 비용

종종 지능적인 결정을 위해 상당히 많은 양의 데이터를 모아야 하는 경우가 있다. 그러한 데이터를 필요한 즉시 모으는 작업에는 상당한 시간이 걸리게 된다. 이에 대한 해결책은 데이터가 변할 때마다 계속 데이터 구조를 갱신하는 것이다. 데이터 관리에 보다 많은 시간과 메모리가 소요되긴 하겠지만, 프레임들이 흘러갈수록 그에 필요한 비용은 점차로 상각된다(amortize, 償却. 점차로 줄어드는 것). 그 결과, 데이터에 대한 단순한 질의 때문에 프레임율이 뚝 떨어지는 일은 없어진다.

이러한 전략이 실제로 쓰이는 예는 세력분포도(influence map)이다. 세력분포도는 전반적인 상황 분석에 쓰이는 것으로, 그러한 상황 분석은 AI의 의사결정 속도를 빠르게 만든다. 게임이 진행됨에 따라, 유닛들의 상태 정보(이동, 전투, 소멸 등)는 세력분포도에 꾸준히 반영된다. 이미 데이터가 지속적으로 갱신되어 왔기 때문에, 전반적인 전략 AI가 게임 세계를 분석해야 할 때가 되어도 특별히 할 일은 없다. 그냥 데이터를 읽어서 참고하면 되는 것이다. 이런 방식이면 속도에 큰 영향을 미치지 않고도 세력분포도를 빠르게 조회할 수 있다. 이 책에 수록된 Paul Tozour의 "세력분포도"에서 세력분포도의 자세한 개념과 활용 방법을 배우게 될 것이다.

이 전략은 또한, 역시 이 책에 수록된 Matt Pritchard의 "고성능 타일 기반 가시선 및 검색 시스템"에서도 핵심적 역할을 한다. Matt는 이 전략을 이용해서 수 백개의 에이전트들에 대한 시선(line-of-sight) 데이터를 실시간으로 관리, 갱신한다. 이는 간단한 일이 아니다. 전운(fog-of-war, 戰雲)이나 미니맵, 그리고 일반적인 AI에서 이러한 프레임 단위의 정확성을 보장하는 RTS 게임들은 그리 많지 않다. Matt는 AI 면에서도 호평을 받은 바 있는 Age of Empires에 쓰인 기법들과 전략들을 남김없이 설명하고 있다.

전략 #11: 문제를 다시 생각하라

Michael Abrash는 게임 개발 공동체에서 최적화 고수로 널리 알려져 있으며, 또한 그래픽 연구 분야의 주도적인 인물이기도 하다. 그는 강연에서나 논문에서나[Abrash00] 코드의 속도를 새로운 차원으로 끌어올리기 위해서는 문제를 다시 생각하는 것이 중요하다고 강조하곤 한다. 그의 주된 주장은, 코드의 특정 부분을 최적화하는 것으로 얻을 수 있는 성능 향상은 크지 않다는 것이다. 진정한 향상은 문제를 약간 다른 관점에서, 다른 접근 방식이나 알고리즘으로 공략할 때 이루어진다.

이 전략은 이 책에 수록된 Michael Zarozinski의 "퍼지 시스템에서의 조합적 폭발"에서 잘 설명되어 있다. 그 글에서 Michael은 Combs 방법이라는, 기존 퍼지 시스템의 지수적(exponential) 특성을 완전히 회피하는 새로운 알고리즘을 설명한다. 새로운 알고리즘으로 얻게 되는 결과와 기존 결과가 완전히 동일한 것은 아니지만 차이가 크지 않으므로, 특별한 경우가 아니라면 그 정도로도 충분할 것이다. 또한 그 알고리즘은 퍼지 논리의 구현과 게임 시스템으로의 통합도 단순화시킨다.

문제를 다른 관점에서 다시 생각한다는 것은 최적화에 대한 가장 좋은 조언이라고 할 수 있다. 다시 생각하는 것으로부터 모든 최적화 기법들이 자라나게 된다. 코드를 진정으로 최적화할 수 있는 새로운 도약은 문제를 재정의하고, 추상화하고, 새로운 비유를 생각해 냄으로써, 즉 관점을 바꿈으로써만 일어날 수 있다. 그러한 도약을 자주 경험할 수는 없겠지만, 다른 사람들의 경험이나 글들을 통해서 그들의 도약을 배우고 비슷한 문제에 적용한다면 좋은 결과를 얻을 수 있을 것이다.

결론

AI 시스템에서 마주치게 되는 문제들을 최적화하려면 약간 다른 관점을 지녀야 한다. AI 시스템의 개발 도중 도저히 최적화할 수 없을 것 같은 문제를 만나게 된다면 다음의 전략 목록들을 한 번 훑어보기 바란다. 하나의 문제를 바라보는 방식은 수없이 많다는 점을 염두에 두고 다음 목록을 한 번 훝어보면, 각 전략을 현재의 문제에 적용할 수 있는 방법이 떠오르게 될 것이다. 다음은 이 글에서 이야기한 전략들을 요약한 것이다.

  1. 폴링 대신 이벤트 주도적 행동을 사용한다
  2. 중복된 계산을 줄인다
  3. 관리자를 통한 협동의 집중화
  4. AI의 실행 횟수를 줄인다
  5. 처리 부담을 여러 프레임들로 분산시킨다
  6. 세부수준 AI의 적용
  7. 문제의 일부분만 해결한다.
  8. 힘든 일은 미리 처리한다
  9. 창발적 행동으로 스크립팅의 필요성을 제거한다
  10. 연속적인 갱신을 통한 상각된 질의 비용
  11. 문제를 다시 생각하라

이후에 나오는 각 글들을 읽어나가면서, 이러한 최적화 전략들이 어떻게 적용되는지도 점검해 보기 바란다. 전략들은 대단히 많지만, 본질적으로 다른 문제들이 동일한 전략으로 해결되는 것을 보면 항상 흥미롭다. 그러한 연결을 간파할 수 있는 사람이 바로 천재이다.

'게임 > AI' 카테고리의 다른 글

SVM(Support Vector Machines)  (0) 2017.05.23
<작업 일지> 아이엔젤..  (0) 2011.03.07