게임에 대한 주문형 설치
이 기술 문서에서는 Windows Installer를 사용하여 주문형 설치 및 백그라운드 설치의 두 가지 기술에 대해 설명합니다. 게임은 이러한 설치 기술을 활용하여 설치 시간을 줄임으로써 플레이어에게 더 좋고 즐거운 게임 환경을 제공할 수 있습니다.
개요
설치는 오랫동안 컴퓨터 기반 애플리케이션의 요소였습니다. 현재 대부분의 애플리케이션을 사용하려면 먼저 사용자의 로컬 하드 드라이브에 설치해야 합니다. 컴퓨터 게임도 예외는 아닙니다. 소비자가 Microsoft Windows 게임을 구입하고 실행하려고 하면 먼저 게임 디스크에서 하드 드라이브로 필요한 파일을 복사하는 설치 프로세스를 거쳐야 합니다. 이 설치 프로세스는 일반적으로 시간이 오래 걸리며 완료하는 데 1시간 정도 걸릴 수 있습니다. 설치 시간은 게임 디스크를 삽입한 후 콘솔 게임을 즉시 플레이할 수 있으므로 일부 플레이어의 경우 컴퓨터 기반 게임보다 콘솔 게임을 더 바람직하게 만드는 요소입니다. 이 문서에서 설명하는 기술은 설치 시간을 대폭 줄여 이 문제를 해결하려고 시도합니다.
일반적으로 게임에서는 시작하기 전에 파일의 전부 또는 대부분을 설치해야 합니다. 주문형 설치를 달성하려면 게임 리소스를 모듈화해야 합니다. 즉, 개발자는 애플리케이션의 리소스(그래픽, 오디오 등)를 구성 요소로 나누어야 합니다. 각 구성 요소는 한 단위로 설치하거나 제거할 수 있는 리소스 집합입니다. 이 작업이 완료되면 게임 개발자는 하나 이상의 기능(일반적으로 수준 또는 영역당 하나 이상)을 정의합니다. 애플리케이션의 각 기능은 해당 특정 기능을 실행하는 데 필요한 구성 요소 집합을 지정합니다. 애플리케이션이 설치되면 해당 기능을 "설치"(설치 시 로컬 하드 드라이브에 복사된 구성 요소) 또는 "보급됨"(애플리케이션에서 해당 기능을 사용할 때 초기 설치 후 로컬 하드 드라이브에 복사된 구성 요소)으로 표시할 수 있습니다. 게임 개발자는 최소한의 기능 집합을 설치하여 게임을 시작하고 실행하도록 설계하여 설치 시간을 줄일 수 있습니다. 애플리케이션이 실제로 해당 기능이 제공하는 기능을 사용해야 하는 경우 나머지 기능은 요청 시 보급 및 설치로 표시될 수 있습니다.
게임은 Windows Installer를 호출하여 설치되지 않은 특정 기능을 설치할 수 있습니다. 설치를 백그라운드에서 표시하려면 기본 스레드가 게임 논리를 계속 처리하고 화면을 렌더링하는 동안 작업자 스레드를 사용하여 설치 관리자를 호출할 수 있습니다. 이렇게 하면 설치로 인한 게임 플레이 중단이 최소화됩니다. 게임은 언제든지 설치를 시작할 수 있습니다. 그러나 설치는 프로세서 주기를 사용하기 때문에 사용자가 작업 중간에 있을 때와 같이 기본 스레드가 처리 능력이 매우 필요한 경우 일반적으로 설치를 수행하는 것은 좋지 않습니다. 예를 들어 설치를 수행하는 데 좋은 시간은 사용자가 게임 메뉴에 있는 시간, 게임이 일시 중지되거나 최소화된 시간 또는 사용자가 소개 영화 또는 컷씬을 시청하는 경우일 수 있습니다.
패치 지원
오늘날 대부분의 게임은 버그가 수정되고 새로운 기능이 추가될 때 배송된 후에도 업데이트해야 합니다. 업데이트하려면 패치가 필요한 경우가 많으며, 이는 일반적으로 게임에 대한 간단한 절차입니다. 필요한 모든 파일이 사용자의 하드 드라이브에 설치되므로 게임을 패치하려면 수정된 파일을 하드 드라이브에 복사하고 기존 파일을 덮어씁니다. 주문형 설치를 사용하는 경우 패치 시 모든 파일이 설치 및 복사되는 것은 아닙니다. 따라서 패치는 단순히 업데이트된 파일을 게임 폴더에 쓸 수 없습니다.
Windows Installer 에는 주문형 설치를 사용하는 애플리케이션을 패치하는 기능이 있습니다. 패치를 적용할 때 설치 관리자는 패치를 시스템에 캐시합니다. 이 기능은 작은 델타가 있는 패치에 적합합니다. 원래 릴리스된 파일은 패치할 때 더 이상 디스크에 있을 필요가 없으므로 해당 파일을 보급할 수 있습니다. 나중에 애플리케이션이 실행되고 파일에 액세스해야 하는 경우 설치 관리자는 미디어에서 원래 릴리스된 버전(예: CD)을 복사하고 저장된 패치 데이터를 읽은 후 패치를 적용하여 해당 파일의 최신 버전을 설치합니다.
InstallOnDemand SDK 샘플
게임용 주문형 설치 샘플은 이 문서에서 설명하는 주문형 설치 기술을 보여 줍니다. 다른 샘플과 달리 게임용 주문형 설치는 샘플 브라우저에서 직접 실행할 수 없습니다. 샘플은 Windows Installer를 사용하여 설치를 관리하므로 설치 관리자의 설치된 애플리케이션 데이터베이스에 포함되어야 합니다.
샘플을 시작하려면
- 샘플 브라우저에서 프로젝트 설치 링크를 사용하여 샘플의 파일을 폴더에 복사합니다.
- InstallOnDemand.msi를 두 번 클릭하여 샘플을 설치합니다.
- 일반적인 설치를 선택합니다.
- 설치된 폴더(일반적으로 Program Files\InstallOnDemand)에서 InstallOnDemand.exe를 시작하거나 시작 메뉴\프로그램에서 시작하여 샘플을 시작합니다.
InstallOnDemand.msi는 설치 관리자가 인식하는 데이터베이스입니다. 디렉터리 구조, 복사할 리소스, 함께 복사할 리소스, 작성할 레지스트리 값, 만들 바로 가기 등 전체 설치 프로세스를 정의합니다.
시작되면 샘플은 소개 시퀀스를 재생합니다. 플레이어는 ESC 키를 눌러 종료하고 기본 메뉴를 입력할 수 있습니다. 소개 후 플레이어는 문자 이름을 입력하고 통계를 스크롤하여 새 게임을 시작할 수 있습니다. 샘플이 소개 시퀀스를 재생하기 전에 샘플은 수준 1에 대한 기능이 설치되어 있는지 검사 설치 관리자 함수를 호출합니다. 수준 1 기능이 설치되지 않은 경우 샘플은 백그라운드 스레드를 사용하여 설치 관리자에게 게임을 설치하도록 요청하는 반면, 기본 스레드는 다른 작업(예: 소개 시퀀스 재생, 메뉴 렌더링 또는 캐릭터 생성 시 플레이어와 상호 작용)을 수행합니다. 설치가 진행되는 동안 사용자가 게임에 점유되어(소개를 보거나 새 캐릭터를 만드는) 기존 게임 설치와는 다른 환경입니다. 플레이어가 캐릭터 만들기를 완료하면 샘플에서 수준 1에 대한 리소스를 로드합니다.
샘플 화면의 오른쪽에는 "Play Level 1"에서 "Play Level 5"로 표시된 5개의 단추가 있습니다. 이러한 단추는 플레이어가 현재 레벨을 완료하고 다음 레벨로의 진행을 시뮬레이션합니다. 이러한 단추 중 하나를 클릭하면 방금 완료한 수준에 대한 정보를 보여 주는 통계 화면이 나타납니다. 또한 샘플은 설치 관리자에게 아직 설치되지 않은 경우 검사 다음 수준을 설치하도록 요청하는 데도 소요됩니다. 플레이어가 통계 화면을 읽는 동안 설치가 수행되므로 사용자가 확인을 클릭하여 다음 수준을 입력하면 수준 리소스가 모두 설치되고 로드할 준비가 됩니다.
샘플의 기능 및 구성 요소
일반적으로 게임에서는 시작하기 전에 파일의 전부 또는 대부분을 설치해야 합니다. 주문형 설치를 달성하려면 게임 리소스를 모듈화해야 합니다. 즉, 개발자는 애플리케이션의 리소스(그래픽, 오디오 등)를 구성 요소로 나누어야 합니다. 각 구성 요소는 한 단위로 설치하거나 제거할 수 있는 리소스 집합입니다. 이 작업이 완료되면 게임 개발자는 하나 이상의 기능(일반적으로 수준 또는 영역당 하나 이상)을 정의합니다. 애플리케이션의 각 기능은 해당 특정 기능을 실행하는 데 필요한 구성 요소 집합을 지정합니다. 애플리케이션이 설치되면 해당 기능을 "설치"(설치 시 로컬 하드 드라이브에 복사된 구성 요소) 또는 "보급됨"(애플리케이션이 나중에 해당 기능을 사용할 때 로컬 하드 드라이브에 복사된 구성 요소)으로 표시할 수 있습니다. 게임 개발자는 최소한의 기능 집합을 설치하여 게임을 시작하고 실행을 시작하도록 설계하여 설치 시간을 줄일 수 있습니다. 애플리케이션이 실제로 해당 기능이 제공하는 기능을 사용해야 하는 경우 나머지 기능은 주문형으로 보급 및 설치될 수 있습니다.
다음 표에서는 샘플에서 정의하는 6가지 최상위 기능을 나열합니다.
기능 이름 | 기능 | 구성 요소 | Files |
---|---|---|---|
핵심 | 수준에 관계없이 항상 필요한 리소스를 포함합니다. 이러한 리소스는 샘플 실행 파일, 소개 시퀀스 및 로드 화면에 필요한 미디어 및 샘플의 모든 렌더링을 처리하는 .fx 파일입니다. | 핵심 | InstallOnDemand.exe, InstallOnDemand.fx, Loading.bmp, Level.x |
핵심 | (위와 동일) | CoreUI | Media\UI\dxutcontrols.dds, Media\UI\DXUTShared.fx, Media\UI\arrow.x |
핵심 | (위와 동일) | CoreMisc | Media\Misc\seafloor.x, Media\Misc\seafloor.bmp |
핵심 | (위와 동일) | CoreSpeeder | Media\PRT Demo\LandShark.x, Media\PRT Demo\speeder_diff.jpg |
핵심 | (위와 동일) | CoreReg | 해당 없음(레지스트리 값) |
Level1 | 수준 1에서 사용하는 리소스를 제공합니다. | Level1 | Level1.jpg |
Level1 | (이전과 동일) | L1Skybox | Media\Light Probes\galileo_cross.dds |
Level2 | 수준 2에서 사용하는 리소스를 제공합니다. | Level2 | Level2.jpg |
Level2 | (이전과 동일) | L2Skybox | Media\Light Probes\grace_cross.dds |
Level3 | 수준 3에서 사용하는 리소스를 제공합니다. | Level3 | Level3.jpg |
Level3 | (이전과 동일) | L3Skybox | Media\Light Probes\rnl_cross.dds |
수준 4 | 수준 4에서 사용하는 리소스를 제공합니다. | 수준 4 | Level4.jpg |
수준 4 | (이전과 동일) | L4Skybox | Media\Light Probes\stpeters_cross.dds |
수준 5 | 수준 5에서 사용하는 리소스를 제공합니다. | 수준 5 | Level5.jpg |
수준 5 | (이전과 동일) | L5Skybox | Media\Light Probes\uffizi_cross.dds |
Level1~Level5 기능에는 샘플에서 직접 사용하지 않는 파일이 포함된 추가 하위 기능이 있습니다. 이러한 하위 기능 파일이 추가되어 설치 시간이 더 오래 걸립니다. 이 작업은 샘플이 실행되는 동안 백그라운드에서 실행되는 진행 중인 설치 작업을 설명하기 위해 수행됩니다.
다음 표에서는 하위 기능을 나열합니다.
기능 | 하위 기능 | Files |
---|---|---|
Level1 | L1PH1, L1PH2, L1PH3, L1PH4, L1PH5 | Level1 자리 표시자 데이터\L1PH1.dat Level1 자리 표시자 데이터\L1PH2.dat Level1 자리 표시자 데이터\L1PH3.dat Level1 자리 표시자 데이터\L1PH4.dat Level1 자리 표시자 데이터\L1PH5.dat |
Level2 | L2PH1, L2PH2, L2PH3, L2PH4, L2PH5 | Level2 자리 표시자 데이터\L2PH1.dat Level2 자리 표시자 데이터\L2PH2.dat Level2 자리 표시자 데이터\L2PH3.dat Level2 자리 표시자 데이터\L2PH4.dat Level2 자리 표시자 데이터\L2PH5.dat |
Level3 | L3PH1, L3PH2, L3PH3, L3PH4, L3PH5 | Level3 자리 표시자 데이터\L3PH1.dat Level3 자리 표시자 데이터\L3PH2.dat Level3 자리 표시자 데이터\L3PH3.dat Level3 자리 표시자 데이터\L3PH4.dat Level3 자리 표시자 데이터\L3PH5.dat |
수준 4 | L4PH1, L4PH2, L4PH3, L4PH4, L4PH5 | Level4 자리 표시자 데이터\L4PH1.dat Level4 자리 표시자 데이터\L4PH2.dat Level4 자리 표시자 데이터\L4PH3.dat Level4 자리 표시자 데이터\L4PH4.dat Level4 자리 표시자 데이터\L4PH5.dat |
수준 5 | L5PH1, L5PH2, L5PH3, L5PH4, L5PH5 | Level5 자리 표시자 데이터\L5PH1.dat Level5 자리 표시자 데이터\L5PH2.dat Level5 자리 표시자 데이터\L5PH3.dat Level5 자리 표시자 데이터\L5PH4.dat Level5 자리 표시자 데이터\L5PH5.dat |
설치하는 동안 핵심 기능은 "설치"로 표시되고 다른 모든 기능은 "보급됨"으로 표시되어야 합니다. 6개 대신 하나의 기능만 설치하면 게임이 시작될 때까지 플레이어가 기다려야 하는 시간이 크게 줄어듭니다.
설치
Windows Installer는 애플리케이션이 보급된 기능을 설치하도록 요청하는 메커니즘을 제공합니다. 그러나 메커니즘은 동기 API(애플리케이션 프로그래밍 인터페이스) 호출입니다. 즉, 애플리케이션은 설치가 완료될 때까지 호출 내에서 대기해야 합니다. 백그라운드 설치를 수행하려면 기본 애플리케이션 스레드가 플레이어 시각적 피드백을 계속 제공하기 위해 화면에 렌더링하는 것과 같은 다른 중요한 작업을 자유롭게 수행할 수 있도록 작업자 스레드가 필요합니다.
샘플에는 샘플 실행 중에 발생하는 세 가지 설치 상태(활성 설치, 수동 설치 및 설치 없음)가 있습니다.
- 활성 설치는 하나 이상의 기능에서 제공하는 리소스에 액세스하거나 로드해야 하는 경우 샘플에서 시작한 요청입니다. 샘플은 리소스가 설치될 때까지 계속할 수 없을 때 이 작업을 수행합니다.
- 수동 설치는 샘플이 플레이어가 메뉴에 있거나 컷 장면을 보는 것과 같은 중요한 작업을 수행하지 않을 때 시작됩니다. 이 경우 샘플의 기능이 계속 보급되면 작업자 스레드가 검사. 찾을 수 있는 경우 설치 관리자를 호출하여 해당 기능을 설치합니다. 이 프로세스는 샘플의 모든 기능이 설치될 때까지 반복됩니다. 기본적으로 수동 설치는 추가 프로세서 주기를 활용하여 기본 샘플에 가장 방해가 적은 경우 백그라운드에서 설치를 수행합니다.
- 플레이어가 게임에 적극적으로 참여할 때는 설치가 수행되지 않습니다. 이렇게 하면 프레임 속도 삭제를 방지하여 사용자 환경을 방해할 수 있습니다.
샘플에서 CMsiUtil 클래스는 모든 설치 관련 작업을 처리하도록 정의됩니다. 기본적으로 CMsiUtil은 설치 관리자를 호출하는 작업자 스레드를 사용하여 샘플의 기능을 루프에 설치합니다. 클래스에는 설치 요청을 저장하는 두 개의 큐가 있습니다. 하나는 활성 설치를 위한 우선 순위가 높은 큐이고 다른 하나는 수동 설치를 위한 낮은 우선 순위 큐입니다. 초기화 중에 클래스는 제품의 모든 기능을 열거하고 수동 설치 큐에 추가합니다. 전체 제품이 이러한 방식으로 큐에 대기되므로 샘플에 충분한 무료 프로세서 주기가 있는 경우 결국 전체 제품이 설치됩니다.
샘플에서 활성 설치를 요청해야 하는 경우 샘플은 CMsiUtil::UseFeatureSet()을 호출하고 최상위 기능의 이름을 전달할 수 있습니다. UseFeatureSet()은 작업자 스레드가 설치할 수 있도록 요청된 기능과 모든 하위 기능을 활성 설치 큐에 큐에 넣습니다.
설치 요청을 실행하는 동안 작업자 스레드는 활성 설치 큐와 수동 설치 큐를 검사 두 큐에 추가 요청이 있는지 확인합니다. 스레드가 요청을 찾을 때마다 설치 관리자 API를 호출하여 실제 설치를 수행합니다. 두 큐가 모두 비어 있으면 작업자 스레드는 WaitForSingleObject를 호출하여 절전 모드로 전환됩니다. 초기화 중에 전체 제품이 수동 설치 큐에 배치되므로 빈 큐는 전체 제품이 설치되었음을 의미합니다.
샘플에서는 CMsiUtil::EnablePassiveInstall()을 호출하여 수동 설치를 사용하거나 사용하지 않도록 설정합니다. EnablePassiveInstall(true)은 수동 설치에 대한 사용 횟수를 증가시키고 EnablePassiveInstall(false)은 이를 감소합니다. 사용 수가 0보다 큰 경우 클래스는 수동 설치 큐를 처리합니다. 이 샘플에서는 다음 중 어느 것이라도 true일 때 수동 설치를 허용합니다.
- 사용자가 초기 소개 시퀀스를 보고 있습니다.
- 사용자가 샘플 메뉴에서 탐색하고 있습니다.
- 사용자가 수준 끝에서 통계를 보고 있습니다.
- 샘플 애플리케이션은 포커스를 잃고 백그라운드로 이동합니다.
CMsiUtil의 메서드는 다음과 같습니다.
메서드 | 설명 |
---|---|
AbortAllRequests | 현재 설치가 중단되고 활성 설치 요청 큐가 비워집니다. |
AbortCurrentRequest | 진행 중인 설치가 중단되도록 합니다. 작업자 스레드는 큐에 있는 경우 다음 요청을 처리합니다. |
EnablePassiveInstall | 수동 설치 사용 횟수를 증가 또는 감소합니다. 샘플에서는 이 호출을 사용하여 수동 설치가 발생할 수 있고 발생할 수 없는 시기를 제어합니다. |
GetCurrentFeatureName | 현재 설치 중인 기능의 이름을 반환합니다. |
GetFeatureProgress | 설치 중인 기능에 대한 현재 틱 위치를 반환합니다. |
GetFeatureProgressMax | 설치 중인 기능에 대한 최대 진행률 틱 수를 반환합니다. |
GetLastError | 이 메서드를 사용하여 이전 설치 요청에서 반환 코드를 검색합니다. |
GetPassiveProgress | 수동 설치에 대한 진행률 표시줄 틱 위치를 반환합니다. |
GetPassiveProgressMax | 수동 설치에 대한 현재 틱 위치 및 최대 틱 수를 반환합니다. 샘플은 함께 사용하여 수동 설치의 전반적인 진행률을 표시할 수 있습니다. |
GetProgress | 활성 기능 집합 설치의 진행률 표시줄 틱 위치를 반환합니다. 샘플에서 설치 진행률 표시줄을 렌더링할 때 사용됩니다. Windows Installer는 설치 중인 기능 하나에 대한 진행률 정보만 제공하므로 이 메서드는 사용자가 전체 설치를 하나의 작업으로 볼 수 있도록 요청된 기능 간에 진행률 표시줄을 나눕니다. |
GetProgressMax | 활성 기능 집합 설치의 최대 진행률 표시줄 틱 수를 반환합니다. 샘플에서 설치 진행률 표시줄을 렌더링할 때 사용됩니다. |
초기화 | GUID(Globally Unique Identifier)를 사용하여 클래스를 초기화합니다. 또한 이 메서드는 보급되었지만 아직 설치되지 않은 애플리케이션의 모든 기능을 열거하고 수동 설치 큐에 배치하여 수동 설치를 설정합니다. |
IsInstallInProgress | 이 메서드를 사용하여 활성 설치가 처리되고 있는지 확인합니다. |
UseFeature | UseFeatureSet에서 호출하는 Private 메서드입니다. 기능이 설치되어 있는지 확인합니다. 요청된 기능이 설치되어 있으면 메서드가 반환됩니다. 기능이 아직 설치(보급)되지 않은 경우 메서드는 작업자 스레드에 대한 새 활성 설치 요청을 큐에 대기한 다음 반환합니다. 요청된 설치가 완료되면 신호를 받을 선택적 이벤트 핸들입니다. |
UseFeatureSet | 특정 기능 또는 해당 하위 기능에서 제공하는 기능에 액세스해야 하는 경우 샘플에서 호출됩니다. 이 메서드는 샘플의 모든 기능을 열거하고 지정된 루트 기능의 하위 기능에 대해 UseFeature()를 호출합니다. 샘플은 전체 기능 집합이 설치될 때 신호를 받을 이벤트 핸들을 전달할 수 있습니다. 모든 기능이 집합으로 설치되므로 핸들은 모든 기능 대신 UseFeature()에서 큐에 대기하는 마지막 기능에 대해 지정되므로 요청된 모든 기능이 설치된 후 샘플에 한 번 알림을 받습니다. |
UseProduct | 작업자 스레드가 설치 관리자를 호출하여 전체 제품 설치를 수행하도록 활성 설치 요청을 큐에 대기합니다. 요청된 설치가 완료되면 신호를 받을 선택적 이벤트 핸들입니다. |
제한 사항
현재 버전의 설치 관리자는 여러 스레드에서 동시에 액세스할 수 있도록 설계되지 않았습니다. 따라서 작업자 스레드가 설치 관리자를 호출하는 경우 기본 스레드는 설치 관리자를 호출하지 않아야 합니다. 이 제한 사항의 예는 기본 스레드가 기능을 요청한 다음 작업자 스레드가 설치를 완료하기 전에 동일한 기능을 다시 요청할 때 샘플에서 발생합니다. 두 번째 요청은 MsiQueryFeatureState()를 호출하여 요청된 기능이 이미 설치되어 있는지 확인합니다. 설치 관리자가 작업자 스레드가 파일을 복사할 때 기능이 완전히 설치되었음을 나타낼 수 있기 때문일 수 있습니다.
다행히도, 이것에 대 한 쉬운 해결이 있다. CMsiUtil은 MsiQueryFeatureState() 또는 MsiUseFeature()와 같은 함수를 호출하여 해당 기능의 설치 상태를 요청하기 전에 작업자 스레드에서 기능이 설치되고 있는지 여부를 검사. 이 제한은 다른 곳에서도 문제가 될 수 있습니다.
패치는 최종 사용자의 컴퓨터에서 주문형 설치가 얼마나 잘 작동하는지에 영향을 줄 수 있습니다. 이전 버전에서 변경된 데이터만 포함하는 패치를 적용하려면 델타를 적용하기 위해 업데이트된 파일의 이전 버전을 설치해야 할 수 있습니다. 이 경우 패치는 게임에 패치를 적용하기 전에 설치 관리자가 영향을 받는 보급 기능을 설치하도록 요청해야 합니다.
샘플은 Windows Installer가 컴퓨터에 있다고 가정하기 때문에 InstallOnDemand.msi를 시작하여 설치됩니다. 설치 관리자가 없으면 .msi 파일이 인식되지 않으며 파일을 시작해도 작동하지 않습니다. 이 문제를 해결하려면 애플리케이션에서 설치 프로그램을 사용하여 작업을 수행해야 합니다. 이 프로그램은 먼저 검사 설치 관리자가 있는지, 있는 경우 해당 버전을 확인해야 합니다. 버전이 애플리케이션의 요구 사항을 충족하지 않는 경우 설치 프로그램에서 Windows Installer를 설치한 후 .msi 파일을 시작해야 합니다. 이 프로세스를 부트스트래핑이라고 합니다. 애플리케이션은 일반적으로 부트스트래핑 설치 프로그램 Setup.exe의 이름을 지정합니다. 샘플은 부트스트래핑을 처리하지 않습니다. 그러나 부트스트래핑에 대한 자세한 내용은 Windows Installer에서 확인할 수 있습니다.
또한 개발자는 게임에서 각 기능의 크기에 주의를 기울여야 합니다. 진행 중인 설치를 취소하면 설치 관리자가 설치 전에 컴퓨터를 상태로 복원합니다. 즉, 기능 설치가 완전히 취소되고 부분 기능 설치가 없습니다. 큰 기능을 사용하려면 설치하는 데 시간이 더 오래 걸리기 때문에 설치가 중단 및 취소되거나 설치가 기본 애플리케이션을 방해할 가능성이 높아집니다. 예를 들어 사용자가 게임 플레이 중간에 게임 메뉴를 표시할 때 수동 설치를 사용하도록 설정하는 것이 있습니다. 기능이 설치되고 사용자가 다시 플레이로 돌아가면 게임에서 수동 설치를 완료하거나 수동 설치를 취소할 수 있는 두 가지 작업 중 하나를 수행할 수 있습니다. 큰 기능은 두 모델 중 하나에 맞지 않습니다. 게임에서 대규모 설치를 완료할 수 있는 경우 설치로 인해 오랫동안 게임의 렌더링 성능이 저하될 수 있습니다. 반대로, 게임이 설치를 취소하는 경우 사용자는 게임으로 돌아가기 전에 오랫동안 메뉴에 있어야 합니다. 개발자는 개별 게임에 가장 적합한 균형 잡힌 기능 크기를 찾아야 합니다.