2011-12-03 17 views
0

私のiPhoneアプリで3Dモデルを読み込んでいます。モデルは大きくなる可能性があるので、別のスレッドでモデルをロードしたい。新しいスレッドを生成するためにdetachNewThreadSelectorを呼び出し、そこに単にモデル読み込み呼び出しを移動しました。モデルはロードされますが、テクスチャはありません。私がデバッガをチェックインすると、glGenTextures呼び出しが新しい名前/ Id(それは0に価値がある)を作成しないことがわかります。detachNewThreadSelectorを使用して別のスレッドにテクスチャを読み込む

メインスレッドへの関数呼び出しを移動すると、すべて正常に動作します。

答えて

1

OpenGLは、OpenGLコンテキストを作成するときにのみ機能し、コンテキストは1つのスレッドに対してのみ有効なので、別のスレッドでOpenGLを使用するには、そのスレッドの別のコンテキストを作成し、 。

また、コンテキスト間で(wglShareListsに似た何かを介して)リソースを共有するのが普通です。

+0

これはiPhoneのOpenGL ESにあります。どこかの例がありますか? –

0

私はsharegroupを使用しています。ここでは私のためにそれをやったコードは次のとおりです。

メインスレッド:

[NSThread detachNewThreadSelector:@selector(負荷:) toTarget:[AsynchModelLoaderクラス] withObject:自己];

生成されたスレッド:

+(ボイド)荷重:(ID)PARAM {
NSAutoreleasePool *プール= [[NSAutoreleasePoolのALLOC] INIT]。
ModelViewer * mview =(ModelViewer *)param;

EAGLContext * aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:mview.context.sharegroup];
[EAGLContext setCurrentContext:aContext];

mview.lib = [インポート元fromResource:@ "model3d"];

[pool drain]; }

関連する問題