小编Bha*_*kar的帖子

Unity Board游戏AI导致内存泄漏

我正在创建一个类似于tic tac toe的棋盘游戏,我已经创建了一个AI来玩这个游戏.AI非常占用CPU,所以我决定把它放在它自己的线程上.我正在使用这个插件进行多线程:https://www.assetstore.unity3d.com/en/#!/ content/15717.

我有这个IEnumerator:

static IEnumerator executeAITurn(Turn turn) {
    Vector2[] move = mctsManager.mcts(new State(sections, null, turn), AIIterations)[0, 0].metaData.lastMove;

    yield return Ninja.JumpToUnity;

    input(move, true);

    yield return Ninja.JumpBack;

    Debug.Log("DONE!");
}
Run Code Online (Sandbox Code Playgroud)

我用它来运行它

gameManager.StartCoroutineAsync(executeAITurn((AITurn == Turn.X) ? Turn.O : Turn.X));
Run Code Online (Sandbox Code Playgroud)

通常,当我运行executeAITurn时,它正常工作没有问题,但由于某种原因,有时当我运行它时,它会按照预期进行,但在任务管理器中,我的内存开始增加30 mb/sec.内存一直增加到1000 MB,游戏变得非常慢.当我关闭播放模式时,内存有时会继续增加或只是停在原地.我必须通过任务管理器结束Unity以释放内存.

我尝试过的一件事是用常规for循环替换foreach循环,这似乎有所帮助.内存增加的速度下降了很多(最初会增加到大约100 mb/sec).

任何帮助,将不胜感激.

以下是executeAITurn中涉及的一些代码:

mctsManager类:https://pastebin.com/yzeHrY2p

输入功能:https://pastebin.com/8f2hzZws

c# multithreading memory-leaks unity-game-engine

5
推荐指数
1
解决办法
575
查看次数

加载玩家数据时,任何高于400的数字都会减少到319

我试图在Unity中保存并加载基本的玩家数据,但每当我加载游戏时,一切都正确加载,除了存储的值大于400的任何东西,减少到319.例如,如果我已经保存了200个硬币,它将加载200个硬币,但如果我有500个硬币,它将加载319个硬币.

这是我用来保存的代码:

public static void save() {
    Debug.Log("Saving Player Data");

    //Convert Player Data to String
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, playerData);
    byte[] newData = ms.ToArray();
    string newDataString = Encoding.ASCII.GetString(newData);

    FileStream file = File.Create(Application.persistentDataPath + "/playerData.aaa");
    bf.Serialize(file, newDataString);
    file.Close();
}
Run Code Online (Sandbox Code Playgroud)

这是我用来加载的代码:

public static void load() {
    playerData = new PlayerData();
    if(File.Exists(Application.persistentDataPath + "/playerData.aaa")) {
        try {
            Debug.Log("Loading Player Data");

            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/playerData.aaa", FileMode.Open);
            string dataString = bf.Deserialize(file).ToString(); …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine

2
推荐指数
1
解决办法
97
查看次数

如何调试boost archive异常输入流错误

我正在尝试序列化以下类型的对象

std::unordered_map<std::vector<Card>, std::unordered_map<InfosetHistory, Node>>& nodeMap

Card是一个结构体,InfosetHistory并且Node是使用其他一些结构体作为成员变量的类。我已经serialize为所有需要它的类创建了函数。例如,这是一个Card

struct Card {
    int rank;
    int suit;
    ...

    template<class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & rank;
        ar & suit;
    }
};
Run Code Online (Sandbox Code Playgroud)

我将nodeMap序列化如下:

std::ofstream file("Strategy" + std::to_string(iteration) + ".bin");
boost::archive::binary_oarchive archive(file);
archive << nodeMap;
file.close();
Run Code Online (Sandbox Code Playgroud)

并像这样单独反序列化(当前选择反序列化“Strategy0.bin”):

std::ifstream ifs("Strategy0.bin");
std::unordered_map<std::vector<Card>, std::unordered_map<InfosetHistory, Node>> nodeMap;
if (ifs.good()) {
    boost::archive::binary_iarchive ia(ifs);
    ia >> nodeMap;
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序来创建和序列化 nodeMap 时,我始终能够毫无问题地进行序列化。创建了相应的 .bin 文件,它们的大小似乎适合我希望它们存储的数据。

然而,当我运行程序来反序列化nodeMap时,如果nodeMap不是那么大,我不会遇到问题,但如果它很大,我会收到以下错误:

terminate called after throwing …
Run Code Online (Sandbox Code Playgroud)

c++ serialization boost

2
推荐指数
1
解决办法
1066
查看次数