Skip to content

Instantly share code, notes, and snippets.

@20chan
Last active February 25, 2020 11:40
Show Gist options
  • Save 20chan/da39c27855e4f6155c0663b6c24a82b0 to your computer and use it in GitHub Desktop.
Save 20chan/da39c27855e4f6155c0663b6c24a82b0 to your computer and use it in GitHub Desktop.
개가턴 유니티 씬뷰 느려지는 버그

언젠가부터 유니티 씬뷰를 켜두면 유니키가 너무 느려져서 씬뷰를 끄고 게임뷰만 켜두고 테스트를 돌렸다 이게 너무 불편해서 원인을 찾아보려고 했다

일단 프로파일러로 찍어보면 다음처럼 나왔다

problem

씬뷰 Repaint를 하는데 SceneCamera.Finish 란 놈이 시간을 어마무지하게 잡아먹고있음 상식적으로 생각해도 뭔가 문제가 있다해도 렌더 시간이 길어야 할 것 같은데 렌더 시간은 정상이고 Finish 하는데만 시간이 저렇게? 아무리 잘 검색해봐도 결과가 도저히 나오지 않았고 (하나 있었는데 질문글 하나만 있었음) 그리고 비상식적으로 디스어셈블리한걸 계속 뜯어봐도 딱히 다른게 없었다 특히 저 문제가 되는 SceneCamera.Finish 는 네이티브에서 실행되고, 심지어 네이티브로 프로파일러 샘플을 만드는거 같아서 도저히 콜을 비집고 들어갈 수 없었다 그 전까지는 어떻게든 됐는데 ㅠ

그래서 일단 씬을 다시 그리는게 느린거니까 씬에 문제가 되는 무언가가 있는 거겠지? 어떻게든 그놈만 찾으면 문제가 해결되는 거겠지 해서 게임오브젝트 하나하나를 지워가면서 찾아보려 했는데 결론은 모든 게임오브젝트를 지워도 문제가 재현되었다 정말 말도안되는 상황이었고 대체 왜이러는걸까 여러 생각을 해보았다

매터리얼 인스턴스가 남아서 GC를 잡아먹는걸까? GC 문제일까 여러가지 뒤져보았고 매터리얼 인스턴스도 생성되지 않게 바꿨지만 오브젝트를 지워가면서 테스트를 해보는데 이상하게 같은 상황에서 어떤 경우는 문제가 없었고 어떤 경우는 문제가 일어났다

너무 어이가 없었지만 그래도 수십번의 노가다를 통해 패턴을 찾았다 보통은 씬을 저장하고 다른 씬에 가서 다시 씬으로 돌아오면 문제가 일어남/안일어남의 정도는 보통 일치한다는거 씬에 변경사항을 주고 저장ㅎ하고 다른 씬에 가고 돌아오고를 반복하면 결과가 수렴했다. 그래서 문제가 되는 오브젝트가 뭔지 드디어 찾을 수 있었다.

stations

stationManager가 붙은 stations 요놈이었음 근데 대체 왜?? 물론 수상하긴함 왜냐면 저기 들어있는 stations 들은 이런 모양이고

station prefabs

station

마지막 station 프리팹은 블럭이 28000개나 들어간 괴물이니까 한번 로드하는데도 엄청난 시간이 걸리고 에셋 저장하는데만 시간도 엄청 먹으니까

문제는 두가지다

  1. stations 를 지우고 실행해도 왜 랙이 걸리지? 굳이 다른 씬에 왔다갔다를 반복해야 문제가 해결되는 이유?
  2. 그보다 왜 저 프리팹들을 씬 카메라 렌더링 이후에 사용할 일이 있길래 랙이 걸리지? 심지어 일반 repaint 에서는 문제가 없음

모든 정답은 저 SceneCamera.Finish 라는 블랙박스안에 있겠지 어떻게든 네이티브 코드를 뜯어보려 했지만 실패해서 모르겠지만

암튼 그래서 stations 프리팹들 큰 덩치들을 날리고 작은 station 하나만 넣으니까 더이상 랙이 안걸림 정말왜그럴까

암튼 그렇다면 해결책은 무엇일까?

일단 저 블럭 30000개가 들어간 프리팹을 하나의 프리팹으로 만들지 말고 모듈들을 가지고 런타임에 만드는게 가장 인간적인 방법이겠지 그게 아니면 유니티를 더 갈궈서 왜 그런지 어떻게든 찾고

이거 한다고 9시간을 꼬박 잡고 있었는데 죽고십다 진짜 디스어셈블리에 브레이크포인트 오지게 걸면서 메모리 덤프떠가면서 뭐가 문제인지 찾고 카메라 렌더 뭐가 문제인지 찾으려고 IL코드 따와서 런타임 패치해서 프로파일러 샘플링 인젝셚하려고 삽질도 꽤 했고 결국 다 포기하려 했는데 다시 한번만..한번만 ㅎ하다가 결국 어이없게 자ㅏㅂ았다 호호호 유니티 ㄱ죽어라

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment