2011-09-21 60 views
2

我正在试验多个OpenGL环境中的列表共享。这是一个很棒的功能,因为它允许我执行并行渲染线程。不同版本的多个上下文

但是由于我使用CreateContextAttribs,我提供了请求特定OpenGL实现的可能性。所以,可能会发生一些情况正在实施版本3.2+,而另一个正在实施版本2.1。

其实工作得很好,但我怀疑这种做法隐藏了一些副作用。什么是在使用不同版本的竞争对手时可能遇到的问题列表?

除此之外,我查询每个上下文版本的实现扩展,因为我认为不同的版本可以支持不同的扩展,是吗?那么函数指针呢?我必须为每个具有不同版本的上下文重新调整它们(实际上,指针根据版本而变化)?

回答

8

这是一个很棒的功能,因为它允许我执行并行渲染线程。

从多个线程并行访问GPU是一个严重的性能杀手。不要这样做。 GPU将在内部并行渲染任何渲染。你做的任何事情都是将原木扔进轮子。

如果您想加快资产上传速度,请查看缓冲区对象和异步访问。但是不要同时在单独的线程中执行多个OpenGL上下文。


但自从我使用CreateContextAttribs,我提供给请求特定的OpenGL实现的可能性。所以,可能会发生一些情况正在实施版本3.2+,而另一个正在实施版本2.1。

其实工作得很好,但我怀疑这种做法隐藏了一些副作用。什么是在使用不同版本的竞争对手时可能遇到的问题列表?

这实际上是一个很好的问题。而specification答案很清楚:

1) Can different GL context versions share data? 

    PROPOSED: Yes, with restrictions as defined by the supported feature 
    sets. For example, program and shader objects cannot be shared with 
    OpenGL 1.x contexts, which do not support them. 

    NOTE: When the new object model is introduced, sharing must be 
    established at creation time, since the object handle namespace is 
    also shared. wglShareLists would therefore fail if either context 
    parameter to it were to be a context supporting the new object 
    model. 

除此之外,我查询执行的一些推广为每个上下文的版本,因为我想,不同的版本可以支持不同的扩展,这是正确的?

事实上,查询每个上下文所支持的扩展集是正确的。

那么函数指针呢?我必须为每个具有不同版本的上下文重新调整它们(实际上,指针根据版本而变化)?

在Windows上,扩展函数指针绑定到上下文。理智的方式来做到这一点是有一些

typedef struct OpenGLExtFunctions_S { 
    GLvoid (*glFoobarEXT)(GLenum, ...); 
    /* OpenGL function pointers */ 
} OpenGLExtFunctions; 

/* currentContextFunction must be thread loacal since 
    contexts are active in one thread only */ 
__declspec(thread) OpenGLExtFunctions *currentContextFunctions; 

#define glFoobarEXT (currentContextFunctions->glFoobarEXT); 
#define ... 

,敷wglMakeCurrentwglMakeContextCurrent与设置currentContextFunctions指针方面正在取得电流一个一些辅助功能。像GLEW这样的扩展包装类库可以为你做所有这些繁琐的工作,所以你不必自己去做。

在X11/GLX上,事情要简单得多:由glXGetProcAddress返回的函数指针必须对所有上下文都是相同的,所以不需要切换它们。

+0

谢谢你的批评,但我发现着色器编译和纹理上传在不同的线程实际上执行“更快”(即不影响然后实际渲染的FPS)。而...真正的问题呢? – Luca

+0

@Luca Piccioni:Shader编译和纹理上传,这些是在单独的线程中真正有意义的两件事情,因为它们都没有实际限制GPU。着色器由CPU编译,纹理上传是双重过程,首先上传到CPU内存缓冲区,然后延迟上传到GPU内存。 – datenwolf

+0

我在这方面进行了实验。我的问题来自以下情况:由2.1上下文生成的着色器可以通过具有不同版本的上下文执行?我可以混合来自其他版本的不同着色器对象吗?除了这些情况之外,这个问题以更一般的方式发布。 – Luca

相关问题