0

我遇到的问题是,在 Linux 上运行并占用 100% 的 CPU 时,单个 gl.glTexSubImage2D() 调用的执行时间需要 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() 的变体。一种是使用数据 ptr 上传到 pbo,然后再上传到 GPU,另一种是在已经准备好的 pbo 中偏移。我的错误是我上传了两次数据,这不知何故导致了 linux 的严重减速。

So the fix is to upload data to pbo and then upload it to GPU with gl.glTexSubImage2D() using offset inside pbo.

于 2012-11-10T12:28:52.637 回答