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的默认项目作为我的出发点,因为这给了我框架 – 编译和运行着色器,所有这些,即使它没有做我想要的。
这是我所做的要点。 花了很多迭代才能正常工作
- 从默认的OGL项目中移除所有的GLKBaseEffect(一个立方体用GLKBaseEffect绘制,但另一个用着色器绘制)
- 将投影matrix更改为GLKMatrix4MakeOrtho。
- 将多维数据集中的顶点更改为二维。 让它工作。
- 添加纹理。
- 得到它所有的工作。
- 将所有OGL代码移到OpenGLHelper类中。
- 将代码移到我的项目中,并将所有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对象)