2016-11-04 2 views
1

응용 프로그램이 전후 60fps에서 원활하게 실행 되더라도 새 노드가 화면에 나타날 때 SceneKit 앱 (메탈 사용)에 문제가 있습니다.새 노드가 표시 될 때 SceneKit app stutters

물건이 파괴되고 무언가가 파괴 된 곳에서 전원이 켜지는 게임을 상상해보십시오. 나는 말더듬이 나타나는 것은 파워 업에 나타나는 것이 확실합니다. 왜냐하면 상황이 파괴되고 (따라서 장면에서 제거 될 때) 일어나지 않기 때문입니다.

지금까지 말더듬을 수정하기 위해 수행 한 작업 : SceneKit보기의 사전로드 메소드를 통해 노드를 사전로드하고 완료 핸들러에서만 장면에 추가합니다. 카메라를 표시해야하기 오래 전에 카메라 위에 추가합니다. 시간이 지나면 카메라를 올바른 위치로 이동시킵니다. 하나의 변경 (파괴 된 항목의 노드 제거, 그 자리에서 파워 업 이동)을 보장하기 위해 대기열 메커니즘을 구현했습니다. 프레임 당 완료됩니다.

그러나 전원이 켜지는 동안 끊김 현상이 (항상은 아니지만) 때때로 발생합니다. SceneKit이 처음으로 노드가 나타날 때만 (심지어 미리로드 된 경우에도) 무언가를하고 있는지 궁금합니다. 어떤 일이 일어나더라도 더듬 거리는 원인이 될만한 것 같지만 Xcode 성능 측정기는 너무 짧아 보여야합니다. 모든 프레임에는 많은 유휴 시간이 있습니다. CPU와 GPU는 절대로 한계에 가깝지 않습니다.

균일 한 색상의 간단한 큐브를 사용하면 여전히 문제가 발생하기 때문에 복잡한 모양이나 거대한 질감과 관련이 없다고 생각합니다.

여기에 무슨 일이 일어나고 있는지 또는 어떻게 추적 할 수 있는지 생각해보십시오.

답변

0

나는 혼자서 그 이유를 찾았고, 같은 문제가 생길 경우에 대비하여 나와 공유하고 싶습니다.

SceneKit이 백그라운드에서하고있는 신비한 작업은 다양한 노드의 셰이더를 다시 컴파일하는 것입니다. Apple은 이것을 확인하지는 않았지만, SceneKit에는 각 노드를 의도 한대로 렌더링 할 수있을만큼 복잡한 가장 효율적인 셰이더를 항상 사용하는 정책이 있다는 것을 확신합니다. 즉, 효과, 재질 속성 또는 광원을 추가 할 때마다 더 복잡한 쉐이더를 컴파일합니다. 또한 조명 계산의 복잡성이 증가한 이유를 제거하면 더 간단한 쉐이더로 대체됩니다.

이것은 항상 가능한 최상의 성능을 얻는 측면에서 뛰어나지 만 내가 경험 한 것 또한 단점이 있습니다. 셰이더를 다시 컴파일하는 데 시간이 걸리므로 CPU에 부하가 걸리고 GPU가 셰이더의 새 버전을 기다리게합니다. 결국 대부분의 시간 동안 완벽하게 원활하게 실행 되더라도 응용 프로그램이 더듬 거리게됩니다.

이 문제를 해결하는 가장 쉬운 방법은 SCN 프로그램을 사용하여 자신의 코드로 SceneKit 쉐이더를 대체하는 것입니다. 그러나 이것은 또한 SceneKit이 제공하는 대부분의 안락함을 느슨하게 만듭니다. 이것이 내가 원하는 것이 아니기 때문에 다음과 같은 접근 방식으로 끝 맺었습니다 :

SceneKit은 초기에 장면을 검은 색 오버레이로 덮어서 나중에 볼 수있는 모든 노드의 모든 쉐이더를 처음에 컴파일하고, 카메라 앞의 모든 노드를 추가 한 다음 커버 레이어를 페이드 아웃하기 전에 올바른 위치로 이동하십시오. 또한 항상 필요하지 않은 효과를 완전히 끄지 않음으로써 재 컴파일을 피할 수 있습니다 (예 : 조명이 0이 아닌 0.1로 밝기를 변경하여 꺼짐). 이렇게하면 SceneKit은 항상 동일한 쉐이더를 유지하므로 끊김 현상을 피할 수 있습니다.

다시 : 이것은 Apple에 의해 확인되지 않았지만 지금까지 작동했기 때문에 내 가정이 정확하다고 생각합니다 .-).

관련 문제