簡體   English   中英

在多個線程中使用相同的OpenGL上下文

[英]Using the same OpenGL context in multiple threads

我有一個單獨的渲染線程,在該線程中,渲染器連續迭代這樣的可繪制列表(Java):

synchronized (renderingLock) {
  Iterator<DrawableObject> i = listOfDrawables.iterator();

  while (i.hasNext()) {
    draw(i.next());                          // OpenGL calls are inside
  }
}

然后,如果在某個時候我需要更改可繪制列表,我將啟動一個新線程,該線程將執行以下操作(簡化):

synchronized (renderingLock) {
  unloadFromVideoMemory(someUnusedDrawable); // OpenGL calls are inside
  loadIntoVideoMemory(newDrawable);          // OpenGL calls are inside

  listOfDrawables.add(newDrawable);
  listOfDrawables.remove(someUnusedDrawable);
}

但這是用OpenGL Wiki寫的:

為了使任何OpenGL命令都能正常工作,上下文必須是最新的。 所有OpenGL命令都會影響當前上下文的狀態。 當前上下文是線程局部變量,因此單個進程可以具有多個線程,每個線程都有自己的當前上下文。 但是,單個上下文不能同時存在於多個線程中。

那么,當調用同步時,從不同線程調用同一OpenGL上下文是否安全? 在Android(Java)上,這似乎可以正常工作,但是跨平台和/或本機代碼又如何呢? 如果我開始在一個線程中進行OpenGL調用,然后繼續在另一個線程中進行調用,是否必須在此新線程中顯式使上下文成為當前上下文?

將OpenGL視為UI線程。

OpenGL的所有命令必須在OpenGL線程上完成。

轉到上下文,到OpenGL上下文的所有命令必須在使用該上下文初始化的線程上完成。

考慮到您正在使用Java,本機實現很有可能會為您帶來某種魔術效果,因此即使您看起來確實不在從不同的線程調用相同的上下文。

如果您實際上在不同的線程上使用相同的上下文,則可能會麻煩,無論是否同步:)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM