GLKitを使用してOpenGLES2.0でiPhoneアプリケーションを作成しています。GLKTextureLoaderを使用して、テクスチャを同期的にロードしています。
問題は、特定のテクスチャについて、最初にそれをロードできないことです。このエラーが発生します:
The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.)
このエラーコードについて、アップルのドキュメントには次のように記載されています。
GLKTextureLoaderErrorUncompressedTextureUpload
An uncompressed texture could not be uploaded.
Available in iOS 5.0 and later.
Declared in GLKTextureLoader.h.
(それほどでもない)。
openglコンテキストがビジー状態などのときに、テクスチャを読み込もうとしていませんか?
ノート:
- このテクスチャをロードする前に、他のテクスチャをロードします。これらは最初の試行で機能します。また、まったく同じテクスチャファイルが2回目の試行で正常にロードされます。
- この前にロードされたテクスチャは2、3しかないので、十分な空きビデオメモリがあるはずです。
- テクスチャはアルファ付きの非圧縮PNGですが、TGA(24ビットおよび32ビット)でも試してみましたが、うまくいきませんでした。
どんなアイデアでも大歓迎です、ありがとう
編集:
より詳しい情報:
openglコンテキストは、すべての画面で共有されます。これは、シェーダーとテクスチャを画面間でロードしたままにするために行っています。
上記の問題は、2番目の画面に移動したときに発生します。最初の画面では、問題なくテクスチャを描画します(他のテクスチャも問題ありません)。
上記の問題は、ゲームの世界でコンテンツ(ゲームエンティティ)をロードするときに発生します。各エンティティはテクスチャを読み込もうとします。テクスチャを一度だけロードしてから、他のすべてのエンティティに対して同じIDを返す単純なキャッシュシステムがあります。1つの方法で、エンティティを同期的にロードしています。最初のエンティティはテクスチャのロードに失敗し、次に2番目のエンティティが来て成功し、3番目のエンティティがキャッシュされたIDを取得します。
でloadentitiesメソッドを呼び出していますが
viewDidAppear
、エンティティをロードする前に2秒間スリープを追加しようとしましたが、何も変更されていません。
編集:
テクスチャ読み込みコード:
- (GLKTextureInfo *)loadTextureAtPath:(NSString*)path ofType:(NSString*)type withKey:(NSString *)key
{
GLKTextureInfo* tex;
tex = [self textureWithKey:key];
if (tex)
return tex;
NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO],
GLKTextureLoaderOriginBottomLeft,
nil];
NSError * error;
NSString *bundlepath = [[NSBundle mainBundle] pathForResource:path ofType:type];
tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:&error];
if (tex == nil)
DLOG_LOCAL(@"Error loading texture: %@", [error localizedDescription]);
else
[textures setObject:tex forKey:key];
return tex;
}