Unity/최적화 맨텀 2023. 11. 12. 23:04
어느 프로젝트건 함수 내부에서 연산을 위해 함수 내부에서 리스트 컨테이너를 선언하고 조작하는 일은 빈번하다. 특히나 렌더링 쪽에서는 자주 사용되기 때문에 이미 내부적으로는 연산 컨테이너로서 리스트 풀을 사용하고 있다고 한다. 때문에 크기가 큰 컨테이너를 지역변수로 자주 사용하는 경우 멤버 변수로 컨테이너를 선언해 놓고서 사용하라고 권장한다. 하지만 멤버변수가 특성상 상황에 따라 메모리에 계속 물고있게 되는 경우도 있으며 보통 멤버변수는 상단에 위치하기 때문에 가독성 측면에서도 좋지 않다. 그래서 정적 리스트를 오브젝트 풀링 하듯 풀링 하는 방식이 리스트 풀이다. 일부 Astar Pathfinding Project 같은 에셋들을 뜯어보면 자체적으로 리스트 풀을 만들기도 했는데 이번에 유니티 2021부터 공..
Unity/최적화 맨텀 2021. 12. 16. 20:49
유니티의 URP 프로젝트에서는 포스트프로세스 텍스쳐가 빌드에 강제 포함된다. 512x512 사이즈의 텍스쳐 10장이기 때문에 2.5MB나 된다. 모바일에서는 포스트 프로세스를 사용하지 않는다면 놔두기 꽤 부담스러운 사이즈. 해결법은 간단하다. 1. URP의 forwardRendereData 스크립터블오브젝트에서 PostProcessData를 설정하는 부분이 있는데, Create - Rendering - Universal Render Pipeline - PostProcessData 에셋을 생성하고, 새로 만든 에셋을 지정한다. 2. 새로 만들어진 PostProcessData를 인스펙터를 Debug 모드로 보면 FilmGrainTexture를 지정할 수 있다. 굉장히 낮은 해상도의 16x16 텍스쳐를 10곳..
Unity/최적화 맨텀 2021. 10. 16. 21:34
https://www.youtube.com/watch?v=1mJtoceqvro 읽고, 애매하게 알고있던 부분이나 놓치기 쉬운 부분 메모. 1. string 파싱에서 발생하는 가비지 30분 10초 기획데이터 JSON이나 XML로 두고서 데이터 파싱하는 경우가 많을 텐데, 이런 string 파싱에서 가비지가 발생하는 경우가 많아서 빌드 전에 에디터에서 ScriptableObject로 데이터를 캐싱해놓고 사용하는 것을 추천한다. (프리 빌드 프로세서로 자동화하면 실수할 일은 없을 것 같다.) 2. 애니메이터 등의 파라미터를 string으로 호출할 때의 가비지 31분 00초 animator.SetBool("Jump", true); 매번 string으로 호출하면 가비지 발생우려. ID로 캐싱해서 호출하는 것을 추..
Unity/최적화 맨텀 2021. 7. 25. 21:39
스프라이트 아틀라스를 사용할 때 실수하기 쉬운 세팅 두 번째. 원본 스프라이트의 압축과 아틀라스의 압축은 이중으로 적용된다. 비교를 위해 두 개의 텍스쳐압축을 준비하자 왼쪽은 ASTC 6x6 (116KB) 오른쪽은 ETC2 Crunched 0% (27.2KB)로 오른쪽은 심하게 뭉개진 것을 확인할 수 있다. 패킹해보자 이 두 개의 스프라이트를 다시 ETC2 형식의 아틀라스로 패킹해보자. 아래 그림과 같이 원본 텍스쳐의 뭉개짐이 그대로 전달되었다. 용량 자체는 ETC2의 용량이 그대로기때문에 원본 텍스쳐를 압축한 것은 용량적 이득이 전혀 없다. 이런현상은 iOS에서 기본 텍스쳐 형식인 PVRTC를 사용할 때 두드러지는데, 원래 PVRTC 자체도 심하게 뭉개지는 형식인데 이중으로 압축을 하다보니 심각하게 뭉..
Unity/최적화 맨텀 2021. 7. 25. 21:31
스프라이트 아틀라스 스프라이트 아틀라스는 스프라이트들을 하나의 스프라이트로 모아서 POT 텍스쳐로 만들어주는 유니티의 기능이다. 정상적으로 사용했다면 아틀라스에 포함된 스프라이트는 메쉬정보만 가지고 빌드에 포함되어 원본 텍스쳐 + 아틀라스 메모리가 중복되지 않는다. 빌드 리포트에서 본 스프라이트의 용량. 원본 스프라이트의 용량은 138KB ~ 4MB까지 다양하지만 모두 12.8KB로 통일되었다. 리소스 폴더에 포함된다면? 리소스 폴더의 제 1규칙. 리소스 폴더 하위에 위치한 파일들은 사용되지않더라도 빌드에 반드시 포함된다. 이는 아틀라스를 사용하면서 가장 하기 쉬운 실수일 것이다. 테스트를 위해 아래와 같이 리소스폴더에 원본스프라이트와 아틀라스를 둘 다 옮겨봤다. 빌드 후에는 원본 텍스쳐의 용량이 중복해..
Unity/최적화 맨텀 2021. 7. 25. 21:00
아틀라스에 포함된 스프라이트는 빌드 용량에 포함되면 안된다. 또한 아틀라스도 별도로 압축이 있기때문에 아틀라스에 들어가는 이미지는 압축을 None 으로 설정해놔야 이중손실이 되지않는다. https://forum.unity.com/threads/sprite-atlas-adding-on-build-size.608143/ 그런데 직접참조하는경우에 포함될거같은느낌; SpriteAtlas.GetSprites를 사용해야함. 그럼 UI는? 애초에 리소스 폴더에있으면 빌드포함되서 아틀라스랑 이중일텐데? 크런치는 GPU에서는 안한거랑 똑같다. 품질이 저하되고 텍스처는 여전히 동일한 양의 VRAM을 사용하므로 빌드 크기만 영향을 받습니다. 크런치 압축은 텍스처가 가능한 가장 적은 양의 디스크 공간을 사용하도록 돕지만 런타..