Search Unity

최근 유니티는 2021년 Unity 로드맵을 발표했습니다. 이후 로드맵 목표 달성을 위해 작업 중인 유니티 팀의 일부를 차례로 소개하고자 합니다. 새 블로그 시리즈 중 두 번째 게시물인 이번 포스팅에서는 성능 최적화 팀에 대해 살펴봅니다.

Unity 2021 로드맵에서 유니티의 2021년 개발 우선 순위를 확인할 수 있습니다. 정식으로 제작에 사용 가능한 기능을 업데이트하고, Unity에 필요한 새로운 주요 기능을 제공하는 데 집중할 예정입니다. 동시에, 에디터로 작업할 때의 워크플로를 개선하고 전반적인 편의성을 높여 궁극적으로 삶의 질이 향상되는 결과를 도모하고자 합니다.

이 포스팅 시리즈에서는 Unity 기능 개발과 개선에 힘쓰고 있는 다양한 팀을 소개합니다. 여러 이니셔티브를 달성해 나가는 다양한 팀을 만나보고, 각 팀의 동기와 성과를 확인해볼 수 있습니다. 이번 포스팅에서는 성능 최적화 팀 리드인 린든 홈우드와 시니어 소프트웨어 엔지니어 리처드 케틀웰을 만나 팀이 주력하는 부분을 알아보고 내년 계획에 대해서도 살펴보도록 하겠습니다.

성능의 의미: 속도 그 이상

성능은 런타임 시의 실행 속도만을 의미하지 않습니다. 성능이 뛰어난 제품은 빠른 로드 속도와 낮은 기기 전력 소비를 보장하고, 에디터로 작업 시 신속한 반복 작업 속도를 제공해야 합니다. 또한 성능이 좋지 않으면 느린 프레임 때문에 시각 효과가 불안정해져 사용자가 몰입형 환경에 집중하는 것을 방해할 수 있으며, 과도한 CPU 활동으로 인해 모바일 디바이스의 배터리가 순식간에 닳게 됩니다. 개발 시 성능이 보장되지 않으면 창의성에 제약을 받기 때문에 결과물도 영향을 받게 됩니다. 또한 원활한 작업을 방해하여 집중도가 떨어지며 생산성에 악영향을 미치게 됩니다.

약 2년 전, 유니티는 성능 자체를 하나의 독립적인 기능으로 여기고 이를 개선하는 데 주력하기 위해 최적화 전담 팀을 구성했습니다. 빠르게 성장하는 성능 최적화 팀을 이끌고 있는 린든을 만나 팀의 역할에 대해 자세히 알아보았습니다.

성능 최적화 전문가

성능 최적화 팀의 임무는 간단합니다. 크리에이터를 위한 Unity 에디터 워크플로의 성능을 개선하고 다양한 Unity 플랫폼 전반에서 엔진 시스템을 최적화하는 것입니다. 이는 사용자에게 가장 효율적인 워크플로를 제공하고 제작 과정에서 사용하는 여러 기능의 성능을 최대한 높이겠다는 유니티의 2021년  약속과 상통합니다.

린든은 다음과 같이 말합니다. “Unity 사용자에게 성능은 항상 중요한 문제입니다. 하루하루의 Unity 개발 경험과 연관되어 있기 때문에 그 자체로 하나의 기능으로 취급되어야 한다고 생각합니다.” 이러한 생각은 마침내 최적화 전담 팀이 만들어지는 결실로 이어졌습니다.

유니티 내부의 성능 전문가들로 구성된 성능 최적화 팀은 R&D 분야에서 폭넓게 협업하며 유니티 전반에서 프로파일링과 최적화에 대한 인식을 높이고, 정보를 제공하며, 베스트 프랙티스를 공유합니다. 성능 최적화 팀은 최적화에 꼭 필요한 툴을 보유한 프로파일링 팀과도 긴밀하게 협력합니다. 또 다른 핵심 파트너는 본 블로그 포스팅 시리즈 중 첫 번째 게시물에서 소개한 QoL 팀입니다. QoL 팀은 크리에이터의 워크플로를 개선하는 데 힘쓰며, 여기에는 자연스럽게 성능에 대한 고려도 포함됩니다.

