2017-02-17 246 views
0

我打算使用OpenGL渲染視頻流。glTexImage2D導致內存泄漏

第一步我接收到視頻的第一幀後,分配直接字節緩衝區,並把所有的幀片段。 ByteBuffer只分配一次。

directBuffer = ByteBuffer.allocateDirect(frameSize * fragmentCount);

當所有幀片段到位,即時傳遞字節緩衝區到OpenGL渲染

public ByteBuffer getBuffer() { 
    buffer.rewind(); 
    fragments.stream().forEach((frameFragment) -> { 
     for (byte byteFragment : frameFragment.getFrameData()) { 
      buffer.put(byteFragment); 
     } 
    }); 
    buffer.flip(); 
    return buffer; 
} 

在主場景循環阻塞隊列正在等待幀準備就緒,然後使現場。

ByteBuffer frame = framesQueue.take();

之後IM清理現場,設置視等

  glClear(GL_COLOR_BUFFER_BIT); 
      glColor3f(1, 1, 1); 
      glMatrixMode(GL_PROJECTION); 
      glPushMatrix(); 
      glLoadIdentity(); 
      glOrtho(-480, 480, -270, 270, -1, 1); 
      glPushMatrix(); 
      glViewport(0, 0, 768, 576); 

當它完成,我已經準備好繪製紋理四冒頭。

glBindTexture(GL_TEXTURE_2D, glGenTextures()); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 768, 576, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer); 
    glBegin(GL_QUADS); 
    { 
     glTexCoord2f(0.0f, 0.0f); 
     glVertex2f(0.0f, 0.0f); 

     glTexCoord2f(1.0f, 0.0f); 
     glVertex2f(768, 0.0f); 

     glTexCoord2f(1.0f, 1.0f); 
     glVertex2f(768, 576); 

     glTexCoord2f(0.0f, 1.0f); 
     glVertex2f(0.0f, 576); 
    } 
    glEnd(); 

程序運行時,該視頻是非常光滑,並具有相當低的延遲(這是主要的關注)

的問題是方法

 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 768, 576, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer); 

導致內存泄漏。

化java heapspace似乎罰款enter image description here

但在Java的內存使用量不斷增長無限。 enter image description here

對於測試,我沒有

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 768, 576, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, buffer); 

方法的評論執行,並沒有發生內存泄漏。此外,我嘗試使用drawPixels方法,這也幫助,但我認爲使用紋理是去這裏的方式,而不是棄用drawPixels方法。

我該如何解決內存泄漏問題?另外,還有哪些其他高效的方法可以每40ms在場景中顯示新紋理。延遲很關鍵。

+1

是否有任何理由讓您在每個框架中生成新紋理,而不僅僅是上傳新數據?另外,您並未刪除舊紋理。由於舊的紋理保留在內存中,內存增加並不奇怪。 – BDL

+0

渲染每個幀後使用相同的texID和刪除紋理似乎有幫助。這是一條路嗎?編輯:其實,只使用0作爲tex ID,甚至沒有刪除紋理幫助。 – lichoniespi

回答

1

此調用似乎是一個問題

glBindTexture(GL_TEXTURE_2D, glGenTextures()); 

由於即時通訊只是使用單個紋理的呼叫可以被替換爲

防止的OpenGL從創建新的紋理每個呼叫。