Unity에서 데이터 저장 최적화하기: 중복 저장 방지
Unity 게임 개발 중, 플레이어의 진행 상황, 설정, 또는 게임 데이터를 저장하는 것은 필수적입니다. 하지만, 불필요하게 같은 데이터를 반복해서 저장하는 것은 효율적이지 못합니다. 이 글에서는 저장 전에 기존에 저장된 데이터와 내용이 같은지 비교하여, 같다면 저장하지 않는 방법을 소개합니다.
저장 데이터 비교 로직
먼저, 저장할 데이터와 기존에 로드된 데이터를 비교하는 함수 CompSaveData
를 사용합니다. 이 함수는 SaveDataStruct
타입의 두 데이터 객체를 매개변수로 받아, 내부적으로 BinaryFormatter
를 사용하여 객체를 바이트 배열로 직렬화한 후, 두 바이트 배열이 서로 같은지를 비교합니다.
private static bool CompSaveData(SaveDataSturct data1, SaveDataSturct data2)
{
BinaryFormatter formatter1 = new BinaryFormatter();
BinaryFormatter formatter2 = new BinaryFormatter();
byte[] bytes1;
byte[] bytes2;
using (MemoryStream m = new MemoryStream())
{
formatter1.Serialize(m, data1);
bytes1 = m.ToArray();
}
using (MemoryStream m = new MemoryStream())
{
formatter2.Serialize(m, data2);
bytes2 = m.ToArray();
}
return bytes1.SequenceEqual(bytes2);
}
데이터 저장 최적화
저장할 데이터가 기존에 저장된 데이터와 다를 때만 데이터를 저장하는 로직을 구현합니다. 이를 위해, 먼저 기존의 데이터를 로드하고, 로드된 데이터가 없거나 (loaddata==null
) 로드된 데이터가 있지만 현재 데이터와 다른 경우 (!CompSaveData(tempData, loaddata)
)에만 새로운 데이터를 저장합니다.
var loaddata = LoadData();
if ((loaddata==null) || (loaddata != null && !CompSaveData(tempData, loaddata)))
{
WriteSaveDataToDisk(tempData);
saveData = tempData;
}
데이터 저장 함수
데이터를 저장하기 위한 WriteSaveDataToDisk
함수는 BinaryFormatter
를 사용하여 데이터를 직렬화하고, 지정된 경로에 파일로 저장합니다. 이 과정에서 데이터가 실제로 디스크에 기록되는 경로를 로그로 남겨, 디버깅에 도움을 줍니다.
private static void WriteSaveDataToDisk(SaveDataSturct data)
{
BinaryFormatter formatter = new BinaryFormatter();
string path = Application.persistentDataPath + "/game.savegame";
FileStream stream = new FileStream(path, FileMode.Create);
formatter.Serialize(stream, data);
stream.Close();
Debug.Log("Data saving path : " + path);
}
댓글 없음:
댓글 쓰기