코드 및 공부/데이터 관리

Application.dataPath와 Application.persistentDataPath

ekrxjvpvj0110 2024. 11. 27. 23:47

유니티 버전 - 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 활동 적음).

이라는 결과를 얻을 수 있었습니다

 

 

 

이상입니다