2012-06-20 42 views
2

似乎每個人都認爲這是壞的,而且您需要擺脫GLKBaseEffect以阻止泄漏。但是沒有人提到你會替換它。GLKBaseEffect prepareToDraw正在泄漏

有人可以指出我在正確的方向嗎?一些示例代碼或教程將非常有用!

我正在做非常基本的東西,只是畫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); 
+0

同樣的問題在這裏... – Christoph

回答

1

沒有直接關係到你的問題,但我有一些類似的問題。 困難的部分是要弄清楚什麼是泄漏:

你似乎在使用紋理。您必須致電glDeleteTextures否則您的textureInfo的每次更新都將泄漏。

另見本相關的職位:Release textures (GLKTextureInfo objects) allocated by GLKTextureLoader

+0

這不適合我。 –

+0

好的。在我的情況下,樂器在那裏顯示泄漏。從使用着色器和GL 2開始,不用擔心,那麼一切順利。 – lazi74

2

所以......我到底做了其他人有什麼可以做,寫我自己GLKBaseEffect版本。

這很煩瑣,但這並不困難,花了一天。那裏有教程,但沒有提供我所需要的。最後,我使用OGL默認項目作爲我的出發點,因爲它給了我框架 - 編譯和運行着色器以及所有這些,儘管它沒有按照我想要的那樣做。

這是我所做的要點。我花了很多的迭代得到工作...

  1. 從默認OGL項目中刪除所有GLKBaseEffect(一個立方體畫有GLKBaseEffect但對方着色器)
  2. 更改投影矩陣是GLKMatrix4MakeOrtho。
  3. 將頂點從多維數據集更改爲2D。讓它工作。
  4. 添加紋理。
  5. 得到它所有的工作。
  6. 將所有OGL代碼移入OpenGLHelper類。
  7. 移動代碼到我的項目,與我的新類

最終的結果可能不是最好的代碼,但它的工作原理,並沒有泄漏任何更多全部更換GLKEffects。

這裏是我的着色器

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

我會高興地共享代碼的其餘部分,但有一點很大的它擺在這裏!

+0

大衛,我想遵循你採取的路徑,但在我看來,XCode的OpenGL默認項目也使用'GLKBaseEffect'。我錯過了什麼嗎?你願意分享你的消息嗎? – cheeesus

+0

對不起,剛剛看到您的評論,其中一個OGL默認項目中的多維數據集被渲染爲「GLKBaseEffect」。謝謝! – cheeesus

+0

希望能爲你解決。如果有幫助,我會很樂意分享我的代碼,儘管我知道它並不完美! –