2024년 4월 10일 수요일

Unity에서 데이터 저장 최적화하기: 중복 저장 방지


Unity에서 데이터 저장 최적화하기: 중복 저장 방지

Unity 게임 개발 중, 플레이어의 진행 상황, 설정, 또는 게임 데이터를 저장하는 것은 필수적입니다. 하지만, 불필요하게 같은 데이터를 반복해서 저장하는 것은 효율적이지 못합니다. 이 글에서는 저장 전에 기존에 저장된 데이터와 내용이 같은지 비교하여, 같다면 저장하지 않는 방법을 소개합니다.


저장 데이터 비교 로직

먼저, 저장할 데이터와 기존에 로드된 데이터를 비교하는 함수 CompSaveData를 사용합니다. 이 함수는 SaveDataStruct 타입의 두 데이터 객체를 매개변수로 받아, 내부적으로 BinaryFormatter를 사용하여 객체를 바이트 배열로 직렬화한 후, 두 바이트 배열이 서로 같은지를 비교합니다.

csharp

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))에만 새로운 데이터를 저장합니다.

csharp

var loaddata = LoadData();
if ((loaddata==null) || (loaddata != null && !CompSaveData(tempData, loaddata)))
{
    WriteSaveDataToDisk(tempData);
    saveData = tempData;
}


데이터 저장 함수

데이터를 저장하기 위한 WriteSaveDataToDisk 함수는 BinaryFormatter를 사용하여 데이터를 직렬화하고, 지정된 경로에 파일로 저장합니다. 이 과정에서 데이터가 실제로 디스크에 기록되는 경로를 로그로 남겨, 디버깅에 도움을 줍니다.

csharp

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);
}


 




댓글 없음:

댓글 쓰기