PNG 를 넣든 PSD 를 넣든 결과는 같다
Esc

    PNG 를 넣든 PSD 를 넣든 결과는 같다

    –Unity최적화텍스처

    “PNG 대신 JPG 로 넣으면 용량이 줄어서 가벼워지지 않나요.”

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

    두 압축은 다른 것이다

    원본 파일 PNG / JPG / PSD 임포트 유니티 임포터 재압축 GPU 포맷 ASTC / BC 메모리 원본이 무엇이든 이 자리를 반드시 지나갑니다 PNG 와 JPG 는 디스크에 파일을 작게 두려고 만든 압축이라, GPU 가 그 상태로는 못 읽습니다. ASTC 와 BC 는 GPU 가 압축된 채로 샘플링할 수 있게 만든 압축입니다.
    원본이 PNG 든 JPG 든 PSD 든, 최종 결과물은 임포트 설정이 정합니다.
    • 이미지 압축 (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을 다 올릴 이유가 없습니다. 여기서 줄이면 원본 파일은 그대로 두고 빌드 결과만 작아집니다.