只要程序員足夠強,一個遊戲是否能無限多核優化?如果不是,瓶頸在哪裡?

假定條件:

操作系統設定為win10;

內存無限大

顯卡性能無限大

硬體之間數據傳輸速度無限大

硬體緩存之間延遲為0

CPU單核最高4GHz,核心數無限多

在以上條件下,如果程序員能力足夠強大,能否把一個遊戲優化的很好,做到幀數1000幀以上?比如文明這種後期很吃CPU的遊戲

如果不行,具體瓶頸在哪裡?


理論上取決於遊戲中serial execution的比重。

根據Amdahl"s Law,一個程序並行化後的速度提升是1/(1-p+p/s),其中p是可以並行化的比重,s是處理器數量。那麼顯然速度提升的上界就是1/(1-p),也就是s趨近於無窮的時候。假設並行部分是90%,那麼理論上核心數量再多最大的速度提升也只有10倍。


一個女人可以花 10 個月生出一個孩子,但是 10 個女人並不能在一個月就生出一個孩子

---《程序員的自我修養》之論多核CPU的局限性.

另外再多說幾句,多核也不是獨立計算的,而是由CPU0負責調度,CPU0的能力是有限的,所以無限多核本來就是個偽命題.

樓上說可以實現的,你們有木有考慮過CPU0的感受→_→

當然某些祖傳單核引擎不在討論範圍之內.


no,你泡麵前總得煮開水


這麼說吧,不是所有的程序都像修公路,可以分段同時鋪開快速建成。很多程序像蓋樓,要一層一層往上蓋,不能一樓和五樓同時蓋。


並發操作越多則程序整體越難操控,所以瓶頸還是在於人。

另外題主想多了,一個人是沒辦法短時間內搞定遊戲開發UI設計遊戲策劃整體架構的。


瓶頸是引擎

比如老版本unity,只能雙線程,程序猿再吊,還是只能雙線程

記住下面這句話:

優化上限看引擎,優化下限看製作

程序猿再666666,也只能到引擎極限。引擎再666666,也必須看程序猿水平。


不考慮題主那些無限大的東西,我感覺題主希望知道的是,並行計算里的一些東西.

舉一個簡單的例子,矩陣相乘(不妨設是n*n的矩陣).

單核運行,需要大概n3倍的時間(用時間複雜度來講就是O(n3),這裡的單位時間不妨設為cpu計算一次的時間).

n個核並行運行,需要大概n2倍的時間

n2個核並行運行,需要大概n倍的時間

n3個核並行運行,需要大概logn倍的時間

關鍵就在這裡,增多n倍的核,不一定能讓開銷時間減到原本的1/n.

即使我們繼續加核,加到n4,n5..依然需要logn倍的時間才能完成矩陣相乘的操作.

再來一個更簡單的例子,求一列數字的和(不妨設這列數字有n個數).

單核運行,需要n倍的時間

2個核並行運行,這列數字分成2段,每個cpu各自計算一段,然後把結果加起來,一共需要n/2+1的時間

4個核並行運行,每個cpu各自計算一段,然後cpu0的結果和cpu1的結果加起來,同時cpu2和cpu3加起來,之後兩個結果又要再加起來,一共需要n/4+2的時間

8個核並行運行,每個cpu各自計算一段,得到8個結果-&>兩兩合併-&>4個結果-&>2個結果-&>1個結果,一共需要n/8+3的時間

n個核運行,需要?

1個單位時間?

不存在的.


首先我們討論一下假設。

①Windows 10 目前有 32 位和 64 位版本,假設你使用的是 64 位版本,那麼,雖然理論上 64 位元操作系統支持高達 16 EB 的內存,但 Windows 10 似乎只支持 2 TB 內存。即使內存無限大,Windows 目前也只能識別並利用 2 TB。

②有關傳輸速度,既然是無限大,想必是超距作用,最可能的情況就是這台機器是量子計算機,利用基本粒子糾纏來進行計算。那麼,這個量子計算機的驅動該怎麼寫呢?怎麼建造一塊顯示屏顯示《文明》的畫面呢(而且按照題主要求,刷新率要達到 1000 Hz)?恐怕目前的科技還很難做到。

③幸虧題主沒有說無限顆 CPU,因為 Windows 10 並不支持那麼多顆 CPU,不過似乎沒有對核心數的限制。可是,為什麼核心數都無限了,頻率還僅僅是 4.0 GHz 呢?此外,既然顯卡性能為無限大,那麼主程序修改一下策略,在你點擊「下個回合」的時候,給你渲染一張簡單的動態圖,上面寫「正在計算電腦的行動」,別說 1000 幀了,一百萬幀都夠。

