Opengl JOGL glTexSubImage2D占用高达100%的cpu,而且耗时较长

Opengl JOGL glTexSubImage2D占用高达100%的cpu,而且耗时较长,opengl,jogl,Opengl,Jogl,我曾经遇到过这样一个问题,即在Linux上运行单个gl.glTexSubImage2D()调用并消耗100%的cpu时,执行时间需要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

我曾经遇到过这样一个问题,即在Linux上运行单个gl.glTexSubImage2D()调用并消耗100%的cpu时,执行时间需要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 }));
}
纹理设置如下所示:

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。

我发现了问题。Jogl有两个gl.glTexSubImage2D()的变体。一个是使用数据ptr上传到pbo,然后再上传到GPU,另一个是已经准备好的pbo内部的偏移量。我的错误是我上传了两次数据,这在某种程度上导致了linux上的严重减速

因此,修复方法是将数据上载到pbo,然后使用gl.glTexSubImage2D()将数据上载到GPU,使用pbo内部的偏移量