게임 구동 중에서 중요한 부분 중 하나라 할수 있는 프레임 단위 처리 부분을 보겠습니다.
NIApplicationProcess() 함수를 살펴 보면 밑의 코드와 같이 이루어져 있습니다.
bool NiApplication::Process()
{
    MSG kMsg;
    if (PeekMessage(&kMsg, NULL, 0, 0, PM_REMOVE))
    {
        if (kMsg.message == WM_QUIT)
            return false;
        
        if (!TranslateAccelerator(NiApplication::ms_pkApplication->
            GetAppWindow()->GetWindowReference(), 
            NiApplication::ms_pkApplication->GetAcceleratorReference(), 
            &kMsg))
        {
            TranslateMessage(&kMsg);
            DispatchMessage(&kMsg);
        }
    }
    else
    {
        NiApplication::ms_pkApplication->OnIdle();
    }

    return true;
}
OnIdle() 함수를 호출하고 있는 것을 알수 있습니다.
OnIdle() 함수도 한번 살펴보면...
void NiApplication::OnIdle(void)
{
    // MeasureTime returns false if the frame rate is over the pre-set limit
    if (!MeasureTime())
        return;

    ResetFrameTimings();
    
    BeginUpdate();
    UpdateFrame();
    EndUpdate();

    if (m_bUseFrameSystem || m_spRenderer != NULL)
    {
        BeginFrame();
        RenderFrame();
        EndFrame();

        DisplayFrame();

        UpdateVisualTrackers();
    }

    UpdateMetrics();

    m_iClicks++;

    if ((m_fAccumTime >= m_fAppEndTime) && (m_fAppEndTime != NI_INFINITY))
    {
        QuitApplication();
    }
}
위와 같이 이루어져 있습니다.
별거 없죠. ResetFrameTimings()으로 경과 시간을 초기화 해주고, BeginUpdate(), UpdateFrame(), EndUpdate() 함수로 프레임 단위 처리를 수행합니다. 그리고 BeginFrame(), RenderFrame(), EndFrame()으로 그리기 전처리, 그리기, 그리기 후처리를 실행합니다.

실게임 제작을 하게 되면 이 부분들을 통해 대부분 작업을 하고 게임이 실행되겠죠. 일단 튜토리얼 분석이 끝나면 NiApplication을 자체 제작해보까 합니다. 지금은 너무 한 클래스에 다 때려박은 기분이라 실제작에는 적합하지 않은 듯 하더군요.

+ Recent posts