我正在创建一个类似于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
我试图在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) 我正在尝试序列化以下类型的对象
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)