那麼無視這些問題,我們假設微軟推出了量子計算機可用的 Windows 10(畢竟微軟說要一直 Windows 10 下去),解決了這個 Windows 10 對 DirectX 遊戲的兼容性問題(顯卡可絕對和現有的不一樣,有勞微軟的工程師們寫一個量子計算機可用的標準驅動程序了!),那麼我想即使是《文明》,就算不做任何優化,也能跑到……我無法對量子計算機的算力進行判斷,不過少說也在 10^5 幀以上吧。更何況題主規定了主頻為 4 GHz,核數為無限大……

所以結論就是,瓶頸在微軟的工程師那兒……sigh。

另外,觀察者效應決定了你玩遊戲的過程中也不可避免地會影響量子計算機,對於《文明》這種回合制遊戲還好,即時制就根本沒法玩了,你看一眼戰況就可能變了………

(上面這些都是我胡扯的)

——————————

正經一點。如果開發商願意為一台特定的電腦做優化的話,是能很充分地釋放其潛力的,遊戲機便是如此。可是誰會做這種回報—投資比近似為 0 的事呢?題主給 Firaxis 開工資嗎……


瓶頸自然是在軟體啊,充分利用多核的前提是計算本身能夠並行化,且運算過程中盡量少涉及共享的數據和資源。比如運算是有依賴關係的,下一次運算依賴上一次的結果,就只能串列了。其實現在很多程序單核優化都沒做好,更不用說多核了。。。


當然可以。有無限的內存我可以預計算很多耗時的操作,有無限的內核我可以把任務拆分到足夠細,一個像素對應一個內核來渲染,不要說1000fps,100w fps都沒問題。程序也不難寫。

但你說的每種條件在現實中都不可能實現,所以不要白日做夢了。


不行,你做遊戲,總會有被串列效率限制的地方。

以暗黑3為例,之前在貼吧看到一個帖子就是顯示了當你對空地放技能再多也不卡,但是打怪技能多就特別卡。 背後的原因就是計算對怪物傷害之間有互相依賴的關係,例如你打一個怪,你要先計算觸發了什麼技能效果,然後怪與怪之間還有互相作用的效果(範圍傷害神馬的),那麼你必須先計算在一個怪身上的傷害,再計算這個怪對下一個怪的影響。這樣計算之間就有串列依賴了。

當然你可以通過修改遊戲的邏輯來使得這些依賴減少,例如取消這種互相作用的機制,或者簡化這種機制(例如只有第一個怪會觸發範圍傷害,實際上暴雪是這麼做的)。但是這樣遊戲的機制就變少了。


你讓無限多的人來處理一件事情試試,你需要無限多的時間去分配和管理這些人。


程序員沒法把任意遊戲多核性能優化到1000幀。複雜工程有邊際收益遞減。但是程序員可以從機制上做需要無限多核性能的遊戲。比如《缺氧》《我的世界》這樣的沙盤遊戲。有多少cpu和內存就有多大的虛擬世界,需求可以做到無上限。


首先,程序員不可能足夠強

其次影響性能的決定因素可能是產品經理決定的,畢竟再牛逼的設計和實現都是給業務服務的嘛


用fpga運行遊戲,門級並行


關於這個問題,我想邀請華為麒麟的工程師來回答


不行

並行化並不是一個平凡的演算法問題


1,你指定的具體目標,比如1000幀,可以達到,參考 加速定理

2,存在瓶頸,參考 時間分層定理

以上兩個都在計算複雜度理論中有描述


這種無限理想配置你竟然拿來玩遊戲

超級計算機都達不到


不能,電腦即使有無限核,但是程序運行的時候來的線程是有限的,不可能用兩個核心去處理一個線程,而遊戲撐死每個單位,每個畫面細節都有一個線程,而這些線程的信息必須最後匯總到幾個線程中去處理,不這樣做的話很容易導致遊戲bug,除非編程的不是人類是人工智慧,否則一定會這樣因為編程是團隊的事,你不能保證請幾十個開發每個智商都180而且想問題的方式完全一樣。

所以杰倫是,人類程序員不可能無限的優化一個程序,起碼以我目前的編程水平想不到這種可能性。


推薦閱讀:

集成電路專業有哪些專業課程和教材?
我國處理器公司分幾個派系?
為什麼時至今日還有這麼多人糾結於CPU指令集?
為什麼32位處理器用x86而不是x32?
Intle緣何輸給了ARM?

TAG:電腦遊戲 | 程序員 | MicrosoftWindows | 中央處理器CPU | 計算機體系架構 |