Manuals
Manuals




This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English

Live update

게임을 번들링할 때 Defold는 모든 게임 리소스를 결과물인 플랫폼별 패키지에 묶습니다. 대부분의 경우 실행 중인 엔진이 모든 리소스에 즉시 액세스하고 스토리지에서 빠르게 로드할 수 있으므로 이 방식이 좋습니다. 하지만 리소스 로딩을 이후 단계로 미루고 싶을 때도 있습니다. 예를 들면 다음과 같습니다.

  • 게임이 여러 에피소드로 구성되어 있고, 플레이어가 나머지 게임을 계속할지 결정하기 전에 첫 번째 에피소드만 체험할 수 있게 하고 싶을 수 있습니다.
  • 게임이 HTML5를 타겟으로 합니다. 브라우저에서 스토리지의 어플리케이션을 로드한다는 것은 시작 전에 전체 어플리케이션 패키지를 다운로드해야 한다는 뜻입니다. 이런 플랫폼에서는 최소한의 시작 패키지만 보내 앱을 빠르게 실행한 뒤 나머지 게임 리소스를 다운로드하고 싶을 수 있습니다.
  • 게임에 매우 큰 리소스(이미지, 비디오 등)가 포함되어 있고, 실제로 게임에 표시되기 직전까지 다운로드를 미루고 싶을 수 있습니다. 이렇게 하면 설치 크기를 줄일 수 있습니다.

Live update 기능은 컬렉션 프록시 개념을 확장하여, 빌드 시 의도적으로 번들에서 제외한 리소스를 런타임이 가져와 어플리케이션 번들에 저장할 수 있게 하는 메커니즘을 제공합니다.

이 기능을 사용하면 컨텐츠를 여러 아카이브로 나눌 수 있습니다.

  • 기본 아카이브
  • 레벨 공통 파일
  • 레벨 팩 1
  • 레벨 팩 2

Live update용 컨텐츠 준비

크고 고해상도인 이미지 리소스를 포함하는 게임을 만든다고 가정해 봅시다. 이 게임은 게임 오브젝트와 이미지가 있는 스프라이트를 컬렉션에 두어 이미지를 관리합니다.

Mona Lisa collection

엔진이 이런 컬렉션을 동적으로 로드하게 하려면 컬렉션 프록시 컴포넌트를 추가하고 monalisa.collection을 가리키게 하면 됩니다. 그러면 게임은 컬렉션 프록시에 load 메세지를 보내 스토리지에 있는 컬렉션 컨텐츠를 언제 메모리로 로드할지 선택할 수 있습니다. 하지만 여기서는 한 단계 더 나아가 컬렉션 안에 포함된 리소스의 로딩까지 직접 제어하려고 합니다.

이를 위해 컬렉션 프록시 프로퍼티에서 Exclude 체크박스를 선택하면 됩니다. 그러면 Defold는 어플리케이션 번들을 만들 때 monalisa.collection 안의 모든 컨텐츠를 제외합니다.

기본 게임 패키지가 참조하는 리소스는 제외되지 않습니다.

Collection proxy excluded

Live update 설정

Defold가 어플리케이션 번들을 만들 때는 제외된 리소스를 어딘가에 저장해야 합니다. Live update의 프로젝트 설정은 이 리소스들의 위치를 제어합니다. 설정은 Project ▸ Live update Settings... 아래에 있습니다. 설정 파일이 없으면 이 메뉴가 설정 파일을 생성합니다. 번들링할 때 사용할 live-update 설정 파일은 game.project에서 선택합니다. 이를 통해 live, QA, development 같은 환경별로 서로 다른 live-update 설정을 사용할 수 있습니다.

Live update settings

현재 Defold가 리소스를 저장할 수 있는 방법은 세 가지입니다. 설정 창의 Mode 드롭다운에서 방식을 선택합니다.

Zip
이 옵션은 Defold가 제외된 리소스를 담은 Zip 아카이브 파일을 만들도록 지시합니다. 아카이브는 Export path 설정에 지정된 위치에 저장됩니다.
Folder
이 옵션은 Defold가 제외된 모든 리소스를 담은 폴더를 만들도록 지시합니다. Zip과 완전히 같은 방식으로 동작하지만, 아카이브 대신 디렉토리를 사용합니다. 업로드 전에 파일을 후처리해야 하거나 직접 아카이브로 패킹하려는 경우에 유용할 수 있습니다.
Amazon
이 옵션은 Defold가 제외된 리소스를 아마존 웹 서비스(AWS) S3 버켓에 자동으로 업로드하도록 지시합니다. AWS Credential profile 이름을 입력하고, 적절한 Bucket을 선택한 뒤 Prefix 이름을 제공합니다. AWS 계정 설정 방법은 이 aws guide에서 더 읽을 수 있습니다.

