2013-07-24 2 views
1

저는 C++를 사용하여 게임을 작성하고 있습니다. 내 게임 루프를 어떻게 최적화 할 수 있을지 궁금해. 예를 들어, 메인 루프가있는 게임은 다음과 같습니다.콜백 및 주요 게임 루프. 좋은 습관입니까?

while (gameContinue) { 
    if (SCENE == HELP_SCENE) { 
     renderHelpScene(); 
    } else if (SCENE == SCORE_SCENE) { 
     renderScoreScene(); 
    } else if (SCENE == MAIN_GAME_SCENE) { 
     renderMainGameScene(); 
    } // .... and many others scenes 
} 

이 코드를 더 빠르고 가볍게 만드는 방법을 생각하고 있습니다. 우리는 if-case가 많이 필요하지 않도록 콜백을 사용한다고 생각합니다. 다음과 같은 내용 :

typedef void (*callback_function)(void); 
callback_function renderFunc; 

void renderMainGameScene() { 
    renderFunc = renderScoreScene(); // set to another scene if we need this 
} 
void renderScoreScene() { 
    renderFunc = renderAnyAnotherSceneWeNeedNow(); 
} 

renderFunc = renderMainGameScene(); 
while (gameContinue) { 
    renderFunc(); 
} 

당신은 어떻게 생각하십니까? 메인 루프를 어떻게 구성합니까?

+2

게임에서 병목 현상이 발생하면 기쁘게 생각합니다. –

+1

가상'render' 메소드를 사용하는'AbstractScene'을 가지고 있지 않은 이유는 무엇입니까? 또한 위의 의견에 동의합니다. – Nbr44

답변

2

나는 개인적으로 멀티 스레딩을 사용하기 시작했습니다. 개체 업데이트 스레드, 개체 충돌 스레드 및 그리기 스레드가 있습니다. 각 스레드는 while (GetMessage())으로 반복되고 스레드는 메시지를 하나에서 다른 메시지로 보냅니다.

  • 업데이트 객체 (이동 상태 등)
  • 가 그리기 변성 개체

    1. 계산 충돌 각 사이클 (프레임)에서

      내 메인 루프는 각 스레드에 메시지를 보낸다 업데이트 된 개체

    그것이 내가하는 방법이다. (적어도 내 GDI/GDI + 게임에서는). 가장 좋은 방법인지는 모르지만 지금까지는 매력과 같이 작동합니다. :)

  • +0

    흥미로운 아이디어. 얼마나 많은 쓰레드가 있고, 쓰레드가 얼마나 상호 작용하는지, 그리고이 접근법의 확장 성은 무엇입니까? – DXsmiley

    +0

    지금까지, 나는 단지 ** 스레딩에 익숙해지기 위해 ** 작은 게임 **에서이 접근법을 테스트했습니다. 계산/업데이트를위한 1 스레드와 객체 그리기를위한 1 스레드가있는 CAD 소프트웨어에서이 아이디어를 얻었으므로 확장 성이 뛰어나다 고 생각합니다. 내가 그리는 3 개의 스레드 - 콜리 전, 업데이트 - 및 스레드 또는 주 루프를 다른 사람과 공유 할 수있는 뭔가가있는 경우 대상 스레드의 ID 및 사용자 지정 msg struct/class 전달하여 PostThreadMessage() 사용합니다. 수신 스레드()에서'while (GetMessage()) '으로 반복하고 내 사용자 지정 메시지 구조를 처리하는'switch()'를가집니다. –

    +3

    이 접근법의 위험성 (예 : 기본 스레드 안전성 http://en.wikipedia.org/wiki/Thread_safety)에 대해 메모 할 수 있습니다.또한 충돌은 개체의 위치에 크게 의존하는 경향이 있습니다. 개체의 위치는 업데이트 스레드에서 변경되는 것처럼 보입니다. – DXsmiley

    0

    콜백을 사용하는 것이 좋습니다. 헤더에 순환 종속성이 없도록주의하십시오. 컨트롤러 루프의 헤더를 컨트롤러 루프의 .cpp가 아닌 다른 위치에 포함시키는 것은 나쁜 생각입니다.

    런타임 이점에 대해서는 매우 작습니다. if-else 방법으로 게임 속도가 눈에 띄게 느려지지는 않습니다. 또는 switch 문도 있으며 이는 코드 가독성 측면에서 일련의 if-else 문보다 바람직합니다.

    1

    이런 종류의 문제에 대한 유용한 패턴은 State PatternStrategy Pattern입니다.
    보시다시피 둘 다 비슷합니다. Strategy 패턴은 State보다 조금 더 간단하지만, 대신 State Pattern은 이와 같이 게임 엔진에 더 강력하고 적합 할 것입니다. 예를 들어 게임 시작 -> 메뉴 -> 게임 실행 -> 메뉴를 사용하여 스택을 쉽게 만들 수도 있습니다.
    마지막 메뉴의 상위 상태가 게임 실행 인 경우 메뉴가 다르게 표시됩니다 (예 : 첫 번째 메뉴에서 "게임 시작"대신 "게임 반환"). 상태가 터지면 쉽게 탐색 할 수 있습니다.