MMORPGS ส่วนใหญ่มีระบบ Worldsave ที่จะบันทึกอักขระทั้งหมดทุกๆ X ชั่วโมง ฉันคิดว่าเหตุผลก็คือประสิทธิภาพ เหตุใดจึงดีกว่าประสิทธิภาพการทำงานที่ดีกว่าการบันทึกอักขระในการตัดการเชื่อมต่อ
MMORPGS ส่วนใหญ่มีระบบ Worldsave ที่จะบันทึกอักขระทั้งหมดทุกๆ X ชั่วโมง ฉันคิดว่าเหตุผลก็คือประสิทธิภาพ เหตุใดจึงดีกว่าประสิทธิภาพการทำงานที่ดีกว่าการบันทึกอักขระในการตัดการเชื่อมต่อ
คำตอบ:
นี่ไม่ใช่เพื่อประสิทธิภาพ นี่คือความล้มเหลว หากโลกบันทึกทุก ๆ สองสามนาทีถ้ามีอะไรเกิดขึ้นกับเซิร์ฟเวอร์และมันปิดตัวลงทุกคนจะสูญเสียความคืบหน้าไปเพียงไม่กี่นาที
ด้วยการบันทึกเมื่อตัดการเชื่อมต่อหากเซิร์ฟเวอร์มีปัญหาทุกคนจะสูญเสียทุกสิ่งที่ทำไปตั้งแต่เข้าสู่ระบบ สำหรับผู้ที่เล่นเป็นช่วงยาวโดยเฉพาะ (ตามปกติใน MMO) พวกเขาจะสูญเสียข้อมูลจำนวนมาก
พวกเขาเสียสละประสิทธิภาพเล็กน้อยเพื่อขจัดความเสี่ยงจากการสูญเสียข้อมูลจำนวนมาก
แน่นอนคุณสามารถจัดเก็บข้อมูลผู้เล่นบนเครื่องไคลเอนต์ได้อย่างง่ายดายลดการรับส่งข้อมูลเครือข่าย ปัญหานี่คือมันเปิดให้แฮ็ค เมื่อคนคนหนึ่งหาวิธีโกงพวกเขาแบ่งปันและทุกคนกำลังทำมัน
แก้ไข:ตามที่@Philippชี้ให้เห็นสิ่งนี้จะลบความสามารถในการทำซ้ำรายการ ด้วยระบบบันทึกการตัดการเชื่อมต่อหากมีการทำธุรกรรมก่อนเซิร์ฟเวอร์ล่มและบุคคลหนึ่งล็อกเอาต์ก่อนเกิดความผิดพลาดผู้เล่นทั้งสองจะถูกย้อนกลับไปเป็นครั้งสุดท้ายที่พวกเขาออกจากระบบไม่ว่าจะเป็นการลบรายการหรือทำซ้ำ
ระบบก่อนหน้านี้ที่บันทึกเฉพาะเมื่อตัดการเชื่อมต่อมีแนวโน้มที่จะบันทึกเป็นระยะในขณะที่โปรแกรมเล่นทำงานอยู่ ในระบบเหล่านั้นโดยทั่วไปแล้ว 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 ยังคงมีรายการเดิมในขณะที่หลังจากการส่งมอบการค้าเสร็จสมบูรณ์ ไม่มีโอกาสในการทำซ้ำเนื่องจากอักขระจะถูกบันทึกในเวลาเดียวกันตามที่รับประกันโดยฐานข้อมูล