Unity 5의 고성능 피직스

저희는 한동안 PhysX 2.8.3을 사용해 왔습니다. 유니티는 단순한 스톡 PhysX를 사용한 것이 아니라, 수년에 걸쳐 유니티 엔지니어들이 수많은 패치를 적용하여 확장했습니다. 정말 오랜만이며, 모든 물고기에 대해 PhysX 2에 감사의 인사를 전합니다. GDC'14에서 발표한 대로 Unity 5.0은 PhysX 3.3으로 업그레이드된 것이 특징입니다. 자세히 살펴보겠습니다.
PhysX SDK 3는 기존의 PhysX SDK 2.x를 근본적으로 재설계한 버전입니다. 기본적으로 PhysX 팀은 2.x에서 최고의 아이디어와 최상의 접근 방식을 취하여 전체 SDK를 처음부터 다시 작성했습니다. 즉, 전체 코드베이스가 다르고, 모든 인터페이스가 다르며, 대부분의 기능이 다릅니다.
이제 Unity 5.0 피직스의 사용 경험을 살펴보겠습니다.
간단한 것부터 시작하기 위해 기본적으로 적응력을 켜고 끌 수 있도록 했습니다. 적응력은 스택을 시뮬레이션할 때 수치 오류를 보정하는 PhysX의 특수 기술입니다. 하지만 유니티 개발자들의 피드백에 따르면 적응력이 게임 콘텐츠의 전반적인 불안정성에 큰 영향을 미친다고 합니다. 앞으로는 스택과 같은 것들이 더 잘 작동할 것으로 기대하세요.
스태틱 콜리더를 이동하면 비용이 훨씬 저렴해집니다. 스태틱 콜라이더는 리지드바디 컴포넌트가 없는 콜라이더 컴포넌트가 있는 게임 오브젝트일 뿐입니다. 이전에는 SDK에서 스태틱 콜라이더가 움직이지 않는다고 가정했기 때문에 스태틱 콜라이더를 이동하면 전체 성능에 나쁜 영향을 미치는 값비싼 AABB 트리 재빌드가 트리거되었습니다.
Unity 5에서는 동일한 데이터 구조를 사용하여 동적 및 정적 콜리더의 움직임을 모두 처리합니다. 안타깝게도 스태틱 콜라이더가 동적 콜라이더보다 메모리를 덜 소모하는 이점을 잃게 됩니다. 하지만 현재 스태틱 콜라이더 이동과 관련된 비용은 Unity 게임에서 성능 문제를 일으키는 3대 원인 중 하나입니다. 저희는 이를 바꾸고 싶었습니다.
연속 충돌 감지 기능이 대폭 개선되었습니다. 연속 충돌 감지 기능은 빠르게 움직이는 물체가 충돌을 감지하지 못한 채 다른 물체를 통과하는 것을 방지하는 데 사용됩니다. 종이에 총알이 날아오거나 당구 게임에서 일부 공이 다른 공보다 빠르게 움직이는 것을 상상해 보세요.
Unity 5.0에서는 SDK가 빠른 동작을 처리하는 데 필요한 모든 데이터를 생성합니다. 연속 충돌 감지를 활성화하기만 하면 작동합니다. PhysX3에는 현재 몸의 속도를 고려할 때 값비싼 CCD 시뮬레이션이 실제로 필요한지 아니면 기본 디스크리트로도 충분한지 감지하는 데 사용되는 알고리즘이 있습니다. CCD를 활성화하면 활성화됩니다.

