[英]Static - Good or Bad?
好吧,所以我一直試圖弄清楚這個問題已經太久了。
我讀過無數關於static
和單身的文章/問題。
這就是我一直使用靜態的一段時間:
我有一個GameManager.cs,它有TileMap.cs和Player.cs。 TileMap.cs需要訪問玩家的相機,以更新地圖的位置:
GameManager.cs:
public static TileMap map;
public static Player player;
Update code, draw, etc. below...
每個都只有一個。
TileMap.cs:
Vector2 mapPosition = new Vector2(GameManager.Player.position.X, GameManager.Player.position.Y);
這可以接受嗎? 這有什么缺點?
編輯:看到這個問題太寬泛,讓我看看我是否可以更具體。
有沒有比通過靜態方法更好的方法呢? 我在TileMap.cs中有多個類列表,其中一些列表中有列表(主要考慮我的粒子引擎),因此Update(Player player)
會更高效,還是不重要?
PS,我注意到當玩家移動游戲地圖時會出現“緊張”(滯后一小段時間)。 這會導致它嗎?
謝謝,
Shyy
正如您在詢問缺點:
1)使用多線程涉及的static
變量的代碼嗎? 如果是,您可以考慮鎖定管理。 這很容易使代碼變得容易復雜。
2) Player
, position
和其他結構? 如果是這樣,每次通過屬性訪問它們時,都會創建實例的副本,而不是直接訪問引用。 考慮到代碼提供了一些2D
引擎,並且您正在創建一個Vector
,所以可能是一些渲染管道代碼,這可能會帶來一些嚴重的性能影響。
我經常在專業上注意到類似的問題。 所以,讓我給你一個直接的答案,我很清楚,它不適用於一般情況。 將其視為我認為“初學者最佳實踐”的觀點。
static
通常用於使變量在類邊界上可用,如果它們是單例的話。 這里的單例模式只是一個設計模式包裝器(它不能解決大多數問題)。 雖然這可能使程序更容易編寫,但如果要使應用程序具有多線程,使用static
也可以使程序更加復雜。
因此,一般來說,我認為避免全部使用static
並簡單地傳遞對象是個好主意。
有一個例外,即:如果需要跨線程邊界可訪問的數據。 如果是這種情況,你很快就會發現自己處於一個受傷的世界,最好盡可能多地學習鎖定並將其用於所有靜態變量(包括它們的成員,如果它們是結構/類!) 。
如果這還不夠好,你可以繼續沿着這條路走下去,了解互鎖和記憶障礙等事情(但如果你不需要,我不建議這樣做)。
幸運的是,大多數應用程序都足夠快,可以在單個線程中工作。 我想你的應用程序也不例外(並且你可以使用標准的游戲框架來完成應用程序的多線程部分 - PS:如果是這樣,也要小心類變量,因為它們可能會通過線程傳遞邊界也是如此)。
關於你的滯后:我認為你應該使用一個好的剖析器來找到性能熱點; 它可能與static
的使用無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.