2011-09-21 35 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

相關問題