2016-09-04 3 views
0

현재 Android 기기 용 RPG 게임을 개발하고 있으며 플레이어의 진행 상황을 저장하는 데 사용하는 직렬화의 맞춤 메소드를 구현했습니다. 저장 프로세스는 충돌이 발생하는 데 충분한 시간 인 1/2 초 정도 걸릴 수 있습니다 (기기의 전원이 꺼지는 등), 사용자 (앱 종료) 또는 잘못 작성된 펌웨어/ROM (커널 패닉) 등).예기치 않게 앱이 종료 될 때 데이터 손상 방지

플레이어의 데이터를 저장하는 동안 이전 플레이어 데이터를 덮어 씁니다. 즉, 충돌이 발생하고 저장 프로세스가 취소/중단되면 플레이어의 데이터가 손실됩니다. 이것은 분명히 이상적이지 않으며 앞으로 게임은 훨씬 더 많은 데이터를 저장할 것이고 저장 시간은 훨씬 길어질 것입니다. 이렇게하면 저장 프로세스 중에 충돌이 발생할 확률이 높아집니다.

앱을 다시 시작한 후에 게임이 다시 시작할 수 있도록 최소한의 데이터를 작성하기 때문에 저장 시간을 줄일 수 없습니다.

그러한 데이터 손상/손실이 발생하지 않도록 방지하기 위해 어떤 조치를 취할 수 있습니까?

+0

임시 파일 세트에 저장하고 프로세스가 완료되면 이동/이름을 바꾸지 않고 이전 저장 파일을 삭제하는 이유는 무엇입니까? –

+0

@SR_ 답변 해 주셔서 감사합니다. 그게 좋은 생각 인 것 같아. 내가 가진 유일한 선택 인 것 같아. 아마 이런 식으로 구현할 것입니다. – rodit

답변

2

임시 파일 세트에 데이터를 저장하고 프로세스가 완료되면 이동/이름 변경 한 다음 이전 저장 파일을 삭제할 수 있습니다.

당신은 이름 변경 과정에 자신이없는 경우, 이러한 제약 조건을 추가 할 수 있습니다

  1. 데이터가 체크섬 항상
  2. , 마지막 일관성 저장된 상태에서 다시 시작하려고 따라와 일치 확인 자신의 규칙에 따라 ... (파일 이름, ...)

또 다른 아이디어는 변경하지 않은 상태를 분리하기 위해 데이터를 조각내는 것입니다. 저장 시간이 너무 길면 게임 중에 남아있는 CPU 시간을 사용하여 변경하지 않는 현재 상태의 부분을 미리 저장하려고 할 수 있습니다 (예를 들어 우선 순위가 낮은 스레드 사용).

+0

답변 해주셔서 감사합니다. 아마 SQLite 데이터베이스를 사용하는 것보다 나에게 더 쉽게 될 것이므로 이런 식으로 구현할 것입니다. – rodit

2

SQLiteDatabase에 데이터를 저장할 수 있습니다. 데이터 저장 변경이 실패하거나 중단되면 데이터베이스는 자동으로 이전의 알려진 상태로 롤백됩니다.

원자 적으로 여러 개의 업데이트를 수행해야하는 경우 보안을 강화하려면 모든 변경 사항을 트랜잭션에 넣으십시오. 변경 사항 중 하나라도 실패하면 전체 트랜잭션이 트랜잭션 전 상태로 롤백됩니다.

SQLite 사용에 대한 자세한 내용은 here 문서를 참조하십시오. 저장 데이터를 다른 응용 프로그램과 공유하거나 백업 서버와 동기화하려는 경우 저장 데이터를 쉽게 조작하려면 ContentProvider을 통해 데이터와 상호 작용하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다. 이것은 좋은 아이디어이지만, 롤백한다는 점이 마음에 들지만 SQLite 데이터베이스가 게임에 적합하다고는 생각하지 않습니다. 정보의 모든 개별 부분에 대해 테이블과 필드를 생성하고 싶지는 않습니다. 저장하고 싶습니다. – rodit

+0

데이터베이스를 사용하고 싶지 않다는 것을 이해하십시오. 그러나 게임이 구조화 된 데이터를 저장하고 검색해야하는 경우 데이터베이스가 게임에 적합하다고 주장합니다.데이터베이스의 어려움은 데이터를 저장하는 가장 좋은 방법을 결정하는 것이지만, 잘 설계된 데이터베이스는 사용과 안정성을 쉽게하기가 어렵다는 것을 알게되었습니다. – happydude

+0

나는 당신에게 동의 할 것이지만 나는 게으르다. 나는 방금 전 작성한 연재 시스템을 바꾸지 않을 것이다. 나는 꽤 많은 시간이 걸리는 뭔가에 (나는 한 사람의 개발팀이다 ...) – rodit

관련 문제