簡體   English   中英

可變結構作為成員變量以提高序列化/JSON 生成的性能

[英]Mutable structs as member variables for performance in Serialization/JSON Generation

我試圖閱讀為什么可變結構是邪惡的,這是之前發布在這里的。

為什么可變結構是“邪惡的”?

但我的帖子更多的是關於一個特定的場景。

鑒於以下場景

我想要一個小而快速的序列化“數據類”,以加快我的保存/加載機制

我有一個可以在 Unity 編輯器中使用的 Player 類。 這個 Player 類有一個名為“Stats”的成員變量,它是一個結構體。

public class Player : MonoBehaviour
{
    public PlayerStats Stats;
}

您可以在下面看到我用作“數據類”的 System.Serializable 結構

[System.Serializable]
public struct PlayerStats
{
   public uint Speed;

   public void SetSpeed(uint speed)
   {
      this.Speed = Math.clamp(speed, Rules.MinSpeed, Rules.MaxSpeed);
   }
}

所以稍后為了防止我在序列化我使用的 MonoBehaviour 時遇到的開銷

JsonUtility.ToJson(player.Stats)

現在我的問題是,如果我在代碼中的任何地方使用 SetSpeed 來修改結構內的值

player.Stats.SetSpeed(3);

這是否會導致生成結構的副本,因為值正在被修改?

任何澄清都會很棒。

不,更改結構中字段的值不會導致復制。 當將結構分配給另一個變量時,會生成副本。 SetSpeed 是一個成員函數,沒有結構參數,因此不會導致復制。

例如,您在這里調用一個方法:

JsonUtility.ToJson(playerDTO.Stats);

這將導致創建結構的副本並將其分配給函數內部的參數,無論您稍后是否調用 SetSpeed。 在此調用之后您對playerDTO任何更改都不會更改 ToJson 函數內的本地副本。

也許在您的情況下,這不是問題(在許多情況下)。 在其他情況下,人們可以在實際想要通過引用傳遞某些內容時使用結構,在這種情況下,他們將無法獲得他們想要的行為。

僅作為更好理解的示例

// obviously creates a new Stats instance
player.Stats = new Stats();

// only changes the value inside the instance - no copy
player.Stats.Speed = 3;

// A new copy
var states = player.Stats;

// Creates and passes a COPY to the method 
JsonUtility.ToJson(player.Stats)

// again no copy
player.Stats.SetSpeed(3);

只是為了提供一個眾所周知的struct類型的例子;)

// stores a COPY 
var position = transform.position;

// only changes a value - no copy
position.x = 4;

// normalizes the instance itself - no copy
position.Normalize();

// Assigns a COPY
transform.position = position;

暫無
暫無

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

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