我有一个访问OpenGL上下文的应用程序。我在2个操作系统上运行它:
1.Kubuntu 13.4
2.Ubuntu 12.4
我遇到了以下问题:在OS 1上设置上下文需要大约60 ms,而在OS 2上则需要10倍以上。两个操作系统都使用驱动程序版本为319的Nvidia GPU。它似乎也是OpenGL API调用对于OS 2来说一般都比较慢。上下文是屏幕外的。目前我不知道是什么原因导致它。我的问题是这样的开销有什么可能来源?X11设置?或者可能是操作系统级别的东西?
另一个区别是OS 1使用Nvidia GTX680而OS2使用Nvidia GRID K1卡。OS2也驻留在服务器上,延迟测试在该机器上本地运行。
更新
这是造成大部分开销的部分:
typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
typedef Bool (*glXMakeContextCurrentARBProc)(Display*, GLXDrawable, GLXDrawable, GLXContext);
static glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0;
static glXMakeContextCurrentARBProc glXMakeContextCurrentARB = 0;
int main(int argc, const char* argv[]){
static int visual_attribs[] = {
None
};
int context_attribs[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 0,
None
};
Display* dpy = XOpenDisplay(0);
int fbcount = 0;
GLXFBConfig* fbc = NULL;
GLXContext ctx;
GLXPbuffer pbuf;
/* open display */
if ( ! (dpy = XOpenDisplay(0)) ){
fprintf(stderr, "Failed to open display\n");
exit(1);
}
/* get framebuffer configs, any is usable (might want to add proper attribs) */
if ( !(fbc = glXChooseFBConfig(dpy, DefaultScreen(dpy), visual_attribs, &fbcount) ) ){
fprintf(stderr, "Failed to get FBConfig\n");
exit(1);
}
/* get the required extensions */
glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddressARB( (const GLubyte *) "glXCreateContextAttribsARB");
glXMakeContextCurrentARB = (glXMakeContextCurrentARBProc)glXGetProcAddressARB( (const GLubyte *) "glXMakeContextCurrent");
if ( !(glXCreateContextAttribsARB && glXMakeContextCurrentARB) ){
fprintf(stderr, "missing support for GLX_ARB_create_context\n");
XFree(fbc);
exit(1);
}
/* create a context using glXCreateContextAttribsARB */
if ( !( ctx = glXCreateContextAttribsARB(dpy, fbc[0], 0, True, context_attribs)) ){
fprintf(stderr, "Failed to create opengl context\n");
XFree(fbc);
exit(1);
}
/* create temporary pbuffer */
int pbuffer_attribs[] = {
GLX_PBUFFER_WIDTH, 800,
GLX_PBUFFER_HEIGHT, 600,
None
};
pbuf = glXCreatePbuffer(dpy, fbc[0], pbuffer_attribs);
XFree(fbc);
XSync(dpy, False);
/* try to make it the current context */
if ( !glXMakeContextCurrent(dpy, pbuf, pbuf, ctx) ){
/* some drivers does not support context without default framebuffer, so fallback on
* using the default window.
*/
if ( !glXMakeContextCurrent(dpy, DefaultRootWindow(dpy), DefaultRootWindow(dpy), ctx) ){
fprintf(stderr, "failed to make current\n");
exit(1);
}
}
/* try it out */
printf("vendor: %s\n", (const char*)glGetString(GL_VENDOR));
return 0;
}
具体来说,行:
pbuf = glXCreatePbuffer(dpy, fbc[0], pbuffer_attribs);
其中创建虚拟pbuffer是最慢的。如果其余的函数调用平均需要2-4 ms,则此调用在OS 1上需要40 ms。现在,在OS2上(这很慢),pbuffer创建需要700ms !我希望现在我的问题看起来更清楚了。
答案 0 :(得分:0)
你绝对确定“OS2”已经正确设置了驱动程序并且没有回到SW OpenGL(Mesa)渲染上吗? glxgears报告每个系统的帧速率是多少?
我注意到Ubuntu 12.4于2012年4月发布,而我相信NVidia的“GRID”技术甚至在2012年5月GTC之前都没有公布,而且我认为卡片直到2013年才出现(见relevant Nvidia press releases)。因此,与Ubuntu 12.4一起提供的Nvidia驱动程序似乎不太可能支持网格卡(除非您已经使用Nvidia最近的驱动程序版本进行了一些升级工作?)。
您可以在/usr/share/doc/nvidia-glx/README.txt.gz
的附录A“支持的NVIDIA GPU产品”中查看支持的硬件列表(至少在我的Debian计算机上存在此有用信息的位置)。