RTS 게임 AI 스레드


14

실시간 전략 게임을 처음부터 시작하는 프로젝트가 있습니다. 나는 아직 초기 계획 단계에 있지만, 역학을보기 위해 약간의 프로그래밍을 해왔다.

프로그래밍 방법을 알고 있습니다. 또한 컴퓨터 플레이어를 위해 게임 클래스와 규칙 기반 (상태 머신) AI를 어떻게 구성 할 것인지 잘 알고 있습니다.

스카우트, 미션 루트 따르기, 위치 잡기 (적을 공격하는 사람을 공격하거나 압도 당할 때 퇴각)와 같은 특정 부대에 특정 행동을 주지만 동시에 여러 부대에서 사용할 수있는 교리를 개발하고 싶습니다. 등

교리는 단위에만 적용되므로 단위 관점을 가지게되며 전체지도 위치에 대해서는 알 수 없습니다.

컴퓨터 AI는 전체 가시성지도를 분석하고 다른 규칙 세트에 따라 각 유닛을 할당 할 소 트린을 결정합니다.

C #에서 OpenGL을 사용 하여이 작업을 수행하고 있습니다.

지금은 주요 개념을 시작하기 전에 테스트 할 것이 많지 않습니다. 모든 게임 처리 (업데이트 이동, 전투, 렌더링 등을 차례로 호출 할 곳)가 발생하는 게임 루프가 있는데 Application.Idle 이벤트 인 경우 매우 자주 호출됩니다.

나는 궁금했다. 게임 루프에는 처리해야 할 것이 많기 때문에 컴퓨터 AI와 유닛이 해당 루프에서 동작을 선택해야합니까, 아니면 너무 느려 야합니까?

모든 것을 동시에 처리하려면 컴퓨터 AI에 대해 별도의 스레드를 만들어야합니까? 아니면 모든 단위에 대해 별도의 스레드?

멀티 스레딩에 대한 경험이별로 없습니다. 가장 좋은 방법은 무엇입니까?


관련이 없음-OpenGL 대신 Ogre3D로 간주됩니까?

사실, 아니, 들어 본 적이 없습니다. 수업에서 가르쳤 기 때문에 OpenGL을 사용하고 있습니다. Ogre3D도 2D를 할 수 있습니까? 나는 그것이 가능하다고 생각하지만, 우리는 결코 모른다 ...

예, 자체 GUI 툴킷 (cegui)도 있습니다. 예를 들어 TorchLight가 내장되어 있습니다. OpenGL을 멋지게 감싸서 시간을 절약 할 수 있습니다. ogre3d.org/tikiwiki/MOGRE

"또는 모든 유닛에 대해 별도의 스레드"도 없습니다. 스레드의 오버 헤드가 너무 큽니다. 하나의 경우 스레드 스택에 예약 된 메모리가 있습니다 (기본적으로 1MB). 스레드 스위치도 비싸다.

답변:


3

"처음부터"는 무엇을 의미합니까? DirectX 대신 XNA와 같은 것을 사용할 수 있습니까?

매끄럽게 움직이려면 초당 30에서 60 프레임 사이의 무언가를 렌더링해야합니다. 더 많은 fps를 가질 필요는 없습니다.

렌더링 + 로직이 60fps가 제공하는 16ms 미만이면 AI 스레드가 필요하지 않습니다.

프레임 렌더링 사이에 시간이 충분 하지 않으면 모든 프레임을 업데이트 해야하는 것과 그렇지 않은 것에 대해 신중하게 생각 해야합니다 .

"doctrines"부분은 가능한 한 간단하고 효율적이어야하므로 최소한 눈에 보이는 단위와 주변의 다른 단위에 대해 모든 프레임을 업데이트 할 수 있어야합니다. 가시적 유닛에 직접 영향을 미치지 않는 유닛은 덜 빈번하게 업데이트 될 수있다 (따라서 더 큰 델타 T로).

주요 AI는 맵의 모든 유닛을 처리하고 전략을 파악해야하기 때문에 수행해야 할 작업이 많으므로 대부분의 계산 시간이 필요합니다. 별도의 스레드에 대한 첫 번째 후보입니다.

분대 레벨 AI와 같이 두 레이어 사이에 다른 레이어를 추가 할 수도 있습니다. 기본적으로 각 장치의 AI는 장치가 즉각적인 상황에 "지능적으로"반응하도록해야하므로 신속하고 신속하게 대응해야합니다. 분대 AI는 분대가 강을 건너야 할 경우 다리를 찾는 것과 같이 몇 초에 걸쳐 퍼져있는 여러 부대의 "지능형"행동을 담당합니다. 그리고 주요 AI는 오랜 시간 동안 많은 분대의 행동을 지시해야합니다.

특히 경험이 많지 않은 경우 필요하지 않은 경우 스레딩을 수행하지 마십시오. 추가 부담이 없으므로 복잡해집니다. 멀티 스레딩을 별도의 프로젝트로, 또는 작업 상태 에있는 경우이 프로젝트의 확장으로 배울 수 있습니다 . 행운을 빕니다!


0

인공 지능에 대한 별도의 스레드가 있습니다. 그러나 너무 많은 OS 리소스를 소비하고 동기화가 악몽이기 때문에 모든 장치에 대해 그런 것은 아닙니다.

AI 스레드가 실행할 기회를 찾도록하십시오. 메인 스레드가 너무 많은 일을하면 그 기회를 찾지 못할 수도 있습니다! AI 스레드에 우선 순위를두면 게임이 응답하지 않아 받아 들일 수 없습니다.

따라서 메인 루프에서 동기 점 및 / 또는 이벤트를 신중하게 선택하고 메인 스레드가 중지되는 동안 AI 스레드가 계산을 완료하도록합니다. 예를 들어, 사용자 장치에 다른 AI 장치가 있으면 동기화하여 장치가 업데이트 된 장치를 반대로 보도록합니다.


0

또한 RTS 게임을 처음부터 시작하고 있습니다. 아직 테스트하지는 않았지만 내 아이디어는 현재 플레이어가 볼 수있는 모든 장치 (플레이어가 실제로 볼 수있는 화면의 일부 또는 해당 화면의 경계 근처)에 대해 기본 게임 루프에서 AI를 실행하는 것이 었습니다. )를 사용하면 플레이어가 화면을 약간 이동할 가능성이 높습니다.

다른 장치는 별도의 스레드로 검사되며 두 가지 우선 순위가 있습니다. 1. 화면을 이동하면 사용자가 볼 수있는 장소에있는 장치. 2. 숨겨진 지역에있는 유닛 (아직 탐험되지 않은 "전쟁 안개").

초 우선 순위의 단위의 경우 루프를 덜 자주 실행하고 필요할 때 소급하여 이동하여 보상합니다.


1
매우 복잡하게 들립니다.

메인 게임 루프 안팎으로 유닛을 옮기는 것에 대한 첫 번째 부분을 제외하고는 아이디어가 좋습니다. 모든 AI는 자체 루프에서 수행해야합니다 x. 우선 순위가 낮은 단위 의 루프마다 반복 을 건너 뛰도록 선택할 수 있습니다 .
Olhovsky

0

멀티 스레드가 필요한지 여부에 관계없이 AI를 멀티 스레딩하도록 준비하는 것이 좋습니다.

메인 스레드는 월드를 업데이트하고 물리 등을 틱한 다음 AI의 월드 뷰를 나타내는 데이터 구조 (단위 위치, 리소스 상태 등)를 채 웁니다.이 데이터 구조는 기본 시스템을 캐시합니다. 그냥 포인터를 잡는 것보다 이를 동기화 지점이라고도합니다.

이 데이터 구조를 AI에 전달하고이 구조의 내용 만 추론하도록 허용하십시오. AI에 더 많은 정보가 필요한 경우 구조에 추가하십시오. AI 용어에서는이를 칠판이라고도하지만 캐시라고도합니다. AI가 캐시에 쓰지 않도록하십시오. 출력은 별도의 데이터 구조를 거쳐야합니다.

AI가 더 이상 다른 게임 시스템에 직접 의존하지 않기 때문에이 설정을 통해 게임을 병렬화 할 수 있습니다. 이러한 시스템은 스레드로부터 안전하지 않아도되며 잠금 상태가되어서는 안됩니다. AI가 울리는 동안 렌더러 나 무언가를 안전하게 실행할 수 있습니다.

두 번째 이점으로, 향후 다른 시스템에서 얻은 정보를 부패시켜 정확한 지식이 아닌 불확실성을 시뮬레이션함으로써 캐시를 확장 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.