ประสิทธิภาพการทำงานมีประโยชน์อย่างไรในการบันทึกอักขระที่ล็อกอินทั้งหมดใน MMO ในช่วงเวลาปกติ


26

MMORPGS ส่วนใหญ่มีระบบ Worldsave ที่จะบันทึกอักขระทั้งหมดทุกๆ X ชั่วโมง ฉันคิดว่าเหตุผลก็คือประสิทธิภาพ เหตุใดจึงดีกว่าประสิทธิภาพการทำงานที่ดีกว่าการบันทึกอักขระในการตัดการเชื่อมต่อ


34
มันไม่ใช่เพื่อประสิทธิภาพ มันเสียสละประสิทธิภาพเล็กน้อยเพื่อความถูกต้องซึ่งสำคัญกว่า
Mason Wheeler

ที่นี่มีบทบาทจริงๆหรือเปล่า? AFAIK ทุกการกระทำใน mmo จะถูกบันทึกทันที คุณได้รับไอเท็มและไอเท็มนั้นถูกเพิ่มเข้าไปในเซิร์ฟเวอร์โดยไม่ชักช้ากับบัญชีของคุณมิฉะนั้นเซิร์ฟเวอร์จะต้องจำไว้ว่าคุณทำอย่างนั้นแล้วทำอีก 5 นาทีหลังจากนั้นซึ่งไม่มีประโยชน์ใด ๆ หรือลูกค้าจะต้องจำและส่ง 5 นาทีต่อมาซึ่งตอนนี้เปิดให้คุณแฮ็คเพราะใน 5 นาทีที่ทุกคนสามารถแก้ไข / เพิ่มข้อมูลที่จะส่ง
หวังว่าจะช่วยได้

4
@HopefullyHelpful ไม่นั่นไม่ใช่เรื่องจริง ทุกการกระทำใน MMO จะอยู่ในความทรงจำทันที แต่นั่นเป็นการกระทำชั่วคราว การบันทึกทุกสิ่งโดยตรงไปยังที่จัดเก็บข้อมูลแบบถาวรยังคงแพงเกินไปแม้แต่กับ SSD แม้จะมีเกมที่บันทึกโดยตรงไปยังฐานข้อมูลตัวฐานข้อมูลเองก็ไม่บันทึกข้อมูลลงดิสก์ทันที (หรืออย่างน้อยก็บันทึกเพียงบันทึกการทำธุรกรรมไม่ใช่ข้อมูลที่สอดคล้องกัน - สิ่งนี้จะต้องสร้างใหม่บนความผิดพลาดและค่อนข้าง บิตของเวลา) แต่การประหยัดการยกเลิกการเชื่อมต่อเป็นความคิดที่ไม่ดีด้วยเหตุผลอื่น - ความสอดคล้อง
Luaan

1
ฉันคิดว่าคำถามนี้จะเป็นไปตามสายของสิ่งที่มีประโยชน์ประสิทธิภาพการทำงานของการบันทึกตัวละครในช่วงเวลา vs ในเวลาจริง
แอนโธนี

2
@ Luaan: มันเป็นไปได้อย่างสมบูรณ์แบบที่ดีที่จะบันทึกทุกการเปลี่ยนแปลงในการจัดเก็บข้อมูลถาวรแม้ใน HDD กล (คุณอาจต้องใช้เซิร์ฟเวอร์จำนวนน้อย) เคล็ดลับคือการไม่อัปเดตวัตถุแต่ละรายการ คุณบันทึกการทำธุรกรรม "Player (A) .Inventory + = Object (B)` แทนคุณจะล้างสถานะเต็มเป็นระยะเพื่อกู้คืนคุณโหลดการบันทึกแบบเต็มล่าสุดและใช้ธุรกรรมล่าสุดจากบันทึกการทำธุรกรรมตั้งแต่คุณ คุณกำลังเขียนไฟล์หนึ่งไฟล์ตามลำดับคุณจะได้รับประสิทธิภาพสูงสุดสำหรับ HDD เชิงกล แต่เพื่อให้บันทึกธุรกรรมมีขนาดที่เหมาะสมคุณจะต้องบันทึกเป็นระยะ ๆ
MSalters

คำตอบ:


66

นี่ไม่ใช่เพื่อประสิทธิภาพ นี่คือความล้มเหลว หากโลกบันทึกทุก ๆ สองสามนาทีถ้ามีอะไรเกิดขึ้นกับเซิร์ฟเวอร์และมันปิดตัวลงทุกคนจะสูญเสียความคืบหน้าไปเพียงไม่กี่นาที

ด้วยการบันทึกเมื่อตัดการเชื่อมต่อหากเซิร์ฟเวอร์มีปัญหาทุกคนจะสูญเสียทุกสิ่งที่ทำไปตั้งแต่เข้าสู่ระบบ สำหรับผู้ที่เล่นเป็นช่วงยาวโดยเฉพาะ (ตามปกติใน MMO) พวกเขาจะสูญเสียข้อมูลจำนวนมาก

พวกเขาเสียสละประสิทธิภาพเล็กน้อยเพื่อขจัดความเสี่ยงจากการสูญเสียข้อมูลจำนวนมาก

