대부분의 MMORPGS에는 X 시간마다 한 번씩 모든 문자를 저장하는 Worldsave 시스템이 있습니다. 이유는 성능이라고 생각합니다. 그렇다면 연결 해제시 캐릭터를 저장하는 것보다 성능이 더 좋은 이유는 무엇입니까?
대부분의 MMORPGS에는 X 시간마다 한 번씩 모든 문자를 저장하는 Worldsave 시스템이 있습니다. 이유는 성능이라고 생각합니다. 그렇다면 연결 해제시 캐릭터를 저장하는 것보다 성능이 더 좋은 이유는 무엇입니까?
답변:
이것은 성능을위한 것이 아닙니다. 이것은 안전 장치입니다. 세계가 몇 분마다 절약되면 서버에 문제가 발생하여 종료되면 모든 사람이 몇 분 동안 진행 상황을 잃게됩니다.
연결이 끊어지면 서버에 문제가있는 경우 모든 사람이 로그온 한 후 수행 한 모든 내용을 잃게됩니다. 특히 장시간 플레이 세션을하는 사람들에게는 (MMO에서 일반적으로 사용되는) 상당한 양의 데이터가 손실됩니다.
대량의 데이터 손실 위험을 제거하기 위해 약간의 성능을 희생합니다.
물론 플레이어 데이터를 클라이언트 컴퓨터에 쉽게 저장하여 네트워크 트래픽을 줄일 수 있습니다. 여기서 문제는 해킹에 개방적이라는 것입니다. 한 사람이 속임수를 쓰는 방법을 익히면 공유하고 모두가 그렇게합니다.
편집 : 로 @Philipp는 이 또한 항목을 복제 할 수있는 능력을 제거 지적했다. 연결 해제시 저장 시스템을 사용하면 서버 충돌 전에 트랜잭션이 발생하고 충돌 전에 한 사람이 로그 아웃하면 두 플레이어가 마지막으로 로그 아웃 한 시점으로 롤백되어 항목을 삭제하거나 복제합니다.
연결 끊기에만 저장된 초기 시스템은 플레이어가 활성화 된 동안 주기적으로 저장되는 경향이있었습니다. 이러한 시스템, 일반적으로 MUD (Multi-User Dungeons)에서 캐릭터는 파일에 주기적으로 덤프 될 때까지 메모리에 유지됩니다.
이것은 사용자가 "캠핑"을하지 않고 연결을 끊으면, 마지막으로 저장했을 때부터 몇 개의 방에서 멀리 떨어져 있고 전리품, XP 등이없는 것을 발견했습니다. 이와 관련하여 콘솔 RPG가 오늘날 재생되는 방식과 매우 유사하게 작동합니다 (콘솔을 끄지 않고 게임을 저장하거나 마지막으로 저장 한 이후 모든 것을 잃게됩니다).
문자와 메시지를 서로에게 보낼 수있는 "메일"시스템을 사용하는 경우를 제외하고는 문자가 서로 상호 작용할 수 없기 때문에 시스템은 의도 한 목적으로 작동했습니다. 아이템을 잃고 진행될 확률은 상당히 높았지만 대부분의 경우 한 번에 한 캐릭터에만 영향을 미쳤습니다.
월드 세이브 기능은 캐릭터가 서로 직접적으로 상호 작용할 수 있기 때문에 재생되는 모든 캐릭터가 일관된 상태에 있거나 항목 복제 및 삭제가 발생할 수 있기 때문입니다. 이것은 MUD 시나리오에서 문제가되지 않았습니다. 왜냐하면 항목이나 통화 복제를 초래하는 방식으로 시스템을 남용하는 것이 어려웠지만 초기 MMO MUD에서는 매우 쉬웠습니다. 플레이어 A는 플레이어 B에게 아이템을 제공하고 플레이어 B는 저장하고 플레이어 A는 저장하지 않고 연결을 끊습니다. 즉시 복제.
Worldsave은 하지 성능이 향상하지만, 부정 행위를 방지하기 위해 설계. 월드 세이브 이벤트가 문자 그대로 미리 발표 된 시스템에서 재생 한 것을 기억하며, 서버가 모든 파일을 업데이트하는 동안 종종 전체 시스템을 1 분 동안 중단했습니다. 이로 인해 부정 행위가 방지되었지만 이러한 시스템 사용자에게는 그리 편리하지 않았습니다.
그것은 우리를 현재의 상황으로 인도합니다. 현재는 월드 세이브 타입 함수를 사용하지 않습니다. 우리는 데이터베이스를 사용합니다. 이를 통해 가능한 한 복제 및 삭제를 최소화 할 수 있습니다. 캐릭터는 데이터베이스에 레코드로 존재하며 플레이어 간의 각 트랜잭션은 리터럴 데이터베이스 트랜잭션입니다. 조치가 완전히 커미트되거나 롤백됩니다.
시스템에서 비정상적인 버그가 발생하지 않으면 개별 캐릭터 파일 저장 (빠른 저장 시간)과 월드 세이브의 이점 (속임수 없음)의 이점을 얻을 수 있습니다 (중요한 진행률 및 항목 복제 손실).
최신 MMO를 디자인 할 때는 데이터베이스에 저장 프로 시저를 만들고 해당 프로 시저를 사용하여 트랜잭션을 수행하려고합니다. 예를 들어, 두 플레이어 간의 거래를 할 때 다음과 같이 보일 수 있습니다.
start transaction;
insert into inventory (playerid, itemid) values (111, 222);
delete from inventory where playerid=111 and itemid=444;
insert into inventory (playerid, itemid) values (333, 444);
delete from inventory where playerid=333 and itemid=222;
commit;
(참고 :이 SQL은 실제적인 방식으로 작성되지 않았으며 단지 예시 일뿐입니다).
이러한 방식으로, 커밋 전에 크래시가 발생하면, 시스템은 플레이어 (111) 및 플레이어 (333)가 여전히 오리지널 아이템을 가지고있는 상태로 롤백하고, 커밋 후에 거래가 완료된다. 데이터베이스에서 보장 한대로 문자가 동시에 저장되므로 복제 할 기회가 없습니다.