统一性:PlayerPrefs 在内存和处理方面的统一性有多重

本文关键字:统一性 方面 PlayerPrefs 内存 处理 | 更新日期: 2023-09-27 17:56:40

我有一个2D游戏,其中我使用大约200种不同的PlayerPrefs将所有类型的数据存储为字符串和整数。我一直来回调用PlayerPrefs来设置或获取数据。我想知道它有多好?或者我应该切换到SQLite或Filing?我们的目标设备最大为 1GB 内存。数据示例:玩家 1 名称、玩家 1 分数、玩家 1Enery、玩家 1生命、玩家 1Hp、玩家 1级别 1 时间、玩家 1级别 1挑战 1 时间。我们是否为数十名玩家和其他一些偏好做了这件事。蒂亚

统一性:PlayerPrefs 在内存和处理方面的统一性有多重

通过阅读您的评论,您使用它的方式不会有PlayerPrefs问题。我看到的唯一问题是您单独保存每个玩家的数据属性。

数据示例:玩家 1 姓名、玩家 1 得分、玩家 1Enery、玩家 1 生命、 玩家 1Hp,玩家 1 级别 1 时间,玩家 1 级别 1挑战 1 时间。 我们是否为数十名玩家和其他几名玩家做过 偏好也是如此。蒂亚

如果您具有用户的许多属性,则这不是保存数据的正确方法。假设这是一个或两个变量,那么你可以,但你有超过 7 个变量 * 玩家数量(几十个)。

当您保存完数十个所有这些变量时,到处都会有注册表keys。您可以通过在保存玩家十几条信息后转到HKCU'Software[company name][product name] key来验证这一点。

将这些玩家信息放入一个类中,然后将其转换为 Json 并将其保存为一个信息数据。

球员数据:

[System.Serializable]
public class PlayerInfo
{
    public string playerName;
    public int playerScore;
    public int playerEnergy;
    public int playerLives;
    public int playerHP;
    public float playerLevelTimeTaken;
    public float playerLevelChallengeTimeTaken;
}

保存玩家信息

void savePlayerInfo()
{
    //Create one for player one
    PlayerInfo playerInfo1 = new PlayerInfo();
    playerInfo1.playerName = "Affan 1";
    //Create one for player two
    PlayerInfo playerInfo2 = new PlayerInfo();
    playerInfo2.playerName = "Affan 2";
    //Create one for player three
    PlayerInfo playerInfo3 = new PlayerInfo();
    playerInfo3.playerName = "Affan 3";
    //Convert each of them to Json
    string p1Json = JsonUtility.ToJson(playerInfo1);
    string p2Json = JsonUtility.ToJson(playerInfo2);
    string p3Json = JsonUtility.ToJson(playerInfo3);
    //Now Save all 3 player Info
    PlayerPrefs.SetString("p1", p1Json);
    PlayerPrefs.SetString("p2", p2Json);
    PlayerPrefs.SetString("p3", p3Json);
}

加载播放器信息

void loadPlayerInfo()
{
    //Load all 3 player Info
    string p1Json = PlayerPrefs.GetString("p1");
    string p2Json = PlayerPrefs.GetString("p2");
    string p3Json = PlayerPrefs.GetString("p3");
    //Convert each of them back to class
    PlayerInfo playerInfo1 = JsonUtility.FromJson<PlayerInfo>(p1Json);
    PlayerInfo playerInfo2 = JsonUtility.FromJson<PlayerInfo>(p2Json);
    PlayerInfo playerInfo3 = JsonUtility.FromJson<PlayerInfo>(p3Json);
    //Use
    Debug.Log("Player 1 Name: " + playerInfo1.playerName);
    Debug.Log("Player 2 Name: " + playerInfo2.playerName);
    Debug.Log("Player 3 Name: " + playerInfo3.playerName);
}

为了更容易地循环访问它们,请将其设置为数组,然后使用 p0 to p49 作为键。这假设您需要 50 名玩家的玩家信息。

阅读:

PlayerInfo[] players;
void loadPlayerArrayInfo()
{
    players = new PlayerInfo[50];
    for (int i = 0; i < 50; i++)
    {
        players[i] = new PlayerInfo();
        string tempPlayerKey = "p" + i;
        string playerJson = PlayerPrefs.GetString(tempPlayerKey);
        players[i] = JsonUtility.FromJson<PlayerInfo>(playerJson);
    }
}

这样可以保持注册表干净,并在您离开 Unity 时更轻松地将玩家设置移动到另一个游戏引擎。

PlayerPrefs 可以读取和设置 3 种类型的变量。浮点数、整数和字符串。int 和 float 的内存长度均为 32 个字节。字符串占用 20+(n/2)*4 字节,其中 n 是字符串中的字符数。字符串大小可能会有所不同,具体取决于 unity 开发人员如何将 c# 代码编译为本机代码。如您所见,即使对于只有 1 GB 内存的设备,大小也非常小。您可以使用这些指标来计算变量将占用的 ram 量,但我不会担心这一点。您现在正在经历的称为过早优化。只需以这种方式对其进行编码,看看它是否会导致问题,然后才对其进行优化。