PhysX3는 브로드페이즈에서 더 많은 리지드바디를 지원합니다. 실제로 데스크톱 및 데스크톱과 유사한 플랫폼에서는 하나의 프레임에 수십만 개의 바디를 표시할 수 있습니다. 이전에는 바디에 64k로 고정된 제한이 있었습니다. 이는 쉽게 늘릴 수 있는 상수가 아니라 SDK 전체에서 비트를 많이 절약한 결과입니다. PlayStation 3와 같은 일부 콘솔 대상에는 여전히 이 제한이 있습니다. 피직스 머티리얼에도 제한이 있습니다. 이 글을 쓰는 시점에서는 어떤 플랫폼에서도 64k 이상의 머티리얼을 보유할 수 없습니다.
Unity 5.0에서는 메시 콜라이더의 스케일링 비용을 줄였습니다. 이전에는 메시 콜라이더의 스케일을 조정할 때 버텍스에 스케일이 구워진 새 메시를 만들어야 했기 때문에 많은 시간과 메모리가 필요했습니다. PhysX3를 사용하면 베이킹 없이 논네거티브 스케일링을 지원할 수 있습니다. 기본적으로 무료입니다.
다음으로, 새로운 기능이라고 생각할 수 있을 정도로 Unity 4.x 버전과 많은 차이가 있는 두 가지 하위 시스템인 클로스와 비히클 모듈에 대해 살펴보겠습니다.
천부터 시작하겠습니다. Unity 4에서 클로스 시뮬레이션은 인터랙티브클로스 및 스킨드클로스 컴포넌트를 통해 지원됩니다. 인터랙티브클로스는 천과 같은 메시 동작, 즉 다른 피직스와 상호작용하고 힘을 가할 수 있는 "물리적 클로스"를 가지고 있습니다. 인터랙티브클로스는 계산 비용이 많이 들기 때문에 Unity 4에는 캐릭터 의상을 위한 스킨드클로스라는 다른 클로스가 있습니다.
스킨드클로스는 메인 시뮬레이션 파이프라인에서 분리되어 있기 때문에 인터랙티브클로스보다 더 나은 성능을 발휘할 수 있습니다. 천의 가장 큰 문제점은 두 구성 요소 모두 매우 불안정하고 비용이 많이 든다는 점입니다. PhysX3 통합이 예정됨에 따라 InteractiveCloth에 대한 지원을 중단하고 캐릭터 의상을 염두에 두고 디자인된 단순한 클로스 컴포넌트 하나만 제공하기로 결정했습니다.
Unity 5.0에서 클로스는 더 이상 씬의 모든 콜리더에 반응하지 않으며, 월드에 다시 포스를 적용하지도 않습니다. 대신 더 빠르고 멀티스레드이며 안정적인 캐릭터 의상 솔루션을 제공합니다. 추가하면 새 클로스 컴포넌트는 더 이상 바디에 전혀 반응하지 않습니다.
따라서 클로스와 월드는 월드의 콜라이더를 클로스 컴포넌트에 수동으로 추가하기 전까지는 서로를 인식하거나 볼 수 없습니다. 그 후에도 시뮬레이션은 여전히 단방향으로 진행되며, 천은 이러한 신체에 반응하지만 다시 힘을 가하지 않습니다. 또한 천으로 만든 충돌기는 구형, 캡슐, 원뿔형 캡슐 충돌기의 세 가지 유형만 사용할 수 있으며, 구형 충돌기 두 개를 사용하여 구성합니다. 이러한 변경 사항은 모두 성능 향상을 위해 도입되었습니다.
Unity 5.0의 제작 인터페이스는 스킨드클로스와 유사하며, 5.x에서는 이를 개선하기 위해 많은 노력을 기울이고 있습니다. 5.x 주기에는 메카님 아바타와의 통합과 같은 기능이 추가될 예정입니다.
새로운 Cloth 컴포넌트는 내부적으로 CUDA를 통해 GPU를 지원하지만, 몇 가지 이유로 5.x 주기 후반에 출시하기로 결정했습니다. 첫째, CUDA는 NVIDIA 하드웨어의 Windows에서만 작동하며, Mac 및 Linux에서 큰 입지를 확보하고 있습니다. 둘째, 저희는 우선 핵심적인 버그 수정에 집중하고 그다음에 멋진 기능들을 통합하는 데 집중하고자 합니다.
이제 차량에 대해 몇 마디 말씀드리겠습니다. PhysX3에는 휠콜리더 컴포넌트를 구현하는 데 사용한 멋진 새 비히클 SDK가 있습니다. 새로운 컴포넌트는 훨씬 더 사실적인 서스펜션과 타이어 마찰을 구현합니다. 또한 오랫동안 지속되어 온 여러 가지 문제도 해결되었습니다.
Unity 5.0에서는 새로운 컴포넌트를 즉시 사용하여 간단한 동작을 생성할 수 있습니다. 에셋 스토어에서 차량 패키지를 찾는 개발자는 에디의 차량 패키지처럼 이미 세밀하게 조정되고 사실적이거나 고급화된 것을 원할 때만 이용할 것으로 예상합니다.
웹에서 다운로드한 무료 메시를 사용하여 몇 시간 만에 설정할 수 있었던 것을 살펴보십시오(대부분의 시간은 Blender에서 모델을 준비하는 데 사용했습니다):
에디의 차량 패키지의 SUV 중 하나입니다:
Edy는 현재 더 멋진 콘텐츠를 제공할 새로운 버전의 패키지를 개발 중입니다. 자세한 내용은 직접 문의하세요 .
여러분과 공유하고 싶은 차량에 대한 환상적인 기술적 세부 사항이 많지만, 지금은 새로운 WheelCollider 기즈모만 살펴봅시다. 이렇게 하면 일시 중단이 어떻게 작동하는지에 대한 아이디어를 얻을 수 있습니다.

