본문 바로가기

개발 (Game)/Unity (General)10

[URP] Built-in Render Pipeline vs SRP ■ Built-in Render Pipeline (Legacy) 고사양 PC부터 저사양 모바일까지 원하는 만큼 다양한 플랫폼에 효율적으로 배포하기 위한 솔루션으로 개발되었음. 그래픽스 기능 조합을 지원하고 포워드 및 디퍼드 파이프라인과 함께 사용하기도 편리함. 하지만 지원 가능 플랫폼의 숫자가 늘어나면서 빌트인 렌더 파이프라인의 약점이 아래와 같이 점차 파악되어짐.기존 렌더 파이프라인의 단점1. 다량의 코드가 C++로 작성되어 있기 때문에 개발자의 수정 및 파악이 어려움2. Render Flow와 Render Pass가 미리 구성되어 있음3. 렌더링 알고리즘이 하드 코딩 되어있음4. 커스터마이징에 제약이 없어 모든 플랫폼에서 우수한 성능을 구현하기 어려움5. 렌더링 코드에 콜백이 노출되어 파이프라인에서 .. 2025. 4. 9.
[Unity] 사운드 출력기기 전환에 따른 이슈. ■ 이슈1. 게임에서 세팅한 AudioMixer의 Sound 옵션 값들이 리셋 된다.2. 배경 음악이 정지된다.■ 원인Unity 자체에서 사운드 출력기기 전환 시 Audio Engine을 re-init하고 있다. 이로 인하여 Audio Settings가 바뀌게 되므로 모든 Audio State의 추적이 끊기게 되어 Audio Mixer 등 오디오 관련 데이터들이 간접적으로 영향을 받을 수 있다. 구체적인 상황을 예로 들자면 안드로이드의 기본 스피커를 사용하고 있다가, 블루투스를 연동할 경우 재현이 가능하다.■ 해결1. Audio Settings의 Sampling Rate 복구 없이 Mixer의 볼륨 값만 다시 로드하니 해결되었음.2. 추후 이슈 재현 시 모든 세팅 값[AudioSettings 클래스] 값.. 2025. 2. 1.
[Unity] TMP폰트 관련 메모리 최적화 회사 프로젝트에서 다국어 작업 중 메모리 최적화를 진행한 적이 있었다.플레이 후 게임 옵션창에서 모든 언어를 한 번씩 설정을 해놓으면 폰트 관련 개체 및 아틀라스 텍스처 등이 425.4MB의 메모리를 차지하고 있었다. 여러 RnD 끝에 동일 환경에서 9.4MB까지 최적화에 성공했다.■ 기존  · Total: 425.4MB· Native Memory: 213.3 MB· GPU Memory: 212.0 MB· Managed: 108.5 KB 언어 변경 시 TMP 개체의 하위 개체로 Submesh UI개체가 생성된다. 이는 새로운 언어를 세팅한 뒤 렌더링 중인 문자가 기본 폰트에 포함되어 있지 않은 상황이라서 Fallback Font Asset들을 탐색하여 원하는 문자를 내포하고 있는 폰트 에셋의 Atlas .. 2025. 2. 1.
[Unity] 메모리 최적화를 위한 에셋 관리 [영상]https://www.youtube.com/watch?v=52ehLUfk3DQ&list=PL7g8Lh8G4gEfPhXO06haByx6KNzCrEoXR&index=10 [정리] [1. 오디오] - 모바일 같은 경우 Force To Mono를 활성화하는 것을 권장. 왼쪽 오른쪽 구분해서 사운드를 듣는 경우는 별로 없으니 - Decompress On Load는 말 그대로 메모리이 올려놓는거니 권장하지 않음. 짧은 사운드( - Compression Format은 엄청 짧으면 ADCPM을 그 외 웬만하면 Vorbis 권장. IOS는 MP3를 하드웨어 레벨에서 디코딩하는데 유니티 자체에서는 하드웨어 레벨에서 디코딩 하지않기 때문에 IOS의 이점을 이용할 수 없음. - Mute인 상태에서도 메모리에 올라가있음.. 2024. 9. 29.
[Unity] UGUI 성능 최적화 [영상]https://www.youtube.com/watch?v=1e2mSCS7o1A&lc=UgwtRZ7Kxx1CZQRd9lV4AaABAg [공부를 위해 정리한 것 기록]1. 캔버스 하나에 여러 UI를 한 번에 묶는 것보다, 자식 캔버스(Nested Canvas)를 두는 것을 권장. 이유는, 부모 Canvas에 수정 사항이 발생하지 않는 이상, 자식 Canvas의 UI가 Dirty 될 때 해당 Canvas만 갱신시킨다. 만약 한 캔버스 안에 모두 담아둔다면 자식 중 하나만 변경되어도 모든 자식들을 갱신하는 비용이 있다. 그렇다고 모든 자식들이 캔버스를 갖고있는 것은 비추천. 무거울수 있기 때문. UI 최적화는 케바케가 심하므로 완벽한 정답이 없으니 상황에 맞게 사용하길 권장 (etc: 동적인 객체, 정적.. 2024. 9. 17.
[Android] R8, Proguard 난독화 [개념] ProGuard는 Java 및 Android 앱의 코드를 난독화(obfuscate)하고 최적화하는 도구이다. 앱의 크기를 줄이고 실행 속도를 향상시켜주며 동시에 리버스 엔지니어링을 어렵게 만들어 소스코드를 보호해준다. Unity의 빌드 타겟 플랫폼이 안드로이드일 경우 유니티 내부적으로 안드로이드 프로젝트를 생성하고 빌드하기 때문에 Proguard 사용이 가능하다. 참고로, Unity에서는 이제 ProGuard 대신 R8이라는 새로운 코드 난독화 및 최적화 도구를 사용하는 것이 권장된다. R8은 ProGuard와 호환되며 보다 향상된 성능 및 최적화 기능을 제공해준다. R8은 Google에서 개발되었으며 proguard와 호환되지만 보다 더 높은 성능의 난독화, 축소, 최적화를 지원해준다.사용되지.. 2023. 3. 25.
[Shader] 쉐이더를 처음으로 직접 작성해보다. [2021. 09. 01, Wed] 쉐이더를 공부 한지 하루 이틀 밖에 안되었다. 내 스스로 코드를 작성하는 것은 당연히 불가능한 것이기에 참고용으로 동영상을 보면서 공부했다. 참고 : https://www.youtube.com/watch?v=tRYxflC-HCc&list=TLPQMDEwOTIwMjG6Wd5TU0jTYw&index=2 강의에서 나오는 내용들을 적어 옮겨놨다. 생각이 안날때마다 다시 이걸 보면서 공부해야겠다. 불편했던점은 아마 쉐이더는 아마 C++이 변형된 상태 로 작성되나보다 좌측 상단에 보여지는 마크도 ++를 뜻하기도하고 일단 동영상처럼 자동 완성이 안된다 색깔도 구분이 안되어있고.. 아마 내가 비쥬얼 스튜디오에서 직접 설정을 바꿔야할 것 같은데 나중에 찾아보고 해결 해봐야겠다. 혹시라.. 2021. 9. 1.
[Shader] Rendering Pipeline - 래스터라이저 & 프래그먼트 쉐이더 [2021. 09. 01, Wed] ■ 래스터라이저 : 버텍스 셰이더로부터 전달 받은 정점들에 삼각형을 구상하고 채워줘서 '프래그먼트 셰이더'로 전달하는 단계이다. * 프래그먼트 : 픽셀 후보 (두 개의 물체가 앞 뒤로 배치 되어있어 하나의 물체가 다른 물체를 가리게 된다면 최종 픽셀로서 사용되지 않을 수 있음) ▼ 영상 2:31초 참고 https://www.youtube.com/watch?v=RcRjIMTekgc 하는 일 1. 뷰포트 변환 : 클립공간(NDC) -> 스크린 공간 - 정규화된 공간에서 스크린(윈도우 화면)에 맞춘 공간으로 변형해준다. ( x,y축은 스크린 비율((예)1920X1080)에 맞게 크게 변환되지만 z값(깊이)은 0~1사이를 유지한다.) ( z값은 누가 앞에 그려지고 누가 뒤에 .. 2021. 9. 1.
[Shader] Rendering PipeLine - 버텍스 셰이더 [2021. 09. 01, Wed] ■ 버텍스 셰이더 - 정점을 입력받아 다른 형태의 정점으로 변환해주는 단계이다. - 주요 역할 : 3D 공간 상의 정점의 위치를 절대적인 월드의 위치에서 카메라 화면을 통해 바라보았을 때의 기준의 위치(즉, 클립 공간)로 옮겨주는 것이다. (이는 정점을 어떠한 공간에서 다른 공간으로 '투영' 해준다는 얘기이다) 쉽게 예를 들면 '그림자 연극'을 떠올리면 된다 -> 3D 사물들이 빛에 의한 투영으로 하나의 2D 스크린 공간에 그림자가 모이게 되는 것. - 정점을 위치로 옮기기 위해서 '변환 행렬'을 사용한다. * 변환 행렬의 구조 [오브젝트 공간] -모델 행렬-> [월드 공간] -뷰 행렬-> [카메라 공간] -투영 행렬-> [클립 공간] 모델 행렬 : 모델 공간에 위치한.. 2021. 9. 1.