d3dx9 - 10.22까지 정리

김주현·2021년 10월 23일
0

d3dx9 3D

목록 보기
13/30

실행 흐름을 따라가면서 정리.

1 . MainApp의 Create()

  • MainApp의 NativeConstruct() 호출

  • CGameInstance::Get_Instance() 호출

  • CGameInstance의 생성자가 호출되고 멤버변수로 가지고있는 장치와 매니저들을 할당(초기화는 나중에)

    1. 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() 호출

  • GameInstance 를통해 장치초기화 수행하고 할당된 장치를 함수인자 LPDIRECT3DDEVICE9* ppGraphic_Device를통해 MainApp넘겨줌
  1. 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()를통해 렌더링 파이프라인을 수행

  1. Add_Prototype_GameObject() 를 통해 게임오브젝트추가
  • 게임인스턴스 가져오고

  • CBackGround::Create(LPDIRECT3DDEVICE9 pGraphic_Device) 호출

  • pGameInstance->Add_Object_Prototpye(TEXT("Prototype_BackGround"), CBackGround::Create(m_pGraphic_Device)))) 를통해 CBackGround의 원형을 ObjectManger의 맵에 추가한다.

  1. 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) 호출 ( 카메라 통해 뷰와 투영행렬 구현해서 넣어줌)

  1. 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을 비워준다.

  1. void CGameInstance::Render_End(HWND hWND)
  • 렌더 엔더 호출로 실질적으로 화면에 출력한다.

종료시까지 tick과 렌더를 반복한다.

종료시

  1. 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()으로 돌아와서 레벨->객체->컴포넌트-> 장치 순으로 릴리즈해준다.

  1. CLevel_Manager::Get_Instance()->Destroy_Instance())
  • 레벨매니저는 레벨매니저->레벨->레벨 로고로 가지고있음 최하단 자식부터 릴리즈를 수행함.
  1. 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();

    }
    호출로 레이어들을 지워주고 프로토타입 원본을 지워줌 복사복을 먼저 지우고 원본을 지운다.

나머지 장치들도 이와같이 지워짐.

0개의 댓글

관련 채용 정보