로그인 한 모든 문자를 MMO에 정기적으로 저장하면 어떤 성능 이점이 있습니까?


26

대부분의 MMORPGS에는 X 시간마다 한 번씩 모든 문자를 저장하는 Worldsave 시스템이 있습니다. 이유는 성능이라고 생각합니다. 그렇다면 연결 해제시 캐릭터를 저장하는 것보다 성능이 더 좋은 이유는 무엇입니까?


34
성능이 아닙니다. 정확성을 위해 약간의 성능을 희생하는 것이 더 중요합니다.
메이슨 휠러

시간이 여기서 어떤 역할을합니까? AFAIK, mmo의 모든 작업은 즉시 저장됩니다. 항목을 가져 오면 해당 항목이 계정에 지연없이 서버에 추가됩니다. 그렇지 않으면 서버가 해당 작업을 기억 한 다음 5 분 후에 수행해야하므로 아무런 이점이 없습니다. 또는 클라이언트는 5 분 후에이를 기억하고 보내야 할 것입니다. 이제 5 분 안에 누구나 데이터를 보내거나 변경할 수 있기 때문에 해킹을 시작하게됩니다.
희망적으로 도움이되는

4
@HopefullyHelpful 아니요, 사실이 아닙니다. MMO의 모든 작업은 즉시 메모리 에 있지만 일시적입니다. SSD를 사용하더라도 영구 스토리지에 모든 것을 직접 저장하는 것은 여전히 ​​너무 비쌉니다. 데이터베이스에 직접 저장하는 게임의 경우에도 데이터베이스 자체는 해당 데이터를 디스크에 즉시 저장하지 않습니다 (또는 최소한 일관된 데이터가 아닌 트랜잭션 로그 만 저장함). 충돌시 다시 빌드해야하며 약간의 시간). 그러나 연결 끊기에 대한 절약은 일관성을 유지하는 또 다른 이유입니다.
Luaan

1
나는이 질문이 간격과 실시간으로 문자를 저장하는 것의 성능 이점이 무엇인지에 대한 줄을 따라갈 것이라고 생각했습니다.
Anthony

2
@Luaan : 기계식 HDD에서도 모든 상태 변경을 영구 저장소에 완벽하게 저장할 수 있습니다. 사용량이 많은 서버에서는 몇 개가 필요할 수 있습니다. 비결은 개별 객체를 업데이트 하지 않는 것 입니다. 대신 트랜잭션 로그 "Player (A) .Inventory + = Object (B)`를 저장합니다. 주기적으로 전체 상태를 플러시합니다. 복구하려면 최신 전체 저장을 다시로드하고 트랜잭션 로그에서 최신 트랜잭션을 적용하십시오. '하나의 파일을 순차적으로 작성하면 기계식 HDD의 최고 성능에 도달하지만 트랜잭션 로그의 크기를 적정하게 유지하려면 주기적으로 전체 저장이 필요합니다.
MSalters

답변:


66

이것은 성능을위한 것이 아닙니다. 이것은 안전 장치입니다. 세계가 몇 분마다 절약되면 서버에 문제가 발생하여 종료되면 모든 사람이 몇 분 동안 진행 상황을 잃게됩니다.

연결이 끊어지면 서버에 문제가있는 경우 모든 사람이 로그온 한 후 수행 한 모든 내용을 잃게됩니다. 특히 장시간 플레이 세션을하는 사람들에게는 (MMO에서 일반적으로 사용되는) 상당한 양의 데이터가 손실됩니다.

대량의 데이터 손실 위험을 제거하기 위해 약간의 성능을 희생합니다.

물론 플레이어 데이터를 클라이언트 컴퓨터에 쉽게 저장하여 네트워크 트래픽을 줄일 수 있습니다. 여기서 문제는 해킹에 개방적이라는 것입니다. 한 사람이 속임수를 쓰는 방법을 익히면 공유하고 모두가 그렇게합니다.


편집 :@Philipp는 이 또한 항목을 복제 할 수있는 능력을 제거 지적했다. 연결 해제시 저장 시스템을 사용하면 서버 충돌 전에 트랜잭션이 발생하고 충돌 전에 한 사람이 로그 아웃하면 두 플레이어가 마지막으로 로그 아웃 한 시점으로 롤백되어 항목을 삭제하거나 복제합니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Josh

5

연결 끊기에만 저장된 초기 시스템은 플레이어가 활성화 된 동안 주기적으로 저장되는 경향이있었습니다. 이러한 시스템, 일반적으로 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)가 여전히 오리지널 아이템을 가지고있는 상태로 롤백하고, 커밋 후에 거래가 완료된다. 데이터베이스에서 보장 한대로 문자가 동시에 저장되므로 복제 할 기회가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.