데이터 기반 코딩
언급 한 모든 것은 데이터에 지정할 수있는 것입니다. 왜로드 aspecificmap
합니까? 게임 구성에 따르면 플레이어가 새 게임을 시작할 때 첫 번째 수준이거나 방금로드 한 플레이어의 저장 파일에있는 현재 저장 지점의 이름이기 때문입니다.
어떻게 찾 aspecificmap
습니까? 맵 ID와 디스크상의 리소스를 나열하는 데이터 파일에 있기 때문입니다.
하드 코딩을 피하기 위해 합법적으로 어렵거나 불가능한 "소규모"리소스 세트 만 있으면됩니다. 약간의 작업으로, 이것은 하나의 하드 코딩 된 기본 자산 이름 등 으로 제한 될 수 있습니다 main.wad
. 이 파일은 명령 행 인수를 게임 aka에 전달하여 런타임시 잠재적으로 변경 될 수 있습니다 game.exe -wad mymain.wad
.
데이터 중심 코드 작성은 몇 가지 다른 원칙에 의존합니다. 예를 들어, 시스템이나 모듈이 특정 자원을 요구하지 않고 대신 해당 종속성을 반전시킬 수 있습니다. 즉, 초기화 코드에 DebugDrawer
로드 하지 마십시오 debug.font
. 대신 DebugDrawer
초기화 코드에서 리소스 핸들을 가져 오십시오. 이 핸들은 메인 게임 구성 파일에서로드 될 수 있습니다.
코드베이스의 구체적인 예로, 리소스 데이터베이스에서로드되는 "전역 데이터"개체가 있습니다 (기본적으로 ./resources
폴더이지만 명령 줄 인수로 오버로드 될 수 있음). 이 전역 데이터의 리소스 데이터베이스 ID는 코드베이스에서 유일하게 필요한 하드 코딩 된 리소스 이름입니다 (프로그래머가 게으 르기 때문에 다른 경우도 있지만 일반적으로 결국 수정 / 제거합니다). 이 글로벌 데이터 오브젝트는 구성 데이터를 제공하는 것이 유일한 목적인 구성 요소로 가득합니다. 구성 요소 중 하나는 여러 가지 구성 항목 중에서 모든 기본 UI 리소스 (글꼴, Flash 파일, 아이콘, 현지화 데이터 등)에 대한 리소스 핸들을 포함하는 UI Global Data 구성 요소입니다. UI 개발자가 기본 UI 자산의 이름을 /ui/mainmenu.swf
에서/ui/lobby.swf
그들은 단지 그 전역 데이터 참조를 업데이트합니다. 엔진 코드를 전혀 변경할 필요가 없습니다.
이 전역 데이터를 모든 용도로 사용합니다. 모든 재생 가능한 캐릭터, 모든 레벨, UI, 오디오, 핵심 자산, 네트워크 구성, 모든 것. ( 모든 것이 아니라 다른 것들도 수정해야 할 버그입니다.)
이 접근법에는 다른 많은 장점이 있습니다. 우선, 자원 포장 및 번들링이 전체 프로세스에 필수적입니다. 엔진의 하드 코딩 경로는 또한 동일한 경로가 게임 자산을 패키지화하는 스크립트 나 도구에 하드 코딩되어야한다는 의미입니다. 그러면 해당 경로가 동기화되지 않을 수 있습니다. 그 대신 단일 코어 자산 및 참조 체인에 의존하여 단일 명령으로 자산 번들을 구축하고 bundle.exe -root config.data -out main.wad
필요한 모든 자산이 포함됨을 알 수 있습니다. 또한 번 들러는 리소스 참조를 따르기 때문에 필요한 자산 만 포함 하고 프로젝트 수명 동안 필연적으로 누적되는 모든 남은 보풀을 건너 뛸 것입니다. 가지 치기를위한 보풀).
이 모든 것의 까다로운 코너 사례는 스크립트에 있습니다. 엔진을 데이터 중심으로 만드는 것은 개념적으로 쉽지만 스크립트가 데이터로 간주되어 리소스 경로를 무차별 적으로 사용하는 것이 허용되는 매우 많은 프로젝트 (AAA에 취미)를 보았습니다. 하지마 Lua 파일에 리소스가 필요하고 함수를 호출하는 textures.lua("/path/to/texture.png")
경우 자산 파이프 라인은 스크립트가 /path/to/texture.png
올바르게 작동해야하고 텍스처가 사용되지 않고 불필요하다고 생각할 수 있다는 것을 알면서 많은 문제를 겪게 됩니다. 스크립트는 다른 코드와 같이 처리해야합니다. 리소스 나 테이블을 포함하여 필요한 모든 데이터는 엔진과 리소스 파이프 라인이 종속성을 검사 할 수있는 구성 항목에 지정해야합니다. "로드 스크립트 foo.lua
" 라고 표시된 데이터는 "foo.lua
예를 들어 스크립트가 적을 무작위로 스폰하는 경우 가능한 적의 목록을 해당 구성 파일에서 스크립트로 전달합니다. 엔진은 적을 레벨로 미리로드 할 수 있습니다 ( 가능한 스폰의 전체 목록을 알고 있기 때문에 리소스 파이프 라인은 모든 적을 게임에 번들로 묶는 것을 알고 있습니다 (구성 데이터에 의해 명확하게 참조되기 때문에) 스크립트가 경로 이름의 문자열을 생성하고 load
함수를 호출하는 경우 엔진과 리소스 파이프 라인은 스크립트가로드 할 자산을 구체적으로 알 수있는 방법이 있습니다.