실행 흐름을 따라가면서 정리.
1 . MainApp의 Create()
MainApp의 NativeConstruct() 호출
CGameInstance::Get_Instance() 호출
CGameInstance의 생성자가 호출되고 멤버변수로 가지고있는 장치와 매니저들을 할당(초기화는 나중에)
- pGameInstance->initialize_Engine(LEVEL_END)호출
LEVEL_END는 클라이언터 프로젝트의 마지막 레벨을 의미(초기화를 함에있어 레벨별로 관리할것이기때문에 레벨의 수만큼 배열을 선언해야하기때문에 마지막 레벨의 값을 인자로 넘겨준다.)
CGameInstance::initialize_Engine(_uint iNumLevel)에서 위의 CGameInstance::Get_Instance() 에서 멤버변수에 주소를 잘 넣어놨는지 확인후 오브젝트 매니저부터 컨테이너를 예약
m_pObject_Manager->Reserve_Container(iNumLevel)로 오브젝젝트 매니저의 LAYERS 컨테이너 공간 동적할당
m_pComponent_Manager->Reserve_Container(iNumLevel)로 컴포넌트매니저의 PROTOTYPES 컨테이너 공간 동적할당
3.CGameInstance::Ready_Graphic_Device() 호출
- MainApp:: Add_Prototype_Component() 호출
게임인스턴스를 참조함
CRenderer::Create(m_pGraphic_Device) 렌더를 멤버변수에 저장하기위해 함수 호출
pGameInstance->Add_Component_Prototype(LEVEL_STATIC,TEXT("Prototype_Renderer"),m_pRenderer) 호출로 생성한 렌더를 원형 컴포넌트 map에 추가
pGameInstance->Add_Component_Prototype(LEVEL_STATIC, TEXT("Prototype_Transform"), CTransform::Create(m_pGraphic_Device) 호출로 트랜스폼 컴포넌트를 생성해 원형 map추가 (원형은 항등핼렬(월드 매트릭스)을 멤버로 가지고있음)
if (FAILED(pGameInstance->Add_Component_Prototype(LEVEL_STATIC, TEXT("Prototype_VIBuffer_Rect"), CVIBuffer_Rect::Create(m_pGraphic_Device))))
return E_FAIL;
를 통해 VI 버퍼를 원형 map 추가
NativeConstruct_Prototype()를통해 렌더링 파이프라인을 수행
- Add_Prototype_GameObject() 를 통해 게임오브젝트추가
게임인스턴스 가져오고
CBackGround::Create(LPDIRECT3DDEVICE9 pGraphic_Device) 호출
pGameInstance->Add_Object_Prototpye(TEXT("Prototype_BackGround"), CBackGround::Create(m_pGraphic_Device)))) 를통해 CBackGround의 원형을 ObjectManger의 맵에 추가한다.
- pGameInstance->SetUp_Level(CLevel_Logo::Create(m_pGraphic_Device))) 호출
CLevelLogo가 생성됨
CLevel_Logo::NativeConstruct() 호출
Ready_Layer_BackGround(TEXT("Layer_BackGround") 호출
pGameInstance->AddGameObject
(LEVEL_LOGO, TEXT("Prototype_BackGround"), pLayerTag))
) 레벨로고에 백그라운드를 복제해서 추가해줌
MainApp Create완료
7 . CMainApp::Tick() 호출
CGameInstance::Tick(_double TimeDelta) 호출
레벨매니저와 오브젝트매니저의 tick을 호출하기에 앞서 혹시 nullptr을 가지고있는지 확인
m_pObject_Manager->Tick(TimeDelta); 호출
오브젝트매니저 -> 레벨로고 -> 백그라운드의 틱이 호출된다.
m_pObject_Manager->Lase_Tick(TimeDelta); 호출
여기서는 렌더그룹에 추가하는 함수를 구현해놨음(그리고 지움 다음 LateTick에서 추가를 반복)
레밸매니저의 틱 호출 -> CLevel_Logo::Tick(_double TimeDelta) 호출 ( 카메라 통해 뷰와 투영행렬 구현해서 넣어줌)
- Render_MainApp()
pGameInstance->Render_Begin(); 그리기 시작하겠다는 함수호출 (타켓,깊이,스탠실 버퍼를 비운다)
m_pRenderer->Render_GameObject(); 호출 본격적으로 객체를 렌더한다.
렌더러가 가지고있는 객체들의 렌더를 호출해줌 현재는 CBackGround가 들어있다.
CBackGround::Render() 호출
m_pGraphic_Device->SetTransform(D3DTS_WORLD, m_pTransformCom->Get_WorldMatrix());
(장치를 객체가 현재가지고있는 로컬스페이스에서 월드스페이스로 변환해줌(트랜스폼 컴포넌트에서 월드행렬을 가져와서 인자로 넘겨준다.)
CVIBuffer::Render_VIBuffer() vi컴포넌트의 Render_VIBUffer 호출
m_pGraphic_Device->SetStreamSource(0, m_pVB, 0, m_iStride);
m_pGraphic_Device->SetFVF(m_dwFVF);
m_pGraphic_Device->DrawPrimitive(m_ePrimitiveType, 0, m_iNumPrimitive);
세함수의 호출로 화면에 그려줌
HRESULT CRenderer::Render_GameObject()
{
for (_uint i = 0; i < RENDER_END; i++)
{
for (auto& pGameObject : m_RenderObjects[i])
{
if (FAILED(pGameObject->Render()))
{
return E_FAIL;
}
Safe_Release(pGameObject);
}
m_RenderObjects[i].clear();
}
return S_OK;
}
에서 볼수있듯이 그려준후 바로 m_RenderObjects map을 비워준다.
- void CGameInstance::Render_End(HWND hWND)
종료시까지 tick과 렌더를 반복한다.
- Safe_Release(pMainApp) 호출로 MainApp을 제거한다.
CMainApp::Free() 호출됨
Safe_Release(m_pRenderer); 호출
Safe_Release(m_pGraphic_Device); 호출
위 두함수를 통해 참조수 줄여줌 -> 바로지워지는게아님 0에서 한번 더 호출되어야 지워진다.
CGameInstance::Release_Engine(); 호출
2 . CGameInstance::Get_Instance()->Destroy_Instance()) 호출
d CGameInstance::Free() 호출되고 가지고있는 멤버변수 4개를 컴포넌트->레벨 오브젝트 매니저_> 그래픽매니저순으로 참조수를 0으로 만든다 마찬가지로 지워지지는 않음.
CGameInstance::Release_Engine()으로 돌아와서 레벨->객체->컴포넌트-> 장치 순으로 릴리즈해준다.
- CLevel_Manager::Get_Instance()->Destroy_Instance())
- CObject_Manager::Get_Instance()->Destroy_Instance()) 호출
void CObject_Manager::Free()
{
for (size_t i = 0; i < m_iNumLevel; i++)
{
for (auto& Pair : m_pLayers[i])
Safe_Release(Pair.second);
m_pLayers[i].clear();
}
Safe_Delete_Array(m_pLayers);
for (auto& Pair : m_Prototypes)
Safe_Release(Pair.second);
m_Prototypes.clear();
}
호출로 레이어들을 지워주고 프로토타입 원본을 지워줌 복사복을 먼저 지우고 원본을 지운다.
나머지 장치들도 이와같이 지워짐.