유니티 버전 - 2022.3.48f1
목차
- Application.dataPath 와 Application.persistentDataPath
- Path.Combine()와 문자열 연산+
들어가며
파일 경로나 디렉터리를 다룰 때, Application.dataPath와 +를 이용하여 경로를 연결하는 방법은 흔하게 사용됩니다
Application.persistentDataPath와 Path.Combine과 비교하여 장단점과 메모리 사용량, 성능 차이를 다뤄보겠습니다
Application.dataPath 와 Application.persistentDataPath
위의 둘은 다른 방식이지만 게임 데이터 파일에 접근하기 위한 경로를 반환합니다, 하지만 둘의 목적이 다르고 Application.dataPath은 앱을 업데이트시 데이터가 변경 될 수 있습니다, 그에 반해 Application.persistentDataPath는 앱을 삭제 하기 전까지 데이터를 유지합니다
항목 | Application.dataPath | Application.persistentDataPath |
데이터 유지 여부 | 업데이트/삭제 시 데이터 변경 | 앱 삭제 전까지 데이터 유지 |
목적 | 게임에 포함된 리소스 읽기 | 사용자 설정, 저장 데이터 등 영구 데이터 관리 |
경로 | 빌드된 게임의 데이터 폴더 | 사용자별 고유 영구 저장소 |
따라서 간단하게 플레이어의 데이터를 저장하고자 한다면 Application.persistentDataPath를 사용하는 것이 옳겠습니다
Path.Combine()와 문자열 연산 +
먼저 Application.dataPath와 + 연산을 통한 코드 입니다
rootDirectory = Application.dataPath + "/SaveFile/";
현재는 dataPath에 /SaveFile/ 까지밖에 내려가지 않기에 간단하지만 아래와 같이 길이질 경우를 살펴보겠습니다
string timeDataDirectory = rootDirectory + "/Slot" + slotNumber + "/TimeData/";
1. 경로 구분자를 신경써서 작성해야하기 때문에 중복/누락되는 경우 경로가 잘못 생성, 참조될 수 있습니다
2. 경로 구분자를 운영체제를 고려하여 따로 처리해야합니다 (Windows \ , mac Linux /)
3. 경로가 복잡해질수록 가독성이 떨어지고 유지보수가 어렵습니다
4. 문자열을 + 연산자로 연결할 때마다 새로운 문자열 객체를 생성하고 GC의 부담이 커집니다
이제 Application.persistentDataPath와 Path.Combine을 이용하여 보겠습니다
string filePath = Path.Combine(Application.persistentDataPath, "Resources", "myFile.txt");
1. Application.persistentDataPath을 사용하면 삭제전까지 영구적인 데이터 보관이 가능합니다
2. Path.Combine을 사용하면 운영체제에 맞는 경로 구분자 (\ , /)를 자동으로 처리합니다
3. Path.Combine을 사용하면 잘못된/중복된/누락된 구분자를 자동으로 보정하여줍니다
4. Path.Combine을 사용하면 여러 경로를 이어 붙일 때 코드의 가독성이 좋습니디
5. Path.Combine을 사용하면 문자열을 내부적으로 한 번에 연결하여 최종 결과 문자열 1개만 생성되기에 메모리 효율이 좋습니다
마치며
Application.persistentDataPath와 Path.Combine을 사용해야하는 이유에 대하여 알아보았습니다
둘의 성능차이를 비교해보면(GPT 사용, 시스템 사양에 따라 다름)
100,000번 문자열 생성 시:
- 문자열 연산 (+): 약 150~200ms (메모리 사용량 높음, GC 활동 증가).
- Path.Combine: 약 50~70ms (메모리 사용량 적음, GC 활동 적음).
이라는 결과를 얻을 수 있었습니다
이상입니다
'코드 및 공부 > 데이터 관리' 카테고리의 다른 글
인벤토리 슬롯 저장/로드시 간헐적으로 아이템이 사라지는 현상 (0) | 2024.12.27 |
---|---|
유니티 조합 시스템 - 슬롯 이용 (0) | 2024.12.24 |
OnDrop이 실행되었을때 OnEndDrag가 실행되지 못하도록 하기 (1) | 2024.12.24 |
OnValidate()을 이용한 SO 데이터 관리 (0) | 2024.12.11 |
데이터 관리 - JSON을 이용한 데이터 관리 (0) | 2024.09.16 |