2 回答

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
最大的問(wèn)題不是性能 - 而是正確性。以這種方式使用靜態(tài)字段會(huì)改變含義,并可能導(dǎo)致以下任一方面的大問(wèn)題:
多個(gè)線程訪問(wèn)相同的靜態(tài)值并在進(jìn)程中互相踩踏
作為一種特殊情況,這不僅可能導(dǎo)致意外的值,而且還可能導(dǎo)致“撕裂”值,因?yàn)槟岬搅诉^(guò)大的結(jié)構(gòu),例如
Vector3
任何需要重入的東西;調(diào)用堆棧中的每個(gè)方法都會(huì)忽略該值,而不考慮任何預(yù)期的行為
基本上:除非你有很好的理由,否則不要這樣做(即不要濫用臨時(shí)本地變量的靜態(tài)字段);請(qǐng)改用常規(guī)局部變量。
性能上有什么區(qū)別嗎
就速度而言,幾乎肯定不是,但你必須使用 benchmarkdotnet 之類的東西來(lái)衡量它
在我看來(lái),尤其是內(nèi)存分配和垃圾收集
通過(guò)將值放入靜態(tài)字段,您可以通過(guò)該值使任何對(duì)象可達(dá):可達(dá)。如果您從不清除該字段,它可能會(huì)不必要地使任意大的對(duì)象圖保持活動(dòng)狀態(tài)。

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
我傾向于同意 Marc Gravell 的主要概念,但我認(rèn)為他的答案更多地與 C# 相關(guān),而不是與 Unity 相關(guān)。
是的。我同意 C# 明智地將靜態(tài)值與線程混合可能會(huì)產(chǎn)生問(wèn)題......
但在您的特定情況下,OnTriggerEnter
可以僅在主線程上運(yùn)行(例如許多其他與統(tǒng)一相關(guān)的方法),因此您沒(méi)有這樣的風(fēng)險(xiǎn)(除非您開(kāi)始在方法之外使用這些字段OnTriggerEnter
)。
無(wú)論如何,情況是這樣的:
速度性能
參考文獻(xiàn)類型
無(wú)論如何,參考值都會(huì)存在于堆中。從速度方面來(lái)說(shuō),最好將它們保持靜態(tài),否則它們將繼續(xù)從堆中分配/取消分配。
價(jià)值類型
對(duì)于值類型則是另一回事了。如果它們是靜態(tài)的,您將把它們永久存儲(chǔ)在堆上(幾乎在所有情況下),而本地值類型將存在于堆棧中(壽命相當(dāng)短......)
如果您將它們作為靜態(tài)放在堆上,我預(yù)計(jì),一般來(lái)說(shuō),您將需要更多時(shí)間來(lái)訪問(wèn)它們
如果將它們分配在堆棧中(作為本地值),速度會(huì)快得多
內(nèi)存性能
對(duì)于值類型,最好將它們分配在堆棧中(以及本地值)。
內(nèi)存方面,引用類型也應(yīng)該比本地值更好。您可以根據(jù)需要將它們保留在內(nèi)存中。正如馬克所解釋的,使用靜態(tài)字段,您可以將它們無(wú)限期地保留在內(nèi)存中。
值類型肯定比本地值更好。引用類型在速度方面比靜態(tài)的性能更高,但在內(nèi)存方面比本地的性能更高。
一般來(lái)說(shuō),在您的具體情況下,即使是大量呼叫,我也沒(méi)有看到任何大的變化。
您仍然可以嘗試使用Unity 基準(zhǔn)測(cè)試工具對(duì)其進(jìn)行基準(zhǔn)測(cè)試(因?yàn)锽enchmarkDotNet不適用于開(kāi)箱即用的 Unity)。
就我而言...
我會(huì)使用本地值,更具可讀性。
- 2 回答
- 0 關(guān)注
- 152 瀏覽
添加回答
舉報(bào)