แน่นอนคุณสามารถจัดเก็บข้อมูลผู้เล่นบนเครื่องไคลเอนต์ได้อย่างง่ายดายลดการรับส่งข้อมูลเครือข่าย ปัญหานี่คือมันเปิดให้แฮ็ค เมื่อคนคนหนึ่งหาวิธีโกงพวกเขาแบ่งปันและทุกคนกำลังทำมัน


แก้ไข:ตามที่@Philippชี้ให้เห็นสิ่งนี้จะลบความสามารถในการทำซ้ำรายการ ด้วยระบบบันทึกการตัดการเชื่อมต่อหากมีการทำธุรกรรมก่อนเซิร์ฟเวอร์ล่มและบุคคลหนึ่งล็อกเอาต์ก่อนเกิดความผิดพลาดผู้เล่นทั้งสองจะถูกย้อนกลับไปเป็นครั้งสุดท้ายที่พวกเขาออกจากระบบไม่ว่าจะเป็นการลบรายการหรือทำซ้ำ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Josh

5

ระบบก่อนหน้านี้ที่บันทึกเฉพาะเมื่อตัดการเชื่อมต่อมีแนวโน้มที่จะบันทึกเป็นระยะในขณะที่โปรแกรมเล่นทำงานอยู่ ในระบบเหล่านั้นโดยทั่วไปแล้ว MUDs (Multi-User Dungeons) อักขระจะถูกเก็บรักษาไว้ในหน่วยความจำจนกว่าจะถูกทิ้งลงในไฟล์เป็นระยะ

ซึ่งหมายความว่าหากผู้ใช้ยกเลิกการเชื่อมต่อโดยไม่มี "การตั้งแคมป์" พวกเขามักจะพบว่าตัวเองอยู่ห่างออกไปหลายห้องและหายไปจากการปล้นสะดม XP ฯลฯ จากครั้งล่าสุดที่พวกเขาบันทึก ในเรื่องดังกล่าวมันมีบทบาทคล้ายกับเกมคอนโซล RPG เล่นวันนี้ (คุณต้องบันทึกเกมของคุณโดยไม่ปิดคอนโซลหรือคุณสูญเสียทุกอย่างตั้งแต่ครั้งสุดท้ายที่คุณบันทึก)

ระบบทำงานตามวัตถุประสงค์ที่ตั้งใจไว้เพราะตัวละครไม่สามารถโต้ตอบซึ่งกันและกันได้นอกจากระบบ "จดหมาย" ที่พวกเขาสามารถส่งข้อความและรายการให้กันได้ โอกาสในการสูญเสียไอเท็มและความก้าวหน้ามีแนวโน้มที่จะค่อนข้างสำคัญ แต่ได้รับผลกระทบเพียงครั้งเดียวในแต่ละกรณี

ฟีเจอร์การบันทึกบนโลกใบนี้เกิดขึ้นเพราะในที่สุดตัวละครก็สามารถโต้ตอบกันได้โดยตรงดังนั้นตัวละครทุกตัวที่เล่นต้องอยู่ในสภาพที่สอดคล้องกัน นี่ไม่ใช่ปัญหาในสถานการณ์ MUD เนื่องจากเป็นการยากที่จะละเมิดระบบในทางที่ทำให้เกิดรายการหรือการทำซ้ำสกุลเงิน แต่มันง่ายอย่างเหลือเชื่อที่จะทำในช่วงต้น MMO MUDs ผู้เล่น A ให้ผู้เล่น B เป็นไอเท็มผู้เล่น B บันทึกและผู้เล่น A ตัดการเชื่อมต่อโดยไม่บันทึก ทำสำเนาทันที

Worldsave ไม่ได้มีประโยชน์ด้านประสิทธิภาพ แต่ออกแบบมาเพื่อป้องกันการโกง ฉันจำได้ว่าเล่นบนระบบที่มีการประกาศกิจกรรมบันทึกล่วงหน้าอย่างแท้จริงและมักจะแขวนทั้งระบบเป็นเวลาหนึ่งนาทีในขณะที่เซิร์ฟเวอร์อัปเดตไฟล์ทั้งหมด ขณะนี้ทำให้การโกงมันไม่สะดวกสำหรับผู้ใช้ระบบเหล่านี้

นั่นนำเราไปสู่สถานการณ์ปัจจุบัน วันนี้เราไม่ได้ใช้ฟังก์ชั่นประเภท worldsave เราใช้ฐานข้อมูล สิ่งนี้ทำให้เรามั่นใจได้ว่าการทำซ้ำและการลบจะถูกย่อให้เล็กที่สุดเท่าที่จะทำได้ ตัวละครมีอยู่เป็นบันทึกในฐานข้อมูลและแต่ละธุรกรรมระหว่างผู้เล่นเป็นธุรกรรมฐานข้อมูลที่แท้จริง ไม่ว่าจะเป็นการกระทำที่มุ่งมั่นอย่างเต็มที่หรือจะย้อนกลับ

ยกเว้นข้อผิดพลาดที่ผิดปกติในระบบคุณจะได้รับประโยชน์จากการบันทึกไฟล์ตัวละครแต่ละตัว (ประหยัดเวลาได้อย่างรวดเร็ว) และผลประโยชน์ของ worldsaves (ไม่มีการโกง) โดยไม่มีข้อเสียเช่นกัน

เมื่อออกแบบ 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.