2017-11-14 9 views
2

비행 중에 3D 모델의 하위 결과를 미리 볼 수있는 기능이 포함 된 앱을 개발했습니다. 형상을 영구적으로 수정하는 자체 catmull clark 세분화 함수가 있지만 SCNGeometry의 .subdivisionLevel 속성을 사용하여 임시로 모델을 미리보기로 세분화합니다. 대부분의 경우 미리보기가 자동으로 사용자가 영구 옵션을 선택한다는 의미는 아닙니다.기본 타사 라이브러리의 메모리 누출 문제 해결 또는 피하기

. subdivisionLevel은 (실제 해결책으로 시도한 MDLMesh의 하위 구분과 같이) Pixar의 OpenSubdiv를 사용하여 실제 하위 분할 및 스무딩을 수행합니다. 그것은 내 자신보다 빠르게 작동하지만 더 중요한 것은 내가 SCNGeometry 소스를 통해 제공하는 정점 데이터를 영구적으로 수정하지 않는다는 것입니다.

문제는 메모리 누수를 막을 수 없다는 것입니다. 나는 이것을 오래 전에 알아 차렸고, 그것이 내 코드에서 뭔가라고 생각했다. 나는 이것이 단지 하나의 특정 IOS 버전이라고 생각하지 않으며 신속하고 객관적인 C에서 발생합니다. 결국 Xcode의 SceneKit 게임 템플릿에 단 한 줄을 추가하여 배의 subdivisionLevel을 1로 설정하는 작은 예제를 설정합니다.

enter image description here

내가 일주일 전에 애플에 버그 리포트를 제출하지만 난 곧 또는 전혀 응답 또는 수정 언제든지 기대할 수 확실하지 않다 : 즉시 메모리 누수가 발생합니다. 이 스크린 샷은 매우 작은 모델의 테스트에서 나온 것이지만 작은 모델 (수백에서 수천 개의 버텍스)으로도 많은 양의 누출과 빠르기가 발생하여 앱이 충돌 할 수 있습니다. ,

if result.node.geometry!.subdivisionLevel == 3 { 
    result.node.geometry!.subdivisionLevel = 0 
    } else { 
    result.node.geometry!.subdivisionLevel = 3 
    } 

이 메가 바이트 누출 배를 눌러 을 (목표 C의 경우를 제거!) : 재생하려면

는 SceneKit 게임 템플릿을 기반으로 엑스 코드에서 새 프로젝트를 만들고 handletap 다음 줄을 추가 그것을 좀더 탭하면 빠르게 추가됩니다.

OpenSubdiv는 3D Studio max와 다른 사람에서 분명히 사용되며 Apple의 구현에있는 것으로 보입니다. 그래서 제 질문은 : SceneKit의 서브 디비전 기능을 완전히 포기하지 않고이 문제를 해결하거나 피하는 방법이 있습니까? 아니면 애플 만의 유일한 반응입니까?

+0

Apple을 기다리지 않고 수평 스크롤 뷰를 사용하는 모든 양방향 응용 프로그램에 영향을 미치는 쉬운 버그를 수정하기 위해 3 개의 IOS 버전을 사용했습니다 !! – Yitzchak

답변

0

WWDC 비디오를 통해 Apple이 OpenSubdiv에 얼마나 헌신했는지, 그리고 누출 문제를 해결할 수 있는지에 대한 아이디어를 얻으려는 순간, 최신 SceneKit 업데이트 이후 Subdivision이 Metal에 의해 GPU에서 수행 될 수 있음을 발견했습니다. 여기

필요한 두 줄이 SceneKit에서 세분을 사용하려는 경우 (스위프트) 또는 모델 IO 있습니다

let tess = SCNGeometryTessellator() 
geometry.tessellator = tess 

(비디오로 Scenekit, 23시 45분의 새로운 기능 WWDC 2017에서)

하위 분할 수준을 낮게 또는 0으로 설정할 때 메모리를 해제하고 GPU에서 하위 분할이 수행되므로 (특히 더 높은 수준에서는 더 빠름) 더 적은 메모리를 사용하고 가장 중요한 것은 메모리를 해제합니다.

+0

이 문제 (메모리 누수)는 IOS 11.3 베타 버전에서 해결되었습니다. 테셀레이터를 사용하면 메모리 누수를 방지 할 수는 있지만 법선을 적절하게 부드럽게하지는 못합니다. 따라서 적응 옵션 세분을 실제로 원하지 않는 한, 현재 최상의 옵션은 테셀레이터를 사용하지 않는 것입니다. 이것은 cpu에 세분을 사용하고 누출되지 않으며 보통 의도 된 것처럼 보일 것이다. – Xartec