260 likes | 459 Views
Tales V 2.0 분석문서. How to Read it ?. 흐름도 ( Flow Chart ) 위주로 되어 있으니 , 슬라이드 한 장 한 장 넘겨가며 읽을 것 . 우측 상단에 설명할 함수 명과 간략한 기능이 소개되어 있음 . 좌측 상단에 설명할 함수가 있는 프로젝트 이름과 해당 프로젝트 내의 파일 경로가 기입되어 있음 . 흐름도는 슬라이드 좌측 칸 안에 각 기능별로 기술됨 . ( 좌측 상단에서 좌측 하단으로 읽기 ) 다음 슬라이드에서 함수 안으로 진입 :
E N D
Tales V 2.0 분석문서
How to Read it ? • 흐름도 ( Flow Chart ) 위주로되어 있으니, 슬라이드 한 장 한 장넘겨가며 읽을 것. • 우측 상단에 설명할 함수 명과 간략한 기능이 소개되어 있음. • 좌측 상단에 설명할 함수가 있는 프로젝트 이름과 해당 프로젝트내의 파일 경로가기입되어 있음. • 흐름도는 슬라이드 좌측 칸 안에 각 기능별로 기술됨.( 좌측 상단에서 좌측 하단으로 읽기 ) • 다음 슬라이드에서 함수 안으로 진입 : • 현재 슬라이드에서 함수 끝 : • 코멘트를 잘 읽을 것. Step In. Step Out.
Project : Tales File : main.cpp WinMain() : Program Entry MessageLoop() : 게임 이벤트 루프 InitIlluminia() : 게임 엔진 초기화 InitTalesGame() : 게임 객체 초기화 ReleaseGame() : 게임 객체 릴리즈 ReleaseIlluminia() : 게임 엔진 릴리즈 Option 구조체 세팅 Step In • Program 의 Entry 함수.함수의 구조 변경 사항은 없을 것으로 보임. • 단, 지금은 Option 구조체를 한데 뭉뚱그려 놓았는데 이를 기능별로 분리하는 것이 좋을것으로 보임. • 가령 InitOption, GameOption이라든지.
Project : Illuminia File : Illuminia\ Illuminia.cpp 구조개선 여지없음. InitD3D() : DirectX 10 객체 초기화 InitIlluminia() : 게임 엔진 초기화 InitWin32() : Window 초기화. Step In • 여기서부터 코드가 꼬일 기미가 보임. • 후에 설명할 InitTalesGame() 함수 ( 슬라이드 8 참조 ) 에서 초기화되고 있는 모든 관리객체들을이곳으로 가져와야 함.
Project : Illuminia File : Support\ D3D.cpp Frame Buffer 얻어오고, RTV 생성 Swap Chain Description 초기화 Device 및 Swap Chain 생성 ( HAL ) Depth-Stencil Texture, View 생성 OM Stage 에 DS view, RTV 병합 뷰포트 지정 InitD3D() : DirectX 10 객체 초기화 윈도우 영역 계산 IF( FAIL ) : REF 로 생성 IF( FAIL) : 객체생성 불가 • 각 스테이지별FAIL 검사 있음. • 여기서는 DX API 함수를 사용하므로, 함수명을 표기하지 않음. • 한 함수가 너무 많은 객체를 초기화함.루틴을 나누는 것이 좋을 듯. • GPU Rendering 을 위한 RTV 생성을 고려해야 함. • RTV : Render Target View • DS View : Depth-Stencil View Step Out.
Project : Illuminia File : Illuminia\ Illuminia.cpp InitD3D() : DirectX 10 객체 초기화 InitIlluminia() : 게임 엔진 초기화 InitWin32() : Window 초기화. Step Out.
Project : Tales File : main.cpp WinMain() : Program Entry MessageLoop() : 게임 이벤트 루프 InitIlluminia() : 게임 엔진 초기화 InitTalesGame() : 게임 객체 초기화 ReleaseGame() : 게임 객체 릴리즈 ReleaseIlluminia() : 게임 엔진 릴리즈 Option 구조체 세팅 Step In • InitIlluminia() 함수까지 초기화가 끝났다. • 이제 InitTalesGame() 함수로 들어감.* 주의 ! 마음을 단단히 먹고 들어가시오.
RenderState객체 초기화( Game, Init ) initFSM() : 캐릭터 생성 ( AI 처리 ) 마우스 관리 객체 초기화 ( 640, 480 ) “Init” Render State 로 전환 Project : TalesCore File : TalesCore.cpp • 가장 골 때리는 함수. • 모든 객체의 초기화 루틴이 들어와 있다.대부분 initIlluminia() 로 옮기는 것이 합당. • 쉐이더에서 상수변수들을 굉장히 많이가져오는데, 객체 별로 쉐이더 파일을 분할하든지 하는 대책이필요함. 이 때문에 코드가 더 복잡해 보임. • 상수변수들은 반드시 각 관리객체에서 가져 올 것. • 애니메이션 리소스 파일경로 등을 String Table 로 관리하는 것은 어떨지 ? • Render 함수들을 State 패턴으로 처리한 것은 정말 탁월한 선택이었음 ! 최초의 RenderState는 초기화면을 그릴 객체인 RenderInit객체. • initFSM() 에서 Lua등 스크립팅 언어 처리가 필요함. Effect 로부터 테크닉, 상수변수들 얻기 사운드 매니저 객체 초기화 스카이박스 객체 초기화 Mesh 및 애니메이션리소스 초기화 카메라 객체 초기화( WALKER ) 상수행렬 초기화 지형 객체 초기화 월드 및 투사행렬 초기화 *.fx파일로부터 Effect 생성 InitTalesGame() : 게임 객체 초기화 Step In
Project : TalesCore File : TalesCore.cpp initFSM() : 캐릭터 생성 적 캐릭터의 위치 설정 랜덤 시드 설정. – srand() 주인공 캐릭터의 위치 설정 캐릭터 위치설정 – 중복 방지 • 현재라면 논리상 결함은 없음. • 단, 차후 각 스테이지 별로 초기 주인공 캐릭터의 위치가 fix 되어 있다고 가정하면, 주인공 캐릭터의 생성 뒤에 적 캐릭터를 중복되지 않게 배치하는 것이 맞음. • 그리고 이 루틴은 AI 처리 루틴이 되므로, 스크립팅 언어 embedded 로 작성하는 것이 옳을 것으로 보임. Step Out.
RenderState객체 초기화( Game, Init ) “Init” Render State 로 전환 마우스 관리 객체 초기화 ( 640, 480 ) initFSM() : 캐릭터 생성 ( AI 처리 ) Project : TalesCore File : TalesCore.cpp Effect 로부터 테크닉, 상수변수들 얻기 Mesh 및 애니메이션리소스 초기화 스카이박스 객체 초기화 사운드 매니저 객체 초기화 카메라 객체 초기화( WALKER ) 지형 객체 초기화 월드 및 투사행렬 초기화 상수행렬 초기화 *.fx파일로부터 Effect 생성 InitTalesGame() : 게임 객체 초기화 Step Out
Project : Tales File : main.cpp WinMain() : Program Entry MessageLoop() : 게임 이벤트 루프 InitIlluminia() : 게임 엔진 초기화 InitTalesGame() : 게임 객체 초기화 ReleaseGame() : 게임 객체 릴리즈 ReleaseIlluminia() : 게임 엔진 릴리즈 Option 구조체 세팅 Step In • 게임 내의 모든 객체의 초기화가 끝남. • 이제 사용자 메시지 처리와게임 Render Loop 로 들어감.
Project : Illuminia File : Illuminia\ Illuminia.cpp 메시지 처리 MessageLoop() : 게임 이벤트 루프 현재 시간 얻기 발생한 이벤트가 WM_QUIT 인가 ? renderState->Render() : 초기 or 게임 화면 렌더링 게임 종료 들어온 메시지가 있는가 ? Yes No Yes No • 메시지 및 렌더링 루프. • 각각 윈도우 메시지는 윈도우프로시저에서, 렌더링은RenderState객체에서 처리. • 초기화면 RenderState : RenderInit게임화면 RenderState : RenderGame Step In
렌더링 분기 1 RenderState = RenderInit ( 초기화면 렌더링 )
Project : TalesCore File : RenderStates\ RenderInit.cpp RenderState를 RenderGame으로전환 입력 받은 좌표가 261 <= x <= 381 이고 370<= y <= 416일 경우 입력 받은 좌표가 261 <= x <= 381 이고 204 <= y <= 249 일 경우 텍스쳐 읽어오기 텍스쳐를back buffer 에 그림 Swap Chain 을 present 게임 종료 RenderInit->Render() : 초기화면 렌더링 마우스 입력 받음 No Yes Yes No • 최초로 게임이 로드되면 실행될 Render 함수. • ‘버튼이벤트’ 가 따로 없이, 그냥 윈도우의특정 영역 선택으로 이후의 스테이트를판정함. Step Out
렌더링 분기 2 RenderState = RenderGame ( 게임화면 렌더링 )
Project : TalesCore File : RenderStates\ RenderGame.cpp 마우스 입력에 따라 카메라 조작( yaw, pitch) RenderGame>Render() : 게임화면 렌더링 카메라 이동에 따라 좌표, 뷰 행렬 갱신 카메라 조작( WSAD ) 월드행렬 갱신 지형 렌더링 updateFSM() : 캐릭터 위치갱신 • 큰 문제는 발견되지 않음. 캐릭터 렌더링 Swap Chain present Step Out
종료 분기 1 WM_QUIT 메시지 입력
Project : Illuminia File : Illuminia\ Illuminia.cpp Step Out 메시지 처리 MessageLoop() : 게임 이벤트 루프 현재 시간 얻기 발생한 이벤트가 WM_QUIT 인가 ? renderState->Render() : 초기 or 게임 화면 렌더링 게임 종료 들어온 메시지가 있는가 ? Yes No Yes No
종료 분기 2 초기화면에서 ‘종료’ 에 해당하는 좌표 클릭
Project : TalesCore File : RenderStates\ RenderInit.cpp RenderState를 RenderGame으로전환 입력 받은 좌표가 261 <= x <= 381 이고 370<= y <= 416일 경우 입력 받은 좌표가 261 <= x <= 381 이고 204 <= y <= 249 일 경우 텍스쳐 읽어오기 텍스쳐를back buffer 에 그림 Swap Chain 을 present 게임 종료 RenderInit->Render() : 초기화면 렌더링 마우스 입력 받음 No Yes Yes No Step Out
Project : Tales File : main.cpp WinMain() : Program Entry MessageLoop() : 게임 이벤트 루프 InitIlluminia() : 게임 엔진 초기화 InitTalesGame() : 게임 객체 초기화 ReleaseGame() : 게임 객체 릴리즈 ReleaseIlluminia() : 게임 엔진 릴리즈 Option 구조체 세팅 • 게임 종료 이벤트 발생.. Step In
Project : TalesCore File : TalesCore.cpp releaseFSM() : 적 캐릭터 객체 릴리즈 ReleaseGame() : 게임 객체 릴리즈 마우스 입력 객체 릴리즈 사운드 관리 객체 릴리즈 주인공 캐릭터 객체 릴리즈 스카이 박스 반납 • InitTalesGame() 에서생성되었던 모든 객체들이 반납되지 않고 있음. Step Out
Project : Tales File : main.cpp WinMain() : Program Entry MessageLoop() : 게임 이벤트 루프 InitIlluminia() : 게임 엔진 초기화 InitTalesGame() : 게임 객체 초기화 ReleaseGame() : 게임 객체 릴리즈 ReleaseIlluminia() : 게임 엔진 릴리즈 Option 구조체 세팅 Step In
Project : Illuminia File : Illuminia\ Illuminia.cpp 윈도우 클래스 unregister ReleaseIlluminia() : 게임 엔진 릴리즈 Step Out
Project : Tales File : main.cpp WinMain() : Program Entry MessageLoop() : 게임 이벤트 루프 InitIlluminia() : 게임 엔진 초기화 InitTalesGame() : 게임 객체 초기화 ReleaseGame() : 게임 객체 릴리즈 ReleaseIlluminia() : 게임 엔진 릴리즈 Option 구조체 세팅 • 전체종료. • 게임 끝. Step Out