---
title: "PNG 를 넣든 PSD 를 넣든 결과는 같다"
description: "이미지 압축과 텍스처 압축은 다른 개념입니다. 그리고 모바일 빌드에 DXT 를 지정하면 런타임에 압축이 통째로 풀려서 앱이 죽습니다."
author: "유니얼"
pubDate: 2026-09-09
category: "game-dev/unity/rendering"
tags: ["Unity", "최적화", "텍스처"]
canonical: https://blog.unialgames.com/posts/unity-texture-compression/
---
"PNG 대신 JPG 로 넣으면 용량이 줄어서 가벼워지지 않나요."

자주 나오는 질문이고, 답은 **아니오** 입니다. 그리고 그 이유가 텍스처 최적화의 출발점입니다.

## 두 압축은 다른 것이다

<figure class="diagram">
<svg viewBox="0 0 680 190" role="img" aria-label="원본 이미지가 무엇이든 유니티 임포터가 GPU 포맷으로 재압축해서 메모리에 올린다는 흐름 그림">
<g stroke="var(--border)" fill="var(--bg)">
<rect x="20" y="60" width="120" height="52" rx="4"></rect>
</g>
<text x="34" y="84" font-size="12" fill="var(--text-muted)">원본 파일</text>
<text x="34" y="102" font-size="11" fill="var(--text-muted)">PNG / JPG / PSD</text>
<g stroke="var(--border)" fill="none">
<path d="M144 86 L196 86"></path>
</g>
<text x="148" y="78" font-size="11" fill="var(--text-muted)">임포트</text>
<g stroke="var(--accent)" fill="var(--accent-soft)">
<rect x="200" y="60" width="130" height="52" rx="4"></rect>
</g>
<text x="214" y="84" font-size="12" fill="var(--accent)">유니티 임포터</text>
<text x="214" y="102" font-size="11" fill="var(--accent)">재압축</text>
<g stroke="var(--border)" fill="none">
<path d="M334 86 L386 86"></path>
</g>
<g stroke="var(--border)" fill="var(--bg)">
<rect x="390" y="60" width="130" height="52" rx="4"></rect>
</g>
<text x="404" y="84" font-size="12" fill="var(--text-muted)">GPU 포맷</text>
<text x="404" y="102" font-size="11" fill="var(--text-muted)">ASTC / BC</text>
<g stroke="var(--border)" fill="none">
<path d="M524 86 L576 86"></path>
</g>
<g stroke="var(--border)" fill="var(--bg)">
<rect x="580" y="60" width="80" height="52" rx="4"></rect>
</g>
<text x="594" y="90" font-size="12" fill="var(--text-muted)">메모리</text>
<text x="20" y="36" font-size="13" fill="var(--text-muted)">원본이 무엇이든 이 자리를 반드시 지나갑니다</text>
<text x="20" y="152" font-size="12" fill="var(--text-muted)">PNG 와 JPG 는 디스크에 파일을 작게 두려고 만든 압축이라, GPU 가 그 상태로는 못 읽습니다.</text>
<text x="20" y="172" font-size="12" fill="var(--text-muted)">ASTC 와 BC 는 GPU 가 압축된 채로 샘플링할 수 있게 만든 압축입니다.</text>
</svg>
<figcaption>원본이 PNG 든 JPG 든 PSD 든, 최종 결과물은 임포트 설정이 정합니다.</figcaption>
</figure>

- **이미지 압축** (PNG, JPG): 파일을 작게 저장하는 방법입니다.
  화면에 그리려면 통째로 풀어야 합니다
- **텍스처 압축** (ASTC, BC): GPU 가 **압축된 상태 그대로 샘플링**할 수 있는 형식입니다.
  풀지 않고 쓰기 때문에 메모리도 대역폭도 아낍니다

원본이 무엇이든 Unity 가 GPU 포맷으로 다시 압축합니다.
그러니 PSD 를 그대로 프로젝트에 둬도 됩니다. 2D Animation 이 쓰는 PSB 도 마찬가지입니다.
아티스트가 레이어를 살려 둔 원본을 그대로 커밋하는 편이 오히려 낫습니다.
**빌드 결과물은 임포트 설정이 정하지 원본 확장자가 정하지 않습니다.**

## 포맷 선택은 거의 고민할 게 없다

| 타겟 | 쓸 것 | 비고 |
| --- | --- | --- |
| 모바일 (Android, iOS) | **ASTC** | 사실상 표준. 블록 크기로 품질과 용량을 조절합니다 |
| PC, 콘솔 | **BC** | DXT 와 BC 는 같은 계열의 다른 이름입니다. BC7 이 품질이 좋습니다 |
| ETC, ETC2 | 폴백 전용 | ASTC 를 못 쓰는 구형 기기용으로만 |
| PVRTC | **지원 종료** | 새로 임포트하는 텍스처에는 선택지에 없습니다 |

ASTC 는 블록 크기가 작을수록 화질이 좋고 용량이 큽니다.
`4x4` 가 제일 좋고 `12x12` 가 제일 작습니다. 캐릭터는 `6x6` 정도,
배경은 `8x8` 정도에서 시작해서 눈으로 보며 조절하면 됩니다.

## 모바일에 BC 를 지정하면 앱이 죽는다

이게 이 글에서 제일 중요한 한 줄입니다.

플랫폼별 오버라이드를 안 해 두면 기본값이 그대로 나가는데,
**Android 빌드에 DXT/BC 가 지정돼 있으면 하드웨어가 그 포맷을 못 읽습니다.**
그러면 Unity 가 런타임에 **압축을 전부 풀어서** 올립니다.

압축을 풀면 메모리가 몇 배로 뜁니다.
그리고 모바일은 시스템과 GPU 가 물리 메모리를 공유하기 때문에 여유가 없습니다.
OS 가 앱을 강제로 종료시킵니다.

증상이 고약합니다. 에디터에서는 멀쩡하고, 고사양 기기에서도 잘 돌고,
저사양 기기에서만 특정 씬에서 튕깁니다.
그리고 튕기는 거라 로그도 안 남습니다.

> 텍스처가 몇 백 장이면 사람이 눈으로 다 못 봅니다.
> 임포트 설정을 훑는 에디터 스크립트를 한 번 짜 두는 편이 낫습니다.
> 모바일 타겟에 BC 계열이 섞여 있는지, 이건 한 번만 확인하면 되는 게 아니라
> 에셋이 추가될 때마다 다시 생깁니다.

## 같이 보는 임포트 설정 셋

압축 포맷만큼 자주 새는 것이 이 세 개입니다.

**Read/Write Enabled.** 켜면 CPU 쪽에도 사본을 하나 더 들고 있습니다.
**메모리가 두 배** 입니다. `GetPixels` 로 픽셀을 읽는 코드가 없으면 꺼 두세요.
기본값은 꺼짐인데, 어쩌다 켜 둔 텍스처가 하나씩 섞여 있는 경우가 많습니다.

**Generate Mip Maps.** 멀리 있는 것을 작게 그릴 때 쓰는 축소본입니다.
메모리를 약 33퍼센트 더 씁니다. 3D 에서는 필수지만,
**픽셀 퍼펙트 2D 처럼 확대 축소가 없는 화면이면 끄는 게 맞습니다.**
카메라 줌이 있는 2D 라면 켜는 쪽이 낫습니다. 안 켜면 축소할 때 지글거립니다.

**Max Size.** 원본이 4096인데 화면에서 512로만 쓰인다면 4096을 다 올릴 이유가 없습니다.
여기서 줄이면 원본 파일은 그대로 두고 빌드 결과만 작아집니다.