Live update로 번들링하기

에디터에서 빌드하고 실행하는 방식(Project ▸ Build)은 Live Update를 지원하지 않습니다. Live Update를 테스트하려면 프로젝트를 번들링해야 합니다.

Live update로 번들링하는 과정은 간단합니다. Project ▸ Bundle ▸ ...를 선택한 다음 어플리케이션 번들을 만들 플랫폼을 선택합니다. 그러면 번들링 다이얼로그가 열립니다.

Bundle Live application

번들링할 때 제외된 리소스는 어플리케이션 번들에서 빠집니다. Publish Live update content 체크박스를 선택하면 Live update 설정 방식에 따라 Defold가 제외된 리소스를 Amazon에 업로드하거나 Zip 아카이브를 만들도록 지시합니다(위 내용 참고). 게시된 Live Update 컨텐츠에는 원격 전달에 필요한 전체 리소스 목록이 들어 있는 liveupdate.game.dmanifest가 계속 포함됩니다.

아카이브 기반 Live Update 컨텐츠를 게시할 때는 Strip Live Update Entries from Main Manifest(liveupdate.exclude_entries_from_main_manifest)가 기본으로 활성화됩니다. 이 설정이 활성화되어 있으면 Live Update 전용 리소스가 번들된 game.dmanifest에서 제거되어 번들 크기와 런타임 메모리 사용량을 줄입니다. 제외된 항목이 번들된 game.dmanifest에 남아 있는 더 이상 권장되지 않는 동작이 꼭 필요한 경우에만 이 설정을 비활성화하세요.

기본 설정이 활성화되어 있으면 관련 아카이브가 마운트될 때까지 collectionproxy.get_resources(){}를 반환합니다. 마운트 후에는 해당 프록시의 리소스 해쉬를 반환합니다.

Package를 클릭하고 어플리케이션 번들의 위치를 선택합니다. 이제 어플리케이션을 시작하고 모든 것이 예상대로 동작하는지 확인할 수 있습니다.

.zip 아카이브

live update .zip 파일에는 기본 게임 패키지에서 제외된 파일이 들어 있습니다.

현재 파이프라인은 하나의 .zip 파일 생성만 지원하지만, 실제로는 그 zip 파일을 더 작은 .zip 파일들로 나눌 수 있습니다. 이를 통해 레벨 팩, 시즌 컨텐츠 등 게임의 다운로드 크기를 더 작게 만들 수 있습니다. 각 .zip 파일에는 .zip 파일 안에 포함된 각 리소스의 메타 데이터를 설명하는 메니페스트 파일도 들어 있습니다.

.zip 아카이브 분할

리소스 사용을 더 세밀하게 제어하기 위해 제외된 컨텐츠를 여러 개의 더 작은 아카이브로 나누고 싶은 경우가 많습니다. 예를 들어 레벨 기반 게임을 여러 레벨 팩으로 나눌 수 있습니다. 또 다른 예로는 서로 다른 휴일 테마의 UI 장식을 별도 아카이브에 넣고, 달력상 현재 활성화된 테마만 로드하고 마운트할 수 있습니다.

리소스 그래프는 build/default/game.graph.json에 저장되며 프로젝트를 번들링할 때마다 자동으로 생성됩니다. 생성된 파일에는 프로젝트의 모든 리소스 목록과 각 리소스의 종속성이 들어 있습니다. 예제 항목은 다음과 같습니다.

{
  "path" : "/game/player.goc",
  "hexDigest" : "caa342ec99794de45b63735b203e83ba60d7e5a1",
  "children" : [ "/game/ship.spritec", "/game/player.scriptc" ]
}

각 항목에는 프로젝트 안에서 리소스의 유니크한 경로를 나타내는 path가 있습니다. hexDigest는 리소스의 암호학적 지문을 나타내며 liveupdate .zip 아카이브에서 사용할 파일명이 됩니다. 마지막으로 children 필드는 이 리소스가 의존하는 다른 종속성의 목록입니다. 위 예제에서 /game/player.goc는 스프라이트와 스크립트 컴포넌트에 종속성을 가집니다.

game.graph.json 파일을 파싱하고 이 정보를 사용해 리소스 그래프의 항목 그룹을 식별한 뒤, 해당 리소스를 원래 메니페스트 파일과 함께 별도 아카이브에 저장할 수 있습니다. 메니페스트 파일은 런타임에 정리되어 아카이브 안의 파일만 포함하게 됩니다.