성능 최적화 팀은 대부분 게임 시스템이나 게임 엔진 개발에 수년간의 경험이 있는 시니어 엔지니어들로 구성되며, 린든 역시 유니티에서 근무한 지 3년이 되었습니다. 린든은 사내 기술 전문가로도 10년간 일한 경험이 있습니다.

게임을 제작할 때 부딪히는 문제와 이를 해결하는 기술을 이해하는 것이 중요합니다. 팀원들은 성능 문제를 개선하기 위해 최선을 다하며, 성능을 향상하기 위해 코드베이스에서 하드웨어에 최대한 가까이 접근합니다. 성능 최적화 팀은 다른 유니티 엔지니어와의 협업을 통해 기존 시스템을 학습하고 분석하며 하드웨어를 더 효율적으로 사용하도록 시스템을 가장 효과적으로 업데이트할 방법을 파악합니다.

팀이 최적화 문제를 발견하는 경로는 다양합니다. 소규모 팀이기에 모든 것을 모니터링할 수는 없지만, 포럼이나 소셜 채널을 지속적으로 확인하며 커뮤니티와 제품 팀에서 최적화 문제를 알려주기도 합니다. 그중 대부분의 사용자에게 가장 큰 영향을 미치는 문제부터 우선적으로 다루게 됩니다.

성능 최적화 팀 – 위: 킴, 린든, 리처드. 중간: 스타인, 존, 알렉스. 아래: 아망딘, 비키.

개발 초기 단계에서 성능 최적화

게임 개발을 처음 시작하는 개발자에게 자주 드리는 조언 하나는 개발 과정 전반에서 프로파일링을 자주, 그리고 발빠르게 진행하라는 것입니다. 게임을 출시할 시점에 이르러 프로젝트의 성능을 살펴보는 것은 바람직하지 않습니다. 2020년 한 해에만 성능 최적화 팀은 목표로 잡은 일부 영역에서 속도를 100배로 높이는 등의 놀라운 성과를 보여주었습니다.

기능이 애초부터 잘못 디자인되었기 때문일까요? 린든은 그렇지 않다고 말합니다. “몇 년 전 일부 시스템이나 개별 기능을 구현할 당시에는 콘텐츠 수요가 많지 않았습니다. 이러한 시스템은 당시 상황에는 잘 작동했지만, 하드웨어가 발전하고 콘텐츠 양이 늘어나면서 내부 알고리즘을 다시 살펴보고 성능을 높이는 방식으로 확장해야 했습니다.”

시스템 확장성은 주로 Big O 표기법을 사용하여 측정됩니다. O(n^2)의 복잡도를 가진 시스템 알고리즘의 경우 n(콘텐츠 양)이 커지기 전까지는 큰 문제없이 작동합니다. 때때로 소규모의 컨테이너 변경으로도 알고리즘을 최적화(이상적으로는 O(1))하여 유의미한 성능 향상 효과를 얻을 수 있습니다.

린든은 다음과 같이 말합니다. “소프트웨어 개발은 사용자에게 제공하는 가치를 극대화하기 위해 지속적으로 노력하는 과정입니다. Unity 엔진의 활용도가 새로운 영역과 다양한 산업으로 확장되고 개발 가능한 콘텐츠 역시 확장됨에 따라 성능 향상을 위한 시도도 지속되고 있습니다.”

대표적인 사례가 바로 Unity 2018의 프리팹 워크플로 개선입니다. 성능 최적화 팀은 대규모 씬을 작업할 때 유연성과 생산성을 높일 수 있도록 중첩과 배리언트를 지원하는 사용자 워크플로를 통해 이 문제에 접근했습니다. 린든은 “워크플로가 개선되고 성능이 높아진 후에는 대규모 환경에서도 잘 작동하는지 확인해 볼 필요가 있었습니다”라고 말했으며, 성능 최적화 팀은 네스티드 프리팹 작업의 속도를 최대 250배 향상했습니다. 

2020.2 베타에서 제공하는 기능

성능 최적화 팀의 최근 성과 중 일부는 이미 블로그에서 다루었습니다. 새로운 성능 개선 사항은 Unity 2020.2(포스팅 작성 당시 베타 버전)에서 확인할 수 있습니다.

네스티드 프리팹 작업의 최적화 외에도, RegisterScriptedImporters의 속도가 최대 800배 향상되었으며 2D 텍스처 로딩을 최적화하여 규모가 큰 텍스처를 로드할 때 종종 발생하던 장애를 줄였습니다.

