유니티 포톤 최적화 #1

1. 피직스 최적화

엔티티에 피직스를 넣으면 소환될 때 모든 피직스를 한번은 계산하려는 경향이 있는 것으로 보입니다. 분명 주변에 아무 피직스도 없는 엔티티임에도 불구하고 랙이 걸립니다. 왜지


2. 메모리 할당 최적화

프로파일링을 해보면 생각보다 메모리할당 부분에서 시간을 차지하는 것을 확인할 수 있습니다. 대표적으로 Dictionary, List, unsafe 등인데 Dictionary에서 enum을 사용하면 무조건 GC.Alloc이 발생해 시간을 잡아먹습니다. 확인결과 Enum은 무조건 Boxing을 해서 compare을 한다고 합니다. 결국 IEqualityComparer를 만들어서 Boxing 하지 않게 만들었습니다. List 역시 생성 해제 시 GC.Alloc을 하는 것으로 판단했습니다. 찾아보니 유니티 내부에 ListPool 클래스가 존재하여 Pooling 할 수 있음을 확인했습니다. 해당 클래스로 메모리 할당 회피했습니다.

3. 그냥 오래 걸리는 작업

가끔 그냥 오래 걸리는 작업이 있습니다. 계산할 게 많고 여러 이유에서 시간이 좀 걸리는 작업. 데이터 로딩하는 것들은 미리 Caching 하고 하면 되는데, 모든 엔티티마다 동일하게 수행해야 하는 작업은 엔티티가 많아지면 오래 걸릴 수밖에 없습니다.

그런 것들은 포톤에서 Threaded 하게 사용할 수 있는 system을 제공하더군요. 이거 사용하면 엔티티를 Slice 시켜서 쓸 수 있게 해주는 기능입니다.

다만 이런 것들은 컴포넌트를 추가하거나 삭제할 수 없고 값만 변경할 수 있고, 이벤트, 시그널을 생성시킬 수 없기 때문에 해당 것들은 메인 스레드 시스템을 따로 만들어서 거기서 처리해 줘야 합니다. 물론 이것만으로 성능 향상이 좋더라구요.

다만 포톤에서 권장하는 엔티티를 슬라이스 해서 4틱마다 한번 업데이트 하는 방법은, 움직임이나 이런 거에는 좋지 않고 정보 갱신이나 이런 쪽에 좋은 것 같습니다.

4. 생성시 랙

사실 이거는 어쩔 수 없는 부분인 것 같습니다.

포톤에서 풀링을 지원 안 해서 처리하기가 되게 애매하더군요. 그래도 그래픽적인 요소랑 데이터를 최대한 분리해서 그래픽적인 요소를 풀링하면 그나마 랙이 줄어들었습니다.

5. 뇌피셜

이건 개인적인 뇌핏결인데, unsafe를 사용하여 포톤에서 Component를 받아오면 메모리 할당을 하는 것으로 생각이 되더라구요. 불가피한 경우를 제외하고 unsafe 사용 지양해야겠습니다.

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *