我遇到过这样的问题:单个gl.glTexSubImage2D()调用的执行时间在Linux上运行并占用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 }));
}
Mplayer本身做同样的工作运行得很好。 glxgears运行正常但也占用了100%。这可能是OpenGL设置问题的标志,但glxinfo和其他人报告说它是hw渲染。显卡是ATI FirePro。
答案 0 :(得分:0)
我发现了这个问题。 Jogl有两个gl.glTexSubImage2D()变体。一个是使用数据ptr上传到pbo,后来又上传到GPU,另一个是 - 已经准备好的pbo内部偏移。我的错误是我上传了两次数据,这在某种程度上导致了linux的大幅减速。
所以解决方法是将数据上传到pbo,然后使用gl.glTexSubImage2D()使用pbo中的偏移量将其上传到GPU。