GLKBaseEffect prepareToDraw正在泄漏

时间:2012-06-20 03:42:48

标签: iphone ios glkit

似乎每个人都认为这已经破坏了,你需要摆脱GLKBaseEffect来阻止它泄漏。但是没有人提到你要用什么代替它。

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

我正在做非常基本的事情,只是绘制2D精灵。除了所有泄漏之外,效果很好:p

我只需要知道prepareToDraw正在做什么,并用一些有效的代码替换它。我发现的所有教程似乎都专注于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);

2 个答案:

答案 0 :(得分:2)

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

它很繁琐,但并不难,花了大约一天。有教程,但没有提供我所需要的。最后我使用OGL默认项目作为我的起点,因为它给了我框架 - 编译和运行着色器以及所有这些,即使它没有按我想要的那样做。

以下是我所做的一切。它花了很多次迭代才能开始工作......

  1. 从默认的OGL项目中删除所有GLKBaseEffect(使用GLKBaseEffect绘制一个立方体,但使用着色器绘制另一个立方体)
  2. 将投影矩阵更改为GLKMatrix4MakeOrtho。
  3. 将顶点从多维数据集更改为2D。让它发挥作用。
  4. 添加纹理。
  5. 全力以赴。
  6. 将所有OGL代码移动到OpenGLHelper类中。
  7. 将代码移入我的项目并将所有GLKEffects替换为我的新类
  8. 最终结果可能不是最好的代码,但它有效,并且不再有泄漏。

    以下是我的着色器

    // 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; 
    }
    

    我很乐意与大家分享剩下的代码,但是有很多内容可以放在这里!

答案 1 :(得分:1)

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

你似乎在使用纹理。您必须致电glDeleteTextures,否则textureInfo的每次更新都会泄漏。

另请参阅此相关帖子:Release textures (GLKTextureInfo objects) allocated by GLKTextureLoader