자산을 저장할 때 버전 변경을 어떻게 처리 할 수 ​​있습니까?


9

나는 RPG를 얼마 동안 연구 해 왔으며 두 가지 다른 직렬화 기술을 사용합니다.

  • 적, 무기, 아이템은 XML로 저장됩니다.
  • 지도와 이벤트는 "제어 이진"으로 저장됩니다 (모든 클래스는 저장 /로드 방법을 가져오고 저장 /로드 할 항목을 결정합니다).

그러나 나는지도와 이벤트에 대한 나의 선택에 의문을 가지기 시작했다. 내 관심사 :

  • 지도 편집기를 만들었지 만 파일을 열어서 작은 것을 바꿀 수는 없습니다.
  • 혼란 스러워요. 모든 맵을 다시로드 / 저장하지 않으면 나중에 중단됩니다. 클래스에 변수를 추가하고 싶다고 가정 해보십시오.

첫 번째 관심사는 내 기술을 바꾸지 않고는 해결하기가 어렵습니다. JSON으로 변경하는 것에 대해 생각했지만 많은 작업이 필요합니다. 또한 모든 곳에서 [DataContract] 및 [DataMember] 특성을 사용하면보기 흉한 것으로 보입니다.

그것은 나의 두 번째 관심사로 나를 떠났고 어떻게 처리 할 수 ​​있는지 궁금합니다. 모든 맵을 반복하고 새 변수를 사용하여 다시 저장하는 작은 프로그램을 작성합니까? 지금 두 개의지도를 얻기 시작했지만 여전히 수동으로 수행하기 때문입니다. 추가 작업이 많이 발생하기 때문에 변경을 원할 때마다 두 번 생각합니다.

답변:


5

버전 관리 문제를 처리하는 방법은 많이 있습니다. 버전 당 하나의로드 기능을 사용하여 수행 할 수 있고, 시간이 지남에 따라 자산 구조의 변환을 (일반적으로 속성을 통해) 설명하여 프로세스를 자동화하려고 시도 할 수 있습니다.로드 / 저장 기능 내에서 버전 별 검사를 수행 할 수 있습니다. .

같은 I 접근 "변경 사항을 설명"하지만 속성을 통해 일을하려고하는 것은 어색 얻을 것을 발견 빨리 . 대신 함수를 사용하겠습니다. 버전의 N데이터 N + 1를 모든 적절한 버전의 버전의 데이터로 변환하는 기능을 구현 하십시오. 로드시 최신 버전과 비교하여 버전을 확인하고 그렇지 않은 경우 적절한 버전 관리 기능을 통해 데이터를 실행하십시오. 항상 최신 버전을 저장하십시오.

데이터가 여전히 런타임 키-값 형식 일 때 변환을 수행 할 때 가장 효과적입니다. 즉, 고유 한 이진 형식이있는 경우 기본 키-값 형식의 JSON 또는 XML을 사용할 수 없기 때문에 "런타임 속성 모음"접근 방식 인 데이터에 대한 표현을 구현하려고합니다. 이 작업을 수행하지 않으면 오래된 클래스 정의를 유지해야 할 수도 있습니다. 이 속성을 나쁜 형식으로 자산을 가질 수 있다는 것도 게임 에디터 개발에 매우 유용합니다.

개발하는 동안 데이터를 반복 할 때 자연스럽게 최신 버전으로 버블 링되어 결국 이전 버전 관리 기능을 삭제할 수 있습니다. 이것은 Guild Wars 2에서 아트 자산 (예 :지도)의 버전을 지정하는 데 사용했던 것과 동일한 수준의 접근 방식입니다.


이제는 자산에 대한 텍스트 및 이진 직렬화를 모두 지원하는 것이 유용하다고 생각합니다. 개발 중에는 모든 데이터를 XML 또는 JSON을 기반으로 사람이 읽을 수있는 형식으로 유지하십시오. 이렇게하면 데이터 편집과 관련하여 복잡한 도구를 만들 필요가 없으므로 반복 능력이 크게 향상 될 수 있습니다. 손으로 간단하고 빠르게 조정할 수있는 상태로 돌아갈 수 있습니다.

둘째, 파일 크기 나 파일 IO 시간을 향상시킬 수있는 게임 배송을위한 바이너리 형식을 원한다고 가정 할 때 버전 관리를 위해 직렬화 및 역 직렬화 API를 설계하십시오. 어느 시점에서 업데이트 또는 버그 수정을 제공 할 수 있기 때문에 버전 지정 여전히 운송 컨텍스트에서 유용합니다. .NET 직렬화Boost 직렬화 의 버전 관리 기능에 대해 설명하는 문서 가 있습니다. 당신이하면 되는 텍스트와 바이너리 포맷을 모두 지원하는 것, 당신이 (또는 빌드 자동화 된 테스트가 더 나은, 이렇게하는) 때때로을 테스트해야합니다.


의견을 보내 주셔서 감사합니다. 계속 진행하는 방법에 대한 아이디어를 주셨습니다.
user1776562

1

XML 또는 JSON과 같은 속성 값 쌍과 함께 마크 업 언어를 사용하십시오.

파서는 이해하지 못하는 속성을 무시하거나 찾을 수없는 속성을 기본값으로 사용하므로 이전 버전과의 호환성이 매우 쉽습니다. 또한 형식은 사람이 읽을 수 있으므로 텍스트 편집기로 쉽게 편집 할 수 있습니다.

XML 또는 JSON과 같은 기존 언어를 사용하면 많은 스크립팅 언어가이를 지원하므로 많은 파일을 편집하기 위해 스크립트를 작성해야 할 때 훨씬 쉽게 수행 할 수 있습니다.

이러한 언어의 대부분의 단점은 매우 장황하다는 것입니다. 즉, 결과 파일이 최적화 된 이진 형식으로 필요한 것보다 훨씬 큽니다. 오늘날 대부분의 상황에서 파일 크기는 그다지 중요하지 않습니다. 그러나 중요한 곳에서는 zip과 같은 주식 알고리즘으로 파일을 압축하여 파일 크기를 크게 줄일 수 있습니다.

마크 업 언어는 종종 전체 문서를 하드 드라이브에서 읽고 파싱하지 않는 한 임의 액세스를 허용하지 않습니다. 그러나 실제로는 순차 읽기에서 하드 드라이브가 가장 빠르기 때문에 그다지 중요하지 않습니다. 동일한 파일의 다른 부분을 무작위로 여러 번 검색하는 것은 필요할 때보 다 더 많은 데이터를 읽는 경우에도 파일을 한 번에 읽는 것보다 훨씬 느릴 수 있습니다.


1

protobuf를 사용할 수 있습니다. https://code.google.com/p/protobuf/ json / xml의 장점을 제공하므로 하위 호환성을 유지하면서 쉽게 확장 할 수 있으며 바이너리라는 장점도 있습니다. 워크 플로우는 프로토 타입 언어로 데이터 형식 설명을 작성한 후 직렬화 및 직렬화 해제를위한 소스 코드를 생성하는 것입니다. 여러 언어에 대한 소스를 생성 할 수 있습니다. 또한 스펙이 암묵적으로 읽기 / 쓰기로 수행되는 json과 달리 직렬화 된 데이터의 명확한 스펙을 갖는 것이 큰 이점입니다.


멋지지만 C #을 사용합니다. 이것은 C ++, python 및 java에 대한 것 같습니다.
user1776562

C # 버전이 있습니다. 나는 그것을 개인적으로 테스트하지는 않았지만 하나가 있습니다.
Arne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.