그냥 게임개발자

개발일지_013(언리얼엔진)성능최적화 본문

엔진스터디

개발일지_013(언리얼엔진)성능최적화

sudoju 2021. 11. 24. 23:05

■텍스처 스트리밍

앞으로 많은 양의 텍스처를 다룰 때 특히 건축 시각화 프로젝트나 차량 프로젝트에서 텍스처가 좀 흐려지는 상황이 발생할 수있다.

디테일이 제대로 표시되지 않고 있다는 건데 그 이유는 제대로 스트리밍이 되고 있지 않기 때문이다.

일반적으로는 이런 걸 처리할 필요가 없지만 만약에 이런 일이 발생할 때 알아두면 좋은 정보이다.

스트리밍은 기본적으로 텍스처가 얼마나 크거나 작게 보일지 처리한다.

전에 밉맵을 다뤘는데 밉맵은 레벨 오브 디테일(LOD)를 추가하는 효과적인 수단이었다.

밉맵은 텍스처와 정확히 똑같은 버전이지만 그냥 다른 LOD를 살짝 작은걸로 보여주므로, 리소스의 비용이 더 적다.

텍스처 스트리밍은 이처럼 레벨의 오브젝트와 카메라의 거리에 따라 서로 다른 LOD를 스트리밍하는 것을 도와준다.

텍스처 스트리밍에는 풀크기라는 것이 있는데 바로 텍스처 밉맵으로 채울 수 있는 특정 메모리 세트를 말한다.

텍스처가 카메라에서 멀어질 수록 점점 더 작아지다가 차지하는 텍스처 스트림이 풀도 적어지고 결국 메모리를 차지하지 않게 된다.

하지만 오브젝트에 가까이가면 갈수록 텍스처는 이 스트리밍 풀을 점점 더 많이 차지하는데 그 이유는 점점 더 큰 밉맵을 표시하기 때문이다.

이 얘기를 하는 이유는 나중에 작업할 때 텍스처 스트리밍 풀이 부족하다는 경고를 볼 수 있기 때문이다.

