2017-11-14 7 views
2

私は、3Dモデルの細分化結果をオンザフライでプレビューする機能を含むアプリケーションを開発しました。ジオメトリを永久に変更する独自のcatmull clark細分割関数がありますが、SCNGeometryの.subdisionLevelプロパティを使用して、モデルを一時的にプレビューとして細分化します。ほとんどの場合、プレビューは自動的にユーザーが永続的なオプションに行くことを意味しません。デフォルトサードパーティライブラリのメモリリークの修正または回避

.subdisionLevelは、実際の細分化とスムージングを行うためのPixarのOpenSubdiv(回避策としてMDLMeshのサブディビジョンと同じように)を使用しています。それは私自身のものよりも速く動作しますが、もっと重要なのはSCNGeometryソースから提供する頂点データを永久に変更するものではありません。

問題は、メモリがリークするのを止めることができないということです。私は最初これを長い時間前に気づいた、それは私のコードの中にあったと思った。私はそれが単なる特定のIOSバージョンではないと思います。それはSwiftとObjective Cの両方で起こります。最終的に、XcodeのSceneKitゲームテンプレートにわずか1行追加し、船のsubdivisionLevelを1に設定します。すぐにメモリリークにつながる:

enter image description here

私は一週間前にアップルにバグレポートを提出したが、私はすぐに、またはまったく応答や修正をいつでも期待できるか分かりません。スクリーンショットは非常に小さなモデルのテストからのものですが、小さなモデル(何百から数千もの頂点)であっても、多くのものが漏れてしまい、アプリケーションがクラッシュすることにつながります。再現SceneKitゲームのテンプレートに基づいて、Xcodeで新規プロジェクトを作成し、handletapに以下の行を追加するには

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

(!削除Objective Cのために) はメガバイトをリークする船をタップして、それをもう少しタップすれば、それはすぐに追加されます。

OpenSubdivは3D Studio maxなどで使用されていますが、Appleの実装にあるようです。だから私の質問は、SceneKitの細分化機能を完全にあきらめずにこの問題を修正/回避する方法があるのか​​、それともAppleの唯一のチャンスであろうか?

+0

Appleを待たずに、水平スクロールビューを使用するすべての双方向アプリケーションに影響する簡単なバグを修正するために、3つのiOSバージョンを使用しました。 – Yitzchak

答えて

0

アップルがOpenSubdivにどのようにコミットしているのかを知るためにWWDCのビデオを見て、彼らが漏れを修正するチャンスを見いだしたところ、最新のSceneKitアップデート以来、GPD上でGPUで細分化を行うことができました。ここで

あなたがSceneKitやモデルIOに細分化を使用したい場合は必要二行(スウィフト)は次のとおりです。

let tess = SCNGeometryTessellator() 
geometry.tessellator = tess 

(WWDC 2017からScenekit、ビデオに23時45分の新機能)

これにより、GPUで細分化が実行され(より高速な、特に高レベルで)、メモリの使用量が少なくなり、サブディビジョンレベルをゼロに戻したときにメモリを解放します。

+0

この問題(メモリリーク)は、IOS 11.3ベータ版で解決されています。テッセレーターを使用するとメモリリークは防げましたが、法線を適切に平滑化しません。だから現時点で最良の選択肢は、実際に適応的な細分化が必要な場合を除いて、テッセレーターを使用しないことです。これはCPU上で細区分を使用しますが、漏れはなく、通常意図した通りに見えます。 – Xartec

関連する問題