簡體   English   中英

靜態 - 好還是壞?

[英]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) Playerposition和其他結構? 如果是這樣,每次通過屬性訪問它們時,都會創建實例的副本,而不是直接訪問引用。 考慮到代碼提供了一些2D引擎,並且您正在創建一個Vector ,所以可能是一些渲染管道代碼,這可能會帶來一些嚴重的性能影響。

我經常在專業上注意到類似的問題。 所以,讓我給你一個直接的答案,我很清楚,它不適用於一般情況。 將其視為我認為“初學者最佳實踐”的觀點。

static通常用於使變量在類邊界上可用,如果它們是單例的話。 這里的單例模式只是一個設計模式包裝器(它不能解決大多數問題)。 雖然這可能使程序更容易編寫,但如果要使應用程序具有多線程,使用static也可以使程序更加復雜。

因此,一般來說,我認為避免全部使用static並簡單地傳遞對象是個好主意。

有一個例外,即:如果需要跨線程邊界可訪問的數據。 如果是這種情況,你很快就會發現自己處於一個受傷的世界,最好盡可能多地學習鎖定並將其用於所有靜態變量(包括它們的成員,如果它們是結構/類!) 。

如果這還不夠好,你可以繼續沿着這條路走下去,了解互鎖和記憶障礙等事情(但如果你不需要,我不建議這樣做)。

幸運的是,大多數應用程序都足夠快,可以在單個線程中工作。 我想你的應用程序也不例外(並且你可以使用標准的游戲框架來完成應用程序的多線程部分 - PS:如果是這樣,也要小心類變量,因為它們可能會通過線程傳遞邊界也是如此)。

關於你的滯后:我認為你應該使用一個好的剖析器來找到性能熱點; 它可能與static的使用無關。

暫無
暫無

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

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