GLKViews を使用して OpenGL 環境を実現する iOS アプリケーションを作成しました。すべてが期待どおりに機能するようになったので、約 3 回ビューを再インスタンス化するとすぐに、大量のメモリ割り当てとメモリ警告が表示されることに気付きました。初期化時に、次のようなテクスチャをロードします。
NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],
GLKTextureLoaderOriginBottomLeft,
nil];
NSError *error;
topTexture = [GLKTextureLoader textureWithCGImage:[self imageWithView:v].CGImage options:options error:&error];
if (error) {
NSLog(@"Error loading texture from image: %@",error);
}
GLKView が次のように消えたら、それら (およびバッファー) を削除します。
-(void)cleanUp{
if(vertexArray != 0){
glDeleteBuffers(1, &vertexArray);
vertexArray = 0;
}
if( texArray != 0){
glDeleteBuffers(1, &texArray);
texArray = 0;
}
GLuint fT = frontTexture.name;
glDeleteTextures(1, &fT);
GLuint lT = leftTexture.name;
glDeleteTextures(1, &lT);
GLuint rT = rightTexture.name;
glDeleteTextures(1, &rT);
GLuint baT = backTexture.name;
glDeleteTextures(1, &baT);
GLuint boT = bottomTexture.name;
glDeleteTextures(1, &boT);
GLuint tT = topTexture.name;
glDeleteTextures(1, &tT);
}
これは彼らが描かれる方法です:
-(void)draw{
[self.effect prepareToDraw];
self.effect.texture2d0.enabled = YES;
for(int i=0;i<6;i++){
if(i==0)glBindTexture(GL_TEXTURE_2D, frontTexture.name);
if(i==1)glBindTexture(GL_TEXTURE_2D, rightTexture.name);
if(i==2)glBindTexture(GL_TEXTURE_2D, backTexture.name);
if(i==3)glBindTexture(GL_TEXTURE_2D, leftTexture.name);
if(i==4)glBindTexture(GL_TEXTURE_2D, bottomTexture.name);
if(i==5)glBindTexture(GL_TEXTURE_2D, topTexture.name);
glDrawArrays(GL_TRIANGLES, i*6, 6);
}
}
それでも、割り当てを監視すると、インスタンス化時にライブ バイトが 2 MB 増加します。次に、ビューを削除しても、ライブ バイトは同じままです。そのため、作成された 2MB は決して解放されないようです。