這是一個很棒的功能,因爲它允許我執行並行渲染線程。
從多個線程並行訪問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 ...
,敷wglMakeCurrent
和wglMakeContextCurrent
與設置currentContextFunctions
指針方面正在取得電流一個一些輔助功能。像GLEW這樣的擴展包裝類庫可以爲你做所有這些繁瑣的工作,所以你不必自己去做。
在X11/GLX上,事情要簡單得多:由glXGetProcAddress
返回的函數指針必須對所有上下文都是相同的,所以不需要切換它們。
謝謝你的批評,但我發現着色器編譯和紋理上傳在不同的線程實際上執行「更快」(即不影響然後實際渲染的FPS)。而...真正的問題呢? – Luca
@Luca Piccioni:Shader編譯和紋理上傳,這些是在單獨的線程中真正有意義的兩件事情,因爲它們都沒有實際限制GPU。着色器由CPU編譯,紋理上傳是雙重過程,首先上傳到CPU內存緩衝區,然後延遲上傳到GPU內存。 – datenwolf
我在這方面進行了實驗。我的問題來自以下情況:由2.1上下文生成的着色器可以通過具有不同版本的上下文執行?我可以混合來自其他版本的不同着色器對象嗎?除了這些情況之外,這個問題以更一般的方式發佈。 – Luca