2008-09-16 11 views
2

저는 C + +로 유명한 플래시 게임 인 Chrontron을 "에뮬레이트"하고 싶었고 시작하는 데 도움이 필요했습니다. (참고 : 출시 용이 아닌, 직접 연습하는 것)병렬 처리를 사용하여 C++로 게임 만들기

 
Basics: 
Player has a time machine. On each iteration of using the time machine, a parallel state 
is created, co-existing with a previous state. One of the states must complete all the 
objectives of the level before ending the stage. In addition, all the stages must be able 
to end the stage normally, without causing a state paradox (wherein they should have 
been able to finish the stage normally but, due to the interactions of another state, 
were not). 

이렇게 게임의 작동 원리를 설명합니다. 당신은 정말로 내 문제가 무엇인지 이해하려면 비트를 재생해야합니다. 나는이 시간을 기준으로 시간을 기준으로 아마 중 해시지도가 될 각 상태 , 또는 을 반복 할 링크 된 목록을 저장하기 위해 연결리스트를 사용하는 것입니다 해결하는 좋은 방법을 생각하고

. 나는 아직도 확신이 없다.

실제 질문 :

을 지금은 약간 거친 사양을 가지고, 내가 도움이 사용하는 데이터 구조를 결정, 왜해야합니다. 또한 SDL, OpenGL 또는 DirectX (현재 현재 선택 사항은 SDL)를 위해 어떤 그래픽 API/레이어를 사용해야하는지 알고 싶습니다. 그리고 어떻게 병렬 상태를 구현할 것인가? 병렬 스레드?

EDIT (더 명확히하기 위해) :
OS - 윈도우
그래픽 (이 취미 프로젝트이기 때문에, 나중에 리눅스에서이 작업을 수행 할 수 있음) - 2D 언어 - C++ (C++해야합니다 -이 SDL : OpenGL은 : 직접 X
Q-답변 : 피
Q가-답변 병렬 처리 : 사용 STL 구현 시간 단계 작업 과정 다음 학기)

Q-답변이없는위한 방법입니다. 질문에 덧붙이

 
So far from what people have said, I should: 
1. Use STL to store actions. 
2. Iterate through actions based on time-step. 
3. Forget parallel processing -- period. (But I'd still like some pointers as to how it 
could be used and in what cases it should be used, since this is for practice). 

, 나는 주로 내가 유능한 프로그래머로 자신을 설명 할 것이다 그래서 전 C#을, PHP, 자바를 사용했습니다. 어떤 C++ 특정 지식이 나를 위해이 프로젝트를 더 쉽게 만들 수 있을까요? (즉, 벡터?)

답변

6