Android에서 Live Update 사용

Play Asset Delivery를 사용해 Live Update 컨텐츠를 다운로드하고 마운트할 수 있습니다. 공식 매뉴얼에서 더 알아보세요.

컨텐츠 검증

live update 시스템의 주요 기능 중 하나는 이제 여러 컨텐츠 아카이브를 사용할 수 있으며, 잠재적으로 여러 Defold 버전에서 만든 아카이브도 사용할 수 있다는 점입니다.

liveupdate.add_mount()의 기본 동작은 마운트를 연결할 때 엔진 버전 검사를 추가하는 것입니다. 이는 게임 기본 아카이브와 live update 아카이브가 모두 같은 엔진 버전으로 같은 시점에 bundle 옵션을 사용해 생성되어야 한다는 뜻입니다. 이 검사는 클라이언트가 이전에 다운로드한 아카이브를 무효화하여 컨텐츠를 다시 다운로드하도록 만듭니다.

이 동작은 options 플래그로 끌 수 있습니다. 이 동작을 끄면 각 live update 아카이브가 실행 중인 엔진에서 동작한다는 것을 보장하는 컨텐츠 검증 책임은 전적으로 개발자에게 있습니다.

각 마운트에 대해 일부 메타데이터를 저장해 두어 개발자가 시작 직후 해당 마운트/아카이브를 제거해야 하는지 결정할 수 있게 하는 것을 권장합니다. 한 가지 방법은 게임이 번들링된 뒤 zip 아카이브에 추가 파일을 넣는 것입니다. 예를 들어 게임에 필요한 관련 정보를 담은 metadata.json을 삽입할 수 있습니다. 그런 다음 시작 시 게임은 sys.load_resource("/metadata.json")로 이를 가져올 수 있습니다. 각 마운트의 커스텀 데이터에는 유니크한 이름이 필요합니다. 그렇지 않으면 마운트가 가장 높은 우선순위의 파일을 반환합니다.

이렇게 하지 않으면 컨텐츠가 엔진과 전혀 호환되지 않아 엔진이 종료되어야 하는 상황이 생길 수 있습니다.

마운트

live update 시스템은 여러 컨텐츠 아카이브를 동시에 사용할 수 있습니다. 각 아카이브는 이름과 우선순위를 가지고 엔진의 리소스 시스템에 “마운트”됩니다.

두 아카이브에 같은 파일 sprite.texturec가 있으면 엔진은 가장 높은 우선순위의 마운트에서 파일을 로드합니다.

엔진은 마운트 안의 어떤 리소스에 대해서도 참조를 유지하지 않습니다. 리소스가 메모리에 로드되고 나면 아카이브를 언마운트할 수 있습니다. 리소스는 언로드될 때까지 메모리에 남아 있습니다.

마운트는 엔진 재시작 시 자동으로 다시 추가됩니다.

아카이브를 마운트해도 아카이브가 복사되거나 이동하지 않습니다. 엔진은 아카이브의 경로만 저장합니다. 따라서 개발자는 언제든지 아카이브를 제거할 수 있으며, 다음 시작 시 마운트도 제거됩니다.

Live Update 스크립팅

live update 컨텐츠를 실제로 사용하려면 데이터를 게임에 다운로드하고 마운트해야 합니다. live update 스크립팅 방법에서 더 읽어보세요.

개발 시 주의사항

디버깅
게임의 번들된 버전을 실행할 때는 콘솔에 직접 액세스할 수 없습니다. 이 때문에 디버깅에 문제가 생깁니다. 하지만 커맨드 라인에서 어플리케이션을 실행하거나 번들 안의 실행 파일을 직접 더블클릭할 수 있습니다.

Running a bundle application

이제 게임은 print() 문을 출력하는 쉘 창과 함께 시작됩니다.

Console output

리소스 강제 재다운로드
개발자는 원하는 파일/폴더 어디에든 컨텐츠를 다운로드할 수 있지만, 보통 어플리케이션 경로 아래에 둡니다. 어플리케이션 지원 폴더의 위치는 운영체제에 따라 다릅니다. print(sys.get_save_file("", ""))로 찾을 수 있습니다.

liveupdate.mounts 파일은 “local storage” 아래에 있으며, 그 경로는 시작 시 콘솔에 “INFO:LIVEUPDATE: Live update folder located at: …“로 출력됩니다.

Local storage