2012-06-29 5 views
7

저는 게임 엔진이 자산 압축을 어떻게 처리하는지 알아 내려고했습니다. 분명히 그들은 게임을 만들 때 모든 자산을 압축합니다. 그러나 런타임 중에 어떻게 압축을 풀 수 있습니까? 내가 생각할 수있는 유일한 것은 기억으로 감압시키는 것이었지만 그것은 매우 기억 집중적이어야합니다. 그들이 HDD에 압축을 풀면 게임이 진행되는 동안 폴더가 가득 찰 것입니까? 이것은 매우 효율적으로 들리지 않습니다.게임 엔진 런타임 압축 해제

zlib (또는 기타)와 같은 라이브러리를 C++와 함께 사용하면이 런타임 압축이 어떻게 완료됩니까? 자산 압축

데이비드

+2

나도 몰라 찾을 수 있습니다 그가이 모든 과정을 설명 QuakeCon 2011에서 기조 연설을 한 무슨 '자산'은 여기에 구체적으로 의미가 있지만 별도의 압축 파일이 많은 경우 요청시 압축을 풀고 일부 캐싱을 시도해 볼 수 있습니다. 따라서 파일은 필요할 때만 메모리에서 압축 해제 된 다음 캐시됩니다. 다른 파일을 압축 해제해야하는 경우 캐시에서 시간이 필요하지 않은 경우 캐시가 너무 커지지 않도록 삭제됩니다. – sashoalm

+0

자산별로 게임, 이미지, 메쉬, 재료, 쉐이더와 같은 것들을 필요로 함을 의미합니다. – Constan7ine

+0

"Game Coding Complete"에는 거의 포화가 설명 된 방법이 있습니다. – risingDarkness

답변

9

이렇게 많은 양의 데이터가있는 게임을 사용하면 합리적인 양의 메모리에 맞지 않으므로 메모리에 한꺼번에 모든 데이터를로드 할 수 없기 때문에 몇 가지 버퍼를 정의 할 수 있습니다. 캐시로 사용하는 데이터

가장 낮은에서 최고에 속도를 위해

이제 메모리는 같은 :

  • DVD
  • 하드 드라이브
  • 당신이 데이터를 스트리밍 할 필요가 없습니다 이상적으로

RAM 예를 들어 콘솔 게임을 만들어야한다면 DVD를 고려해야합니다. 따라서 사용 가능한 각 저장 영역에 대해 캐시로 사용할 버퍼를 정의하십시오.

게임 엔진이 자산을 필요로한다고 판단하면 가장 빠른 캐시를보고 자산이 이미로드되었는지 확인해야합니다. 그것이 운이 좋다면 즉시 보낼 수 있습니다. 가장 빠른 캐시에 없다면 하드 드라이브 캐시까지 내려야합니다. 이 파일은 이미 압축을 풀어서 메모리에로드 할 준비가 된 자산을 보관하는 파일입니다. 가장 빠른 캐시가 완전히 채워지지 않으면 데이터로드를 시작하고 준비가되었을 때 사용할 수 있습니다. 충분한 공간이 없으면 먼저 다른 자산을 언로드해야합니다. 새 자산을로드 할 공간이 생길 때까지 최근에 사용한 자산을 제거하는 것이 좋습니다.

이제 하드 드라이브 캐시에 데이터가로드되어 있지 않은 상태에서 아카이브로 한 단계 더 내려 가야하는 경우 zip 파일 형식이 강제로 적용되지 않기 때문에 zip 형식을 사용하여 압축해야합니다. 전체 압축 파일을 압축 해제하여 단 하나의 파일에 액세스 할 수 있도록하려면 아카이브 내의 해당 파일의 오프셋을 찾아서 하드 드라이브 캐시로 압축을 풀면됩니다. 다시 캐시가 가득 차면 다른 애셋을 먼저 언로드해야합니다. 가장 최근에 사용한 것을 제거하는 것이 좋습니다. 그러나 성능을 향상시킬 것으로 생각되는 경우 다른 알고리즘을 사용해 볼 수도 있습니다.

존 Karmack 어쩌면 조금 (다른 멋진 것들 사이에) 게시물에서 내가 할 수있는 것보다 더 나은, 당신이 here

+0

와우 덕분에 훌륭한 답변을드립니다! – Constan7ine

0

게임 엔진 거래

같은 형상 모델 (삼각/다각형 모델), 질감 등 각 자산 클래스가 다른를 가지고 서로 다른 게임 엔진 자산이 있습니다 압축 전략. 더 자세하게 얘기해 주 시겠어요 ? 모델 압축을위한

, Check this

+0

Ok는 질감을 말합니다. 내가 전에 말했던 이유는 이전에 작업 한 엔진이 거의 모든 것을 압축하여 런타임에 사용하는 하나 또는 두 개의 파일로 표시하기 때문입니다. – Constan7ine

+0

나는 이것을보아야한다고 생각합니다 : http://www.webpronews.com/google- talks-texture-compression-for-gdc-2012-03 – Ram

3

압축, 어디에 여러 레이어에 여러 가지 방법으로 발생하고, 할 수있는 방법은 전적으로 의존하고 사용하는 것을 그 목적 & 목표는 압축 공간을 절약 대해 항상 아닙니다 (이다 디스크에).

기본적으로 최상위 수준에서 모든 자산은 대량 아카이브로 압축 될 수 있습니다 (읽기 속도가 빨라지므로 HDD에서 읽는 것이 적으므로이 경우 처리 능력을 희생합니다. DMA를 사용하여 CPU를 전혀 사용하지 않는 압축되지 않은 파일을 읽음), 거의 항상 메모리에서 메모리로 읽습니다. HDD로 다시 읽으면 성능이 저하되고 여러 가지 문제가 발생할 수 있습니다 (어떤 경우에는 이전 세대 콘솔 에서처럼 불가능).

두 번째 단계는 자산 자체에서 수행 할 수 있습니다. 예를 들어, 텍스처를 여러 가지 방법으로 압축 할 수 있지만 요즘 압축 해제 (S3TC/DXTn, BCn)는 압축 해제가 지원됨에 따라 주로 사용됩니다 (또는 드라이버에 의해 에뮬레이션 된) 하드웨어에서, 일단 아카이브/디스크에 대한 읽을 때, 더 이상의 압축 해제가 필요하지 않습니다.

압축 전략은 특히, 메모리 레이아웃에 매우 민감 제한된 자원을 가지고 C와 ZLIB 같은 라이브러리 (또는 다른) 사용 등

작은 캐시가 콘솔에, 플랫폼에 따라 다를 ++ ,이 런타임 압축 해제는 어떻게 수행됩니까?

은 일반적으로 당신은 잘 자세한 내용 here,이 블리자드 엔터테인먼트에 의해 사용되는 MPQ format (이다 않는 문서화 된 AAA 아카이브 시스템의 좋은 예를 RAM에 보관의 메모리 매핑 된 파일을 사용하고 직접 압축을 풀), 그것은 디아블로 I, zlib for Warcraft III, bzip2 for World와 같은 다양한 압축 알고리즘을 사용합니다. 그리고 그들은 SCII와 같은 최신 게임을 위해 LZ와 스파 스 컴프레션을 추가했습니다.

1 월 Wassenberg의 논문 (Optimizing File Accesses via Ordering and Caching)에는 파일 관리에 대한 좋은 분석이 있습니다.