2012-12-06 121 views
4

我正在研究爲Windows Phone和Windows 8 RT製作遊戲。遊戲的第一次迭代將使用XNA作爲用戶界面。XNA,矢量數學和GPU

但因爲我計劃有可能不使用XNA其他迭代的,我寫在便攜式類庫我的核心遊戲邏輯。

我已經得到了到我在哪裏在覈心遊戲邏輯計算矢量數學(子畫面的位置)的一部分。

當我搞清楚了這一點,我有一個同事告訴我,我應該確保我的GPU(而不是CPU)做這些計算。

所以,這裏是一個問題,如果我使用XNA矢量庫做我的矢量計算,都將自動在GPU上做了什麼?

邊問:如果不是,它們應當在GPU上做了什麼?或者我可以在我的Portable Class Library中執行它們並讓CPU運行它們嗎?

注意:如果我需要讓XNA執行它們以便我可以使用GPU,那麼從XNA將這些功能注入到我的核心邏輯中並不困難。我只想知道這是不是我應該做的。

注二:我的遊戲是一款2D遊戲。它將計算壞人和射彈沿着矢量的運動。 (這意味着這不是一個巨大的3D遊戲。)

+0

偏離主題,但我認爲XNA正在走出門外。我建議尋找MonoGame的便攜性和更好的未來前景。 –

+1

@AdamHouldsworth - 我打算轉到MonoGame。我聽說從XNA移植到Monogame是非常容易的。所以我想我從XNA開始,然後移植它。 – Vaccano

+0

假設你的PCL從XNA的Vector2類開始(這是一個很好的開始,因爲它非常強大)。 Vector2是一個由2個浮點組成的結構。據我所知,它的方法都是CIL。如果你不是在開發一個「巨大的3D遊戲」,那麼你的同事在將vector2計算移到GPU中看到了什麼好處?您必須在HLSL(.NET)或DirectX或OpenGL中編寫自己的接口到GPU,這聽起來很耗時。我認爲也許你的同事搞了一些錯誤的優化。 –

回答

5

我認爲你的同事是錯誤的。下面是在GPU上進行這種計算的兩個原因沒有意義:

第一個原因,非常大的一個原因是,將數據導入GPU中並不便宜第一名。然後它是極其昂貴的從GPU獲取數據返回

#2的原因是GPU好做並行計算 - 那就是 - 它確實對數據的相同操作。你將要做的矢量操作的種類有很多不同操作,上一個中小型數據量。

因此,如果 - 說 - 你正在GPU上做一個粒子系統,那麼你會得到一個巨大的勝利。這是大量的同類數據,您可以在每個粒子上執行相同的操作,並且所有數據都可以存在於GPU上。

即使XNA的內置SpriteBatch它的大部分每精靈工作在CPU上(除最終的整體矩陣轉換外)。雖然它可以在GPU上進行每個精靈轉換(我認爲它已經用於XNA 3),但它並沒有。這使得它可以減少發送GPU所需的數據量(性能優勢),並使其更加靈活 - 因爲它使頂點着色器免費供您自己使用。

這些是使用CPU的重要原因。我會說,如果它的XNA團隊不夠好 - 這是配不上你:)


現在,我認爲你的同事可能意味着 - 而不是GPU - 是做使用SIMD指令的矢量數學(在CPU上)。

這些給你一個表現勝利。例如 - 添加矢量通常需要添加X組件,然後添加Y組件。使用SIMD允許CPU同時添加兩個組件。

不幸的是,微軟的.NET運行時目前沒有(使用這種)SIMD指令。不過,這是supported in Mono

1

所以,這裏是一個問題,如果我使用XNA矢量庫來做矢量計算,它們是否會自動在GPU上完成?

使用ILSpy查看XNA中的Vector類,發現XNA Vector庫不使用圖形卡作爲向量數學。