GLKBaseEffect prepareToDraw泄漏

似乎每个人都认为这是坏的,你需要摆脱GLKBaseEffect来阻止它泄漏。 但没有人提到你要replace它。

有人能指出我正确的方向吗? 一些示例代码或教程将非常有用!

我正在做非常基本的东西,只是画2D精灵。 除了所有的泄漏之外,工作很好

我只需要知道prepareToDraw正在做什么,并用一些有效的代码replace它。 我发现的所有教程似乎都专注于3D渲染。

我可以使用OpenGL ES1而不是2吗?

//---Sprite drawing code ---------------------- effect.transform.modelviewMatrix = viewMatrix; effect.texture2d0.name = textureInfo.name; effect.texture2d0.envMode = GLKTextureEnvModeReplace; // LEAK Here [effect prepareToDraw]; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, vertices); glEnableVertexAttribArray(GLKVertexAttribTexCoord0); glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, textureVerts); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisableVertexAttribArray(GLKVertexAttribPosition); glDisableVertexAttribArray(GLKVertexAttribTexCoord0); glDisable(GL_BLEND); 

所以…最后我做了其他人必须做的事情,并写了我自己的GLKBaseEffect版本。

这很费劲,但这并不困难,花了一天的时间。 那里有教程,但没有提供我所需要的。 最后,我使用了OGL的默认项目作为我的出发点,因为这给了我框架 – 编译和运行着色器,所有这些,即使它没有做我想要的。

这是我所做的要点。 花了很多迭代才能正常工作

  1. 从默认的OGL项目中移除所有的GLKBaseEffect(一个立方体用GLKBaseEffect绘制,但另一个用着色器绘制)
  2. 将投影matrix更改为GLKMatrix4MakeOrtho。
  3. 将多维数据集中的顶点更改为二维。 让它工作。
  4. 添加纹理。
  5. 得到它所有的工作。
  6. 将所有OGL代码移到OpenGLHelper类中。
  7. 将代码移到我的项目中,并将所有GLKEffectsreplace为我的新类

最终的结果可能不是最好的代码,但它的工作,并没有泄漏了。

这是我的着色器

 // FRAGMENT SHADER ////////////// precision mediump float; varying lowp vec2 texCoordOut; uniform sampler2D textureUniform; uniform float alphaUniform; uniform lowp vec4 colorUniform; void main() { vec4 color = colorUniform * texture2D(textureUniform, texCoordOut); ; gl_FragColor = color; } // VERTEX SHADER //////////////////// attribute vec4 position; uniform mat4 projection; uniform mat4 modelView; attribute vec2 texCoordIn; varying vec2 texCoordOut; void main() { gl_Position = projection * modelView * position; texCoordOut = texCoordIn; } 

我很乐意分享代码的其余部分,但是有一点要放在这里!

没有直接关系到你的问题,但我有一些类似的问题。 困难的部分是弄清楚什么是泄漏:

你似乎在使用纹理。 你必须调用glDeleteTextures否则你的textureInfo每个更新都会泄漏。

另请参阅相关文章: 发布由GLKTextureLoader分配的纹理(GLKTextureInfo对象)