簡體   English   中英

在opengl游戲循環中如何使用雙核?

[英]How is it possible to use dual core in opengl game loop?

我的問題是關於opengl中的游戲循環設計。

我相信游戲循環可以通過3個主要步驟完成

  1. 接受輸入-它可能來自用戶單擊屏幕或系統警報或其他任何事件。
  2. 做邏輯
  3. 更新視圖

為簡單起見,我們只關注第2步和第3步。

我認為以並行順序運行它們或將它們混合到一個步驟中是錯誤的。 我舉一個例子。

老兄說,您正在創建一個戰爭游戲,您需要在屏幕上繪制100名戰士,邏輯將是更新其位置,更新背景區域,然后繪制結果。 在更新另一位士兵的位置之前,您不能開始繪制一位士兵。

因此,根據這些簡單的步驟,很明顯,步驟2和3需要以某種方式進行同步,並且步驟2必須在步驟3之前完成。

現在告訴我,如何可能在一個以上線程和一個以上進程上運行游戲循環? opnegl是否使用multiCore? 怎么樣?

編輯:使用多線程的一種方法是預先計算游戲邏輯,或者換句話說,使用向量。 但是向量有兩個很大的缺點,使它們幾乎不被推薦使用。

  1. 有時您不希望更改向量,因此您進行了大量計算,因此您將不使用它們
  2. 在大多數情況下,您試圖達到60+ FPS,而游戲循環的平均時間為16毫秒,切換線程需要某種同步,從我看來,任何同步都不利於性能,甚至是簡單的Handler.post()在android中(僅將任務添加到隊列以在其他線程上運行)可能需要3毫秒(比您的幀速率時間多18%),因​​此除非您的計算花費更長的時間,否則不要這樣做! 到目前為止,我沒有發現花費這么多時間的東西。

現在告訴我如何在一個以上的線程上運行游戲循環

多核計算的思想是並行化,即將計算密集型任務拆分為可以並行處理的獨立工作集。 正如您發現的那樣,游戲的並行化空間極少。

在游戲中使用多個內核的通常方法是將I / O與邏輯操作並行化。 即在一個線程中進行所有網絡和用戶交互,在另一個線程中進行AI和場景管理。 聲音通常也被並行化。

OpenGL是否使用multiCore? 怎么樣?

OpenGL規范未指定。 但是某些實現可能選擇利用多個內核。 盡管這不太可能。 為什么? 因為這會產生不必要的緩存管理開銷。

我將嘗試以圖形方式進行解釋,為什么2個線程(一個用於渲染,一個用於邏輯)更好,並且不會導致不一致:

您建議的單線程設計將如下運行:

logic    |-----|     |-----|
graphics       |-----|     |-----| and so forth.

但是,如果您有多個cpus,則應該利用它們。 這意味着,在邏輯第一次完成后,圖形即可呈現該游戲狀態。 同時,可以計算下一個邏輯步驟:

logic    |-----||-----||-----|
graphics       |-----||-----|    and so forth.

如您所見,您幾乎可以通過這種方式將性能提高一倍:當然會有一些開銷,但是無論如何它都會比單線程版本更快。

此外,您可以假設游戲邏輯將比渲染線程花費更少的時間:這使線程變得相當容易,因為您可以在邏輯線程中等待從renderthread進行的回調,從而為渲染線程提供新的指令並然后計算下一個邏輯步驟。

暫無
暫無

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

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