또 다른 예시로는 호출에 비용이 많이 들었던 Camera.main 스크립팅 함수를 들 수 있습니다. 기존에는 Camera.main을 호출하면 Unity에서 태그된 모든 게임 오브젝트의 목록을 검색했습니다. Unity에서 MainCamera 태그가 있는 모든 게임 오브젝트의 목록을 작성한 다음 임시 목록에 대한 재검토를 수행하여 Camera 컴포넌트가 포함된 첫 번째 활성 게임 오브젝트를 찾았습니다.

“이는 프로젝트에 포함된 게임 오브젝트가 몇 백 개에 불과하던 시절에 작성된 버전의 Unity입니다. 수천 개의 게임 오브젝트가 사용되는 요즘 프로젝트에서는 확장성이 부족하죠.”

팀의 시니어 소프트웨어 엔지니어인 리처드는 MainCamera로 태그된 오브젝트가 생성되었을 때 이들을 전용 목록에 저장하여 성능 병목 현상을 해결했다고 설명합니다. 이처럼 간단한 변경을 통해 다른 태그가 있는 오브젝트는 사전에 필터링하여 Camera.main 함수는 이제 MainCamera 태그가 있는 게임 오브젝트만 살펴보면 됩니다.

스포트라이트 팀 고객 프로젝트에서 확인할 수 있듯이, “수백 밀리초가 순식간에 단축되었습니다.”(아래 이미지 참조)

:

:

Camera.main 최적화

2021년 계획

성능 최적화 팀은 계속해서 성장하고 있습니다. 린든과 리처드는 현재 세 명의 새로운 팀원을 모집하고 있습니다. 이들은 “성능을 극대화하고, 특정 하드웨어가 성능에 미치는 영향을 끝까지 추적하려는 열정을 가진 사람이 필요하다”고 말합니다.

고성능 코드와 이러한 코드가 저사양 하드웨어에 어떻게 매핑되는지 이해하는 것이 무엇보다 중요하지만, 실시간 게임 시스템의 요건을 더 잘 이해할 수 있도록 게임 개발자 경력이 있거나 사내 게임 엔진 작업을 해 본 경험이 있으면 매우 유리합니다. 고성능 소프트웨어 개발에 대한 열정이 있다면 성능 최적화 팀에 지원해 보시기 바랍니다.

유니티 R&D의 모든 업무는 어떤 형태로든 성능과 관련되어 있으며, 성능 최적화 팀은 목표에 집중하기 위해 다양한 팀과 협업할 기회가 있습니다. 최적화 팀은 조만간 임포트와 배포 주기 문제에 관해 에셋 파이프라인 팀과 긴밀히 협업할 것으로 예상하고 있습니다.

내년에는 에셋 번들 API에서 비동기 언로드를 지원하고자 합니다. 지금까지 언로드 프로세스는 동기식으로 이루어졌지만, 비동기 언로드를 지원하면 언로드 중 발생하는 장애를 최소화할 수 있을 것입니다. 이는 최적의 성능을 위해 다시 기능을 살펴보고 수정한 좋은 사례입니다.

성능 최적화 팀은 테스트 과정에서 커뮤니티에서 제작한 일부 테스트 프로젝트를 활용하고 있으며 2021년에는 그 활용도를 더욱 높일 예정입니다. 예를 들면, 유니티의 소중한 베타 테스터이자 QA Jesus라고도 불리는 Peter77이 제작한 성능 테스트 프로젝트가 있습니다.

2021년에는 가장 많은 사용자를 보유한 핵심 플랫폼의 최적화뿐 아니라 콘솔 플랫폼과 레거시 시스템에도 더 많은 관심을 기울여 차세대 하드웨어에 적합하도록 Unity를 개선해 나가고자 합니다.

개선 사항 요청하기

성능 최적화 팀은 독립적인 기능으로서의 성능 개선에 주력하지만, 최적화 작업 자체는 유니티의 모든 팀에서 이루어지고 있습니다.

에디터를 더 편리하게 사용하기 위해 개선되어야 하는 성능 관련 기능이 있다면 댓글이나 포럼을 통해 의견을 주시기 바랍니다.

제작 과정을 더 알아보고 싶으신가요?

이번 포스팅에서는 앞으로 출시될 Unity의 개발과 개선에 집중하고 있는 팀원들을 소개하고 팀의 아이디어와 동기를 살펴보는 시간을 가졌습니다. 첫 번째 포스팅에서는 코드명 “Quality of Life”로 운영되고 있는 핵심 팀에 대해 다루었습니다. 자세한 내용은 여기에서 확인해 보세요.

향후 포스팅에서 다루었으면 하는 팀과 기능 영역이 있다면 아래에 댓글로 알려주시기 바랍니다.

21 replies on “2021년 Unity 로드맵: 성능 최적화 팀”

Lol
I give Unity one more year and it will start to break appart and start to devaluate. Really I don’t see any reason to keep using Unity. There’s nothing new, nothing ground breaking. Introducing more crap that no one needs and more bugs that breaks projects.

I think optimization in the editor – not just build – is really really important, it’s really good to see work done in that direction :)) I know UIElements is faster than IMGUI for more complex things like node graphs, which is super duper fantastic.

How about making the standard shader parameters _EmissionColor and _Color instanced by default. That way the one material can have many variations without invoking multiple batches.

SRP Batcher tries to batch anything with the same shader – not material – together, if you’re lucky enough to be able to use URP/HDRP, that’s an option. Otherwise I’d advise making your own standard shader. It’s pretty helpful, since you can add whatever features you need! :)

Yes, right, but…

-Unity runtime is still a pretty outdated mono version. Not CoreCLR and not even the newest version of mono with performance improvements.
-Burst is really good, but what good does it make when most of the time the mere act of *scheduling* jobs is much more expensive than jobs themselves? And why make the job scheduling on main-thread? Do you believe that the general developer with Unity won’t be able to debug it if errors appear?
-Likewise, why so many checks for threadIndex == 0 in many classes provided by Unity? You not only waste performance with them, but you lock out developers to do certain optimizations (why do we even need TransformAccessArray?). Are you sure that the general user won’t be able to adequately debug apparent issues?
-Why does Unity first load all the queued scenes and only then activate them? Not even asset integration happens during scenes loading! (https://forum.unity.com/threads/scene-loading-best-practicies.921548/) Considering how many small, granular scenes a modern project can have, that seems like an obvious target for improvement (https://youtu.be/6lRzXqfMXRo?t=444).

I’m sorry, I’m just a bit concerned that many (if not most) performance woes are tied directly to making the engine easy/aggressively safe to use at the expense of said performance and/or opportunities to improving it.

Faster project build time in HDRP is welcomed. More performance when using many VFX graphs.
Question: when will 2020.2 be released, out of beta?

Could you implement a performance anomaly detection system that would automatically alert developers to areas of their games that are slower than average or performance bottlenecks. In theory with enough data and coverage you could build up a database of problems and solutions that could inform the developers and even autofit the problem.

Important optimization areas that I believe the team(s) should focus on:
– HDRP: very difficult to reach 120+ fps in HDRP in simple scenes whereas URP easily goes 300-400+ fps on same hardware. Even when deactivating volumetrics/refraction/subsurface/etc and other expensive stuff
– UI: perhaps the real solution to performance issues in UnityUI is using UiToolkit instead? Would be cool to hear more about UIToolkit
– Import, platform switching & build times
– Diagnostic Tools that can help any inexperienced user understand obvious ways to improve build sizes, memory usage, etc…
– A proper sample project that demonstrates good workflows for streaming of open worlds

> – Diagnostic Tools that can help any inexperienced user understand obvious ways to improve build sizes, memory usage, etc…

Hi there, I work on the UI of the Memory Profiler package. We’re aware of the general need for better Asset Profiling and will continue to improve the UX and workflows regarding Memory Profiling, but I am curious if there are any specific needs you have in mind here.

Been using Unity since 4.0 as an Environment artist – We need Mesh to terrain blending for HDRP.

https://www.youtube.com/watch?v=d_at-NawTbY – This guy nailed the visual look, the height map blending is extremely realistic and the lighting between the surface normals is perfectly clean

That the only thing we environment artists needs to start actually contributing to forums, groups and art portfolios that feature outdoor/organic.

Almost all other engines support this, its time for us to finally, hopefully, eventually show what Unity can do without it looking last-last gen.

Thank you, I hope you will consider this. Great work guys!

Comments are closed.