0

私は、単一の gl.glTexSubImage2D() 呼び出しの実行時間が Linux で実行され、CPU の 100% を消費しているときに 0.1 ~ 0.2 秒かかるという問題に直面しました。Mac ではすべて問題ありません。

呼び出し引数は次のとおりです。

gl.glTexSubImage2D(GL.GL_TEXTURE_2D, 0, 0, 0, 1920, 1080, GL2.GL_RED, GL2.GL_UNSIGNED_SHORT, data);

テクスチャの設定は次のとおりです。

void glCreateClearTex(GL gl, int target, int fmt, int format, int type, int filter, int w, int h, int val) {
    float fval = 0;
    int stride;
    if (w == 0)
        w = 1;
    if (h == 0)
        h = 1;
    stride = 2/*2048*/ * 2;
    ByteBuffer init = ByteBuffer.allocateDirect(stride * h/*2048*/);
    glAdjustAlignment(gl, stride);
    gl.glPixelStorei(GL2.GL_UNPACK_ROW_LENGTH, w);
    gl.glTexImage2D(target, 0, fmt, w, h, 0, format, type, init);
    gl.glTexParameterf(target, GL2.GL_TEXTURE_PRIORITY, 1.0f);
    gl.glTexParameteri(target, GL2.GL_TEXTURE_MIN_FILTER, GL2.GL_LINEAR);
    gl.glTexParameteri(target, GL2.GL_TEXTURE_MAG_FILTER, GL2.GL_LINEAR);
    gl.glTexParameteri(target, GL2.GL_TEXTURE_WRAP_S, GL2.GL_CLAMP_TO_EDGE);
    gl.glTexParameteri(target, GL2.GL_TEXTURE_WRAP_T, GL2.GL_CLAMP_TO_EDGE);
    gl.glTexParameterfv(target, GL2.GL_TEXTURE_BORDER_COLOR, FloatBuffer.wrap(new float[] { fval, fval, fval, fval }));
}

同じ作業をネイティブで行う Mplayer は問題なく動作します。glxgears は正常に動作しますが、100% 使用します。これは、OpenGL のセットアップの問題の兆候かもしれませんが、glxinfo などはハードウェア レンダリングであると報告しています。グラフィック カードは ATI FirePro です。

4

1 に答える 1

0

問題が見つかりました。Jogl には、gl.glTexSubImage2D() の 2 つのバリアントがあります。1 つはデータ ptr を使用して pbo にアップロードし、後で GPU にアップロードします。もう 1 つは、準備済みの pbo 内のオフセットです。私の間違いは、データを 2 回アップロードしたことでした。これにより、何らかの形で Linux の速度が大幅に低下しました。

したがって、修正は、データを pbo にアップロードしてから、gl.glTexSubImage2D() で pbo 内のオフセットを使用して GPU にアップロードすることです。

于 2012-11-10T12:28:52.637 に答える