위 그림에서 휠 원과 휠 직경은 녹색, 서스펜션 이동 세그먼트는 주황색, 힘 적용 지점 구는 녹색으로 표시되어 있습니다. 서스펜션 트래블 세그먼트에는 최대 압축 위치, 최대 처짐 위치 및 목표 위치에 대한 표시가 있습니다.
예상대로 휠은 최대 압축과 최대 처짐 위치 사이에서만 움직일 수 있습니다. 목표 위치(기술 용어로는 휴식 위치라고도 함)는 스프링의 힘에 의해 스프링 무게가 균형을 이루는 위치, 즉 차량이 평평한 표면에 서 있을 때 바퀴가 위치한 위치를 말합니다. 조정하기 까다로워 보일 수 있지만, 실제로 최대 압축 위치는 원래 메시에서 휠이 위치한 곳입니다.
다음으로, 서스펜션 거리와 목표 위치를 서스펜션 거리의 일부분으로 지정합니다. 두 개의 플로트만 있으면 모든 것을 지배할 수 있습니다! 새로운 휠 기즈모가 시뮬레이션 데이터에서 회전과 위치를 즉시 업데이트한다고 말씀드렸나요? 설정을 미리 보기 위해 실제 휠 지오메트리를 추가하고 휠 위치 지정 코드를 작성할 필요도 없습니다. 모든 기능이 내장되어 있습니다.
내부 계산 모델이 다양한 코어에서 실행할 수 있는 작업으로 구성되므로 이제 PhysX3는 멀티코어에서 실행할 준비가 되었습니다. SDK는 모든 멀티스레딩을 수행하여 모든 종속성을 자체적으로 처리하고 최적의 작업 분해를 제공합니다.
지금까지 살펴본 바에 따르면 일반적으로 더 나은 코드 기반과 향상된 멀티스레딩의 결과로 성능이 두 배로 향상될 것으로 예상하는 것이 합리적입니다. 경우에 따라 최대 10배까지 개선되는 등 극적인 개선이 이루어지기도 합니다.
더 많은 데이터에 관심이 있는 성능 닌자라면 피에르 테르디만의 블로그를 방문해보세요. 그는 PhysX SDK의 핵심 개발자입니다.
새로운 함수의 모양과 느낌은 Unity와 비슷하지만, 동작 방식이 다르거나 파라미터가 다른 의미를 갖거나 경우에 따라 이전 동작이 더 이상 지원되지 않는 경우가 여전히 존재합니다. 따라서 Unity 5.0 피직스는 Unity 4.x와 100% 호환되지 않습니다. 이전 Unity 릴리스에서 마이그레이션할 때는 기존 프로젝트를 재조정하고 일부 물리 코드를 다시 작성할 준비를 하세요.
이 포스팅에서 소개할 수 있는 것보다 Unity 5의 피직스에 대한 자세한 내용은 훨씬 더 많습니다. 댓글로 자유롭게 질문해 주시거나 올해 유나이트 2014 개발자 컨퍼런스에 참석하시는 분들은 제가 진행하는 Unity 5.0의 물리에 대한 심층 강연을 시청하시고 인사도 나누고 대화도 나눠보세요.
