유니티로 게임을 개발하며 텍스쳐 압축 방식을 별로 중요하게 생각하지 않았고
쓸데 없이 더럽게 많다고 생각해 왔었다.
하지만 아이폰 사파리의 거지같은 메모리 제한 (380MB 정도 되는듯?) 속에서 WebGL 게임을 개발해야하는 상황에 놓이고,
어떻게든 텍스쳐들이 메모리를 차지하는 용량을 줄이려는 공부 끝에 그 진실을 이제야 알게 되었다.
(챗 GPT 구라핑 주의)
챗GPT의 구라핑을 적당히 필터링 해가며 물어본 결과.
압축 포맷과 손실 압축률 두 가지로 구분해서 이해하면 된다는 것을 깨달음!
기본적으로 컴퓨터에 1024x1024 해상도를 비압축으로 그대로 메모리에 올리면 무려 4MB라는 메모리를 차지하게 된다.
[1. 압축 포맷]
비압축, DXT5, ETC, ASTC 등...
완전히 로드되어서 메모리에 올릴 때 그 용량에 영향을 준다.
위의 예시 정리대로 같은 1024x1024인데 제법 다르다.
게임을 실행하는 해당 머신 GPU가 압축 포맷 방식을 지원해야만 쓸 수 있음.
[iOS 사파리 15버전 이상에서 WebGl 2.0 지원으로 ASTC 사용 가능] 뭐 이런 스펙들이 있음.
예를 들어 DXT5 1024x1024는 메모리 프로파일러로 찍어보면
메모리 용량 1MB + 텍스쳐 파일 용량 101KB로 총 1.1MB의 메모리를 차지했다.
반면 ASTC 6x6 Block은 (0~100% 퀄리티 조절은 왠지 효과가 없었다.)
메모리 용량 457KB + 텍스쳐 파일 용량 457KB로 0.9MB 메모리를 차지했다.
그리고 ASTC 12x12 Block은
메모리 용량 115KB + 텍스쳐 파일 용량 116KB로 231KB 메모리였다.
용량 종류가 2개인건 하나는 메모리 하나는 GPU 메모리 인듯? (잘 모름)
[2. 손실 압축률]
빌드 용량을 줄이기 위해서 동일 해상도 + 동일 포맷 내에서 퀄리티를 저하시키는 방법
WebGL 빌드 같은 경우 매번 클라이언트를 새로 전송하기에 이것도 손보면 좋긴하지만
아무튼 jpg 깍두기 같은 것들이 더욱 생겨난다.
조상님들은 메모리를 아끼기 위해 똥꼬쇼를 열심히 해왔고
지금도 하고 계시다.