풀 크기를 키우려면 `(~)<- 이 키를 눌러서 숫자 1 옆에 있다.

언리얼엔진 콘솔을 연다음 콘솔에 "r.Streming.PoolSize"를 입력한 후 원하는 스트리밍 풀의 크기를 메가바이트 단위로 입력한다.

100메가바이트나 5000메가바이트 등으로 설정할 수 있다.

사이즈 세팅은 전적으로 자신의 프로젝트와 프로젝트에 필요한 만큼 달렸다.

만약 풀사이즈를 기본적으로 설정하고 싶다면 DefaultEngine.ini 파일에서 설정해주면 된다.

그러면 매번 언리얼 엔진을 킬 때마다 수정한 스트리밍 풀 크기가 적용이 된다.

이걸 보고 오 미리 바꿔야겠네? 라고 생각할 수도 있지만 풀 사이즈 경고는 보기 힘들수도 있다.

혹시나 만약에 경고를 봤을 때 대처법이란 거다.

 

■ 텍스처 스트리밍 안함 

이것은 가장 높은 해상도 버전의 텍스처가 표시되도록 만드는 것이다.

하지만 프로젝트의 모든 텍스처를 가장 높은 해상도로 설정하면 안된다.

그랬다가는 성능에 엄청난 여향을 준다.

보통 스트리밍 안함 옵션은 UI 엘리먼트나 유저가 정말 가까이 있을 때 텍스트를 표시하느 등 유저에게 아주 가깝게 뭔가를 표시하는 텍스처에 활성화한다.

 

이것을 설정하는 방법은

텍스처 에디터에 LOD 패널에 있다.

하지만 명심할 것은 이것을 체크하는 순간 높은 해상도에 텍스처를 렌더링하지만 성능에 영향이 간다는 것을 명심해라.

 

LOD와 스태틱메시 병합에 대해 알아보자.

 

■ 언리얼엔진의 자동 LOD 생성 툴

우리는 스태틱메시를 임포트해서 LOD를 다루는 것을 해보았다.

하지만 그런 상황이 되지 않을 때 언리얼엔진에서 활용할 수 있는 자동 LOD 생성툴을 사용할 수 있다.

LOD는 여러가지 그룹이 있는데 이 그룹을 아무거나 선택하면 BaseEngine.ini 확인해 얼마나 많은 LOD 레벨이 적용되는지 알아낸다.

또한 메시 디테일 패널에 있는 다양한 세팅들도 확인하게 된다.

LOD 세팅은 여러가지 조정할 수 있다.

LOD 개수를 설정할 수 있고 자동으로 LOD가 큰 LargePop이라고 설정해놓으면 큰 LOD에 맞게 설정해주는데 자세한 세팅은 언리얼 엔진 문서에도 나와있으니 확인해보자.

또한 화면의 크기가 0.769일 때 LOD1로 변경되고 크기가 0.385일 때는 LOD2로 자동으로 변경해준다.

보면 트라이앵글도 자동으로 감소설정을 해준다.

원래는 63844개의 트라이앵글수인데 화면크기가 0.769일 때 트라이앵글 수는 31,922로 바뀌게 된다.

또한 퍼센트 트라이앵글은 75% 25% 12%로 설정하는 것이 좋다.

조금멀리있을 때는 75% 멀리있을 때는 25% 완전 멀리있을 때는 12%정도 트라이앵글수가 감소된다.

하지만 그냥 그룹으로 설정해주면 자동으로 계산이된다.

 

또한 화면 거리에 맞게 자기가 자동으로 LOD를 세팅할 수 있으며 그걸 하기 위해서는

LOD 거리 자동계산을 끄면 된다.

자동으로 설정되는데 왜 굳이? 라고 생각할 수도 있지만 자동으로 거리가 계산이 되었는데 우리가 원하는 거리가 아닐 수도 있고 또한 최하 LOD는 아주 멀리가야 테스트를 확인할 수 있기 때문에 자기가 조정하는 것도 나쁘지 않은 방법이다.

또한 메시 디테일 패널에 항상 이 LOD로 보여준다는 Forced Lod Model과 Override Min LOD를 체크하여 숫자를 조정해주면 예를 들어 Forced Lod Model을 3 Min LOD를 2로 한다면 2~3까지밖에 LOD를 볼 수밖에 없다.

이것은 나중에 유용할 것 같다.

 

■ 액터 병합 툴

이 툴을 사용하려면 우선 전체 레벨을 취해 자신이 사용할 DCC에 FBX로 익스포트 한 다음 다양한 텍스처를 모두 찾아내 텍스처를 재생성하고 오브젝트에 재할당해야 한다.

그런 다음 DCC에서 자신이 원하는 오브젝트를 모두 선택해 하나의 스태틱 메시로 병합한 후 UV를 갖고 창의력을 발휘해 UV를 그리거나 병합하고 UV와 텍스처를 옮겨서 이처럼 모든 것을 표현할 수 있다.

예를 들어 아틀라스를 만들면서도 텍스처의 퀄리티와 밀도 그 외 다른 특성을 유지할 수 있다.

이건 엄청난 노력이 들어가며 특히 대형 레벨이라면 더더욱 그렇다.

 

방금 설명한 워크플로는 언리얼엔지에서 병합 툴을 사용해 모두 실행할 수 있다.

언리얼 엔진에서 액터 병합 툴을 사용해보자.

워우... 이게 예제 맵인데.. 너무 이쁘다.. 엄청 잘 만들었다...

나도 만들 수 있겠지 언젠간... 아무튼

기본적으로 이 레벨에는 액터가 65개나 들어있다.

스태틱메시만으로는 59개다.

그럼 우리는 이 액터를 다 선택한 후 창 > 개발 툴 > 액터 병합을 누른다.

액터 병합의 세팅을 보면 먼저 Mesh Setting에 0에 피벗 포인트부터 설명하자면 이 모든 메시의 피벗 포인트를 취해 월드에 0, 0, 0에 두어서 이렇게 만든 메시를 콘텐츠 브라우저에서 월드로 드래그 할 때 그 트랜스폼을 0, 0, 0으로 맞춰주기만 하면 원래 메시가 있었던 정확한 자리를 잡는다.

뭔 말인지 모르지만 일단 해보자.

또한 이거의 단점은 액터 병합한 이 메시를 움직일 때 평소보다 더 많이 움직인다는 거다.

피직스 데이터 병합은 모든 피직스 데이터를 하나로 병합합니다.

버텍스 데이터 메시로 굽기는 새 메시에서는 버텍스 컬러와 같은 버텍스 데이터도 구울 수 있다.

버텍스 페인팅 등의 작업을 했을 때 그 정보를 감소시킨다.

강의 설명이 매우 이해하기는 어렵지만 사용해보면 알지 않을까?

LOD 선택 유형은 매우 중요하다.

Use all LOD levels는 새로운 머티리얼의 생성 방식을 선택이나 조정할 수 없게 한다.

그저 현재 상황을 다 취한 다음 하나의 거대한 메시를 만들고 그 LOD를 모두 사용한다.

우리가 원하는 유형은 Use specific LOD level이다.

그 중에서도 기본 레벨인 LOD0를 사용해보자.

이 이유는 LOD2나 LOD3, 4를 사용해도 되지만 그게 생성이 되어있는지 모른다.

또한 새로 병합된 메시가 그 LOD 레벨을 쓸 만큼 괜찮아 보일지도 확신할 수 없기 때문이다.

그러니 특정 LOD를 0으로 설정하는게 우리한테는 최선이다.

 

또한 머티리얼 병합을 우리가 사용할 건데 아까전에 Use all LOD levels는 머티리얼 생성 방식을 선택할 수 없다고 했다.

그러기에 우리는 Use specific LOD level를 사용하는 이유이기도 하다.

이걸 사용하는 이유는 모든 유형의 셰이딩 모델을 활성화 할 수 있다는 점이다.

여러가지 설명은 마우스를 갖다대면 설명이 나오니까 따로 확인 바란다.

하지만 랜드스케이프 컬링 사용은 랜드스케이프에 액터를 배치하고 나서 최적화하기에 좋은 세팅이기에 스샷을 찍어봤다.

애셋을 Ctrl+C 해서 메모장에 Ctrl+V해놓으면 메시에대한 정보가 나온다.

이것을 하는 이유는 나중에 액터병합을 나중에 잘못했다고 치자.

그러면 이 메모장에 있는 것을 Ctrl+C해서 레벨에 붙여놓으면 그대로 붙여넣기가 된다.

미리 방지하는 거다.

 

아무튼 우리는 이 액터병합을 텍스처 크기를 256 * 256으로 설정해놓고 노멀맵과 메탈릭, 러프니스를 체크하고 액터병합을 실행해보자.

해상도가 현저히 낮은 것을 보여준다.

이 예전에 텍스처는 1024 * 1024였다.

그러니 낮아보일수 밖에... 하지만 이것을 좀 먼거리에서 장식을 하고싶다면? 하나의 메시 하나의 텍스처면? 성능이 굉장히 좋지 않을까?

이렇게 하면 어떨까?

앞에 있는 것은 59개의 액터가 따로따로 뭉쳐져있고 텍스처는 1024 * 1024이다.

하지만 이 뒤에있는 성은 256 * 256에 텍스처는 하나에 메시도 하나이다.

무슨 말 하는지 알거다.

맵 디자인을 할 때 매우 유용하다는 것!


■ 계층형 LOD 시스템(HLOD; Hierarchical Level of Detail Tool)

액터 병합 툴은 새로운 메시를 만들기는 하지만 해상도를 낮추니 망가져보였다.

하지만 계층형 시스템은 새로운 메시를 만들 수도 있고 망가져보이지 않게 하는 방법이다.

오른쪽이 왼쪽에 널러진 객체들을 하나의 메시로 병합한 모습이다.

이것은 액터 병합 툴과 무엇이 다를까?

일단 이것을 하기전에 월드 세팅에서 계층형 LOD 시스템이 체크가 되어있는지 확인해야 한다.

월드세팅이 없다면 창 > 월드세팅을 누르면 된다.

이제 창 > 계층형 LOD 아웃라이너를 누른다.

그 다음 클러스터 생성을 누른다.

이 것을 하는 이유는 전체를 분석한 다음 HLOD 시스템이 시스템 전반을 걸쳐 볼륨을 상당히 낮춰준다.

그러면 그 볼륨에 포함된 모든 액터는 새로 생성된 메시 새LOD메시를 얻어서 이걸 멀리서 사용할 수 있게 한다.

뭔가를 최대 3~40개의 메시로 만들어 낸 다음 일정 거리만큼 떨어지면 HLOD가 그 3~40개의 메시를 그룹으로 묶은 다음 2~3개의 메시로 바꾸면서도 여전히 완전히 동일한 디테일 레벨을 보여주고 메시 수는 2~3개로 변하고 머티리얼도 마찬가지로 2~3개로 변하고 텍스처도 2~3개로 변한다.

이런 방법을 통해 렌더링 비용이 비싼 오브젝트가 카메라로부터 대략 100미터쯤 떨어졌을 때 똑같은 오브젝트를 훨씬 절감된 비용으로 렌더링이 가능하다.

묶는것은 클러스터로 보면된다.

보시는 것과 같이 LODActor_0는 이런 메시들을 묶고있다.

경계가 나뉘어 졌다면 프록시 메시 생성 버튼을 누른다.

그러면 클러스터로 묶은 액터들을 기본적으로 액터 병합이 했던 일을 한다.

메시를 수동으로 일일이 대체해 주는 것부터 그 외에도 꽤 많은 일들을 이 툴이 대신 맡아서 해준다.

프록시 메시 생성이 끝났는데 무엇이 달라졌나? 내가 이 잔해를 선택하면 잔해가 선택이 된다.

근데 만약 멀리서 선택하면?

이미지가 설명해준다.

커다란 단일 메시가 생겼다.

이제 이해가 간 것 같다.

클러스터로 그룹이 묶인 액터들은 어느 일정 거리에서는 단일메시 2~3개 텍스처 2~3개 머티리얼 2~3개로 병합이 된다.

 

다음은 라이팅, 섀도잉, 포스트프로세스에 대해 배워보자.