2017-02-17 30 views
0

OpenGLを使用してビデオストリームをレンダリングする予定です。glTexImage2Dがメモリリークの原因となる

ビデオの最初のフレームを受信した後の最初の手順は、直接バイトバッファを割り当てて、その中にすべてのフレームフラグメントを配置することです。 ByteBufferは1回だけ割り当てられます。

directBuffer = ByteBuffer.allocateDirect(frameSize * fragmentCount);

すべてのフレームフラグメントが整備されている場合は、メインのシーンループにおけるブロッキングキューは準備ができてフレームを待って、その後、レンダリングされ

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

、私は、OpenGLレンダラへのByteBufferを渡していますシーン。

ByteBuffer frame = framesQueue.take();

、それが実行されるとその後イムシーンにテクスチャクワッドを描画する準備ができてイム、

  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を使用し、各フレームをレンダリングした後でテクスチャを削除することは助けになったようです。それは行く方法ですか?編集:実際には、ちょうどテクスチャIDとして0を使用しても、テクスチャをdeltingせずに助けた。 – lichoniespi

答えて

1

この呼び出しはちょうど新しいテクスチャに各呼び出しの作成からOpenGLを防ぐ呼び出しが

と交換することができる単一のテクスチャを使用してイムので

glBindTexture(GL_TEXTURE_2D, glGenTextures()); 

問題であるように思われました。

関連する問題