이번에 팀에서 GameBryo R&D를 진행 중입니다. 차기작을 위한 준비죠. 수 개월 내에 간단한 프로토타입을 내놓기로 했는데, 일단 구조 설계 중입니다. 그래서 이런저런 토의를 하면서 프레임워크 구조 잡는 것 부터 하고 있습니다. 저는 스터디용으로 제작하던 엔진도 있고해서, 지금 사용 중인 방식을 의견으로 내놓았죠. ( 아직 딱히 이렇게 하자 정해진 상태는 없음 )

void CFramework::Run( HWND hWnd )
{
	// 핸들이 없으면 종료
	if( hWnd == NULL )
		return;

	m_hWnd = hWnd;

	// 커널 생성
	if( CreateKernel() )
	{
		if( OnInitialize() )
		{
			// 루프에 돌임
			ProcLoop();
		}
	}

	Cleanup();
}

단순합니다. 생성된 윈도우 핸들을 받아 커널을 생성하고, 게임 실행에 필요한 초기화를 실행 하는게 전부입니다. 여기서 커널은 엔진 커널을 뜻하며, 커널 생성이 완료되면 엔진이 준비 된 상태가 되는 거죠. 커널 생성시 실행 되는 부분은 그래픽 관련 작업을 담당하는 그래픽코어와 입력처리 담당을 하는 그래픽코어, 씬 부분을 담당하는 씬 코어등을 생성하는 것이 주된 일입니다.

int CFramework::CreateKernel()
{
	// 커널 생성
	m_pKernel = new ae_CKernel(m_hWnd);

	// 코어 생성
	m_pInputCore = (ae_CInputCore*)m_pKernel->CreateCore( ae_CKernel::CORE_INPUT );
	if( m_pInputCore == NULL )
	{
		m_pKernel->WriteLog(L"인풋 코어 생성 실패!!!");
		return 0;
	}
	m_pResourceCore = (ae_CResourceCore*)m_pKernel->CreateCore( ae_CKernel::CORE_RESOURCE );
	if( m_pResourceCore == NULL )
	{
		m_pKernel->WriteLog(L"리소스 코어 생성 실패!!!");
		return 0;
	}
	m_pSceneCore = (ae_CSceneCore*)m_pKernel->CreateCore( ae_CKernel::CORE_SCENE );
	if( m_pSceneCore == NULL )
	{
		m_pKernel->WriteLog(L"씬 코어 생성 실패!!!");
		return 0;
	}

	return 1;
}

그리고 각 코어 생성시에는 각자 역할에 맞는 초기화 작업을 수행하죠. 그래픽 코어라면 그래픽 디바이스 생성 및 초기화등을 수행하고, 인풋 코어라면 키 입력 시스템 초기화를 하듯이 말이죠. 코어 생성은 팩토리 패턴을 적용하여, 커널에서 모든 코어를 관리 할수 있도록 작성 했습니다.

ae_CCoreBase* CKernel::CreateCore( eCoreType eType )
{
	// 해당 코어가 이미 생성 되어있는지 검사. 있으면 날려주자~
	CCoreBase* pFindCore = GetCore( eType );
	if( pFindCore != NULL )
		return pFindCore;

	switch( eType )
	{
	case CORE_SCENE:
		{
			CSceneCore* pCore = new CSceneCore();
			m_CoreList.insert( make_pair( CORE_SCENE, pCore ) );
			if( pCore->InitializeCore( this ) )
				return pCore;
			return NULL;
		}
	case CORE_RESOURCE:
		{
			CResourceCore* pCore = new CResourceCore();
			m_CoreList.insert( make_pair( CORE_RESOURCE, pCore ) );
			if( pCore->InitializeCore( this ) )
				return pCore;
			return NULL;
		}
	case CORE_INPUT:
		{
			CInputCore* pCore = new CInputCore();
			m_CoreList.insert( make_pair( CORE_INPUT, pCore ) );
			if( pCore->InitializeCore( this ) )
				return pCore;
			return NULL;
		}
	default:
		return NULL;
	}

	return NULL;
}

심플하죠.
다른 분들은 어떤식으로 작성하는지 궁금하네요. 나는 이런식으로 실행한다. 하는 의견 있으면 팍팍~ 남겨주세요.

+ Recent posts