"고정 시간 단계"게임 루프를 먼저 읽고 이해해야합니다 (여기에 좋은 설명이 있습니다 : http://www.gaffer.org/game-physics/fix-your-timestep).

그러면 프레임 카운터와 동작의 쌍 목록을 유지하는 것이 좋습니다. STL 예 :

std::list<std::list<std::pair<unsigned long, Action> > > state; 

또는 아마도 쌍 목록의 벡터 일 수 있습니다. 상태를 만들려면 프레임 번호를 저장하고 액션이 수행되는 모든 액션 (플레이어 상호 작용)에 대해 액션이 단순히 "키 < X>"또는 "< X> 키가 해제 된 경우 최상의 결과를 얻을 수 있습니다 "이전의 상태를 재생하려면

state.back().push_back(std::make_pair(currentFrame, VK_LEFT | KEY_PRESSED)); 

, 당신은 프레임 카운터를 플레이어가 타임머신을 활성화 할 때마다 다시 설정해야하고 각 이전 상태에 대한 상태 목록을 반복하고 일치하는지 확인하려는 현재 프레임. 있는 경우 해당 상태에 대한 작업을 수행하십시오. 최적화를 위해 각 이전 상태 목록에있는 위치에 반복자 목록을 보관할 수 있습니다.여기에 몇 가지 의사 코드입니다 : 단순히 크게 문제를 복잡하게 할

별도의 스레드 난 당신이 아이디어를 얻을 희망

typedef std::list<std::pair<unsigned long, Action> > StateList; 
std::list<StateList::iterator> stateIteratorList; 
// 
foreach(it in stateIteratorList) 
{ 
    if(it->first == currentFrame) 
    { 
    performAction(it->second); 
    ++it; 
    } 
} 

..., 당신이 같은 결과마다 얻을 이런 식으로, 어떤 별도의 스레드 (실제로 어떻게 구현되는지는 알 수 없음) 또는 고정되지 않은 시간 단계 게임 루프를 사용하여이를 보장 할 수는 없습니다.

그래픽 API의 경우 SDL을 사용하면 가장 쉽게 시작할 수 있습니다. 나중에 3D로 이동하려면 나중에 SDL에서 OpenGL을 사용할 수 있습니다.

+0

이것에 대한 훌륭한 세부 사항에 감사드립니다. 이것은 실제로 이것을위한 좋은 해결책처럼 보입니다. 그것과 함께 사용하는 그래픽 엔진에 대한 권장 사항은 무엇입니까? – apandit

+0

SDL을 사용하면 쉽게 시작할 수 있습니다. 나중에 3D로 이동하려면 나중에 SDL에서 OpenGL을 사용할 수 있습니다. –

+0

OGRE는 C++ 용 2D73D 게임 엔진입니다. –

1

나는이 게임을 전에 연주했다. 병렬 처리가 반드시 필요하다고 생각하지 않습니다. 게임에서 (레버, 상자, 엘리베이터 등) 프로세스간에 공유해야하는 오브젝트를 공유하고 모든 델타를 공유 할 수 있으므로 병렬 처리의 효과가 감소합니다.

필자는 개인적으로 작업 목록을 유지하고 이후의 반복마다 함께 인터리빙을 시작합니다. 예를 들어 목록의 형식이 < [iteration.action]>이면 세 번째로 작업 1.1, 2.1, 3.1, 1.2, 2.2, 3.3 등이 실행됩니다.

+0

그리고 연관 배열처럼 키를 사용하여 이러한 동작을 저장하겠습니까? – apandit

+0

단계 사이에 일정한 시간 프레임이있는 한 간단한 목록 만 수행하면됩니다. 키 사용에 문제는 없지만 단순 해 보입니다. –

0

설명을 간략하게 요약 한 후 당신이 올바른 생각을 가지고 있다고 생각합니다. 상태 데이터를 보유하고있는 상태 객체를 가지고 링크 된 목록에 배치해야합니다 ... 저는 병렬 스레드가 필요하지 않다고 생각합니다.

까지 그래픽 API, 나는 단지 OpenGL을 사용했고, 꽤 강력하고 좋은 C/C++ API를 가지고 있다고 말할 수있다. OpenGL은 * Nix 컴퓨터에서 messa 라이브러리를 사용할 수 있기 때문에 더 많은 크로스 플랫폼이 될 수도있다.

0

매우 흥미로운 게임 아이디어입니다. 나는 당신이 parrellel 컴퓨팅이이 디자인에 유익 할 것이라고 생각하지만 다른 높은 리소스 프로그램은 없다.

질문은 다소 모호합니다. C++에서이 글을 쓸 것입니다.하지만 어떤 OS를 코딩하고 있습니까?3D, 2D, 하이 엔드, 웹 기반 등 어떤 종류의 그래픽을 사용 하시겠습니까?

기본적으로 더 많은 정보가 필요합니다.

0

병렬 처리가 답이 아닙니다. 플레이어 동작을 단순히 기록한 다음 "이전 동작"에 대해 재생해야합니다.

이렇게하면 동작을 포함하는 벡터의 벡터 (단일 연결 목록)를 만들 수 있습니다. 단순히 해당 액션이 수행 된 프레임 번호 (또는 델타)를 저장하고 특정 인스턴스 동안 플레이어를 나타내는 "더미 로봇"에 해당 작업을 완료하십시오. 단순히 상태를 반복하여 차례로 트리거합니다.

다음 작업이 실패하기 때문에 상태 패러독스가 발생했을 때 게임을 쉽게 "파괴"하는 부작용이 있습니다.

0

자신의 교육을 위해 C++을 필사적으로 사용하지 않는 한, & 그래픽 프레임 워크 (C# 사용)는 XNA이어야합니다. 완전히 무료이며, 많은 일을 할 수 있으며 곧 Xbox Live에서 게임을 판매 할 수 있습니다.

주요 질문에 답하려면 Flash에서 이미 수행 할 수있는 작업이 두 개 이상의 스레드를 사용해야합니다. 배열의 위치 목록을 저장하고 각 로봇마다 다른 오프셋을 사용하여 반복하십시오.

5

이 메시지는 Braid과 매우 비슷합니다. 병렬 처리가 하드 인 병렬 처리를 원하지는 않으며 이와 같은 경우 성능이 문제가되지 않아야합니다.

게임 상태 벡터가 매우 빠르게 증가하기 때문에 (아마도 프레임 속도와 저장하는 데이터의 양에 따라 초당 수 킬로바이트의 순서로), 링크 된 목록을 원하지 않습니다. 공간 측면에서 오버 헤드가 발생합니다 (캐시 미스로 인해 성능이 저하 될 수 있습니다). 각 병렬 타임 라인에 대해 벡터 데이터 구조가 필요합니다. 각 병렬 타임 라인을 링크 된 목록에 저장할 수 있습니다. 각 타임 라인은 시작 시점을 알고 있습니다.

게임을 실행하려면 모든 활성 타임 라인을 반복하고 잠금 단계에서 각 프레임에서 한 프레임 상당의 액션을 수행합니다. 병렬 처리가 필요 없습니다.