บ่อยแค่ไหนที่จะบันทึกสถานะของผู้เล่นในเกมออนไลน์แบบถาวร?


9

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

มันเหมาะสมหรือไม่ที่จะบันทึกพิกัดและสถานะของผู้เล่นทุกครั้งที่ส่ง เซิร์ฟเวอร์node.jsของฉันสามารถทำได้อย่างง่ายดายโดยไม่ต้องปิดกั้นการตอบสนองและฉันต้องการใช้ฐานข้อมูล Mongo แต่อาจเหมาะสมกว่าถ้าทำครั้งที่สองและในเหตุการณ์ทั่วทั้งเซิร์ฟเวอร์


ฉันบันทึกสถานะเกมทุก 10 วินาที ฉันคิดว่าเพียงพอแล้วมันก็ไม่มีใครสังเกตเห็น (และฉันใช้เซิร์ฟเวอร์ MMORPG ของฉันบนเน็ตบุ๊กของฉันที่มี RAM 512Mb)
jcora

คำตอบ:


10

ฉันมีในใจ MMORPG ดั้งเดิมเช่น World of Warcraft

บันทึกหลังจากทุกคำสั่งจากผู้เล่นแต่ละคนและสิ่งที่เป็นอิสระ (เช่น NPC)

  • สำรองข้อมูลอย่างต่อเนื่อง เซิร์ฟเวอร์สามารถลงไปได้ทุกเวลาและสถานะของเกมจะถูกบันทึกจนถึงช่วงเวลานั้น (หรือเร็วที่สุดเท่าที่จะทำได้)
  • ส่งผลกระทบต่อประสิทธิภาพของเซิร์ฟเวอร์ แม้ว่าจะไม่ใช่การบล็อก (เช่นในเธรดอื่น) แม้ว่าฐานข้อมูลจะอยู่บนเซิร์ฟเวอร์อื่น แต่เป็นการประมวลผลที่คุณไม่ควรทำ หากไม่ใช่การปิดกั้นอย่างที่คุณพูดคุณจะต้องจัดการกับเธรดอื่นและนั่นเป็นเธรดที่สามารถครอบครองได้ด้วยสิ่งอื่น
  • เพิ่มดิสก์ I / O ซึ่งเป็นการเพิ่มความเสี่ยง / อัตราความล้มเหลว นี่เป็นข้อกังวลโดยเฉพาะอย่างยิ่งถ้าคุณใช้ SSD สำหรับจัดเก็บเนื่องจากอายุการใช้งานลดลง
  • หากคุณถ่ายโอนฐานข้อมูลไปยังเซิร์ฟเวอร์อื่นจากนั้นเพิ่มแบนด์วิดท์ นี่อาจเป็นเรื่องที่น่ากังวลถ้าคุณจ่ายแบนด์วิดท์และหากมันไม่ได้อยู่ในการ์ดเครือข่ายแยกต่างหากก็เป็นการใช้ทรัพยากรที่ดีกว่าที่จะนำมาใช้ในการจัดการทราฟฟิกของผู้เล่น
  • จะเกิดอะไรขึ้นหากเซิร์ฟเวอร์ทำงานได้ไกลและไกลกว่าเดิมในการบันทึกสถานะคำสั่งเหล่านี้ คือถ้ามีคำสั่งเพิ่มเติมเข้ามามากกว่าที่จะถูกบันทึกไว้ดังนั้นพวกมันจึงซ้อนกันอยู่ในคิว? คิวนี้ล้นและทำให้เกิดข้อผิดพลาดหรือไม่? คุณหยุดทุกอย่างเพื่อให้คิวสามารถติดตามได้หรือไม่
  • สำหรับฉันแล้วดูเหมือนว่าวิธีนี้ในขณะที่ฟังดูง่ายจะต้องมีการวางแผนอย่างรอบคอบ ตัวอย่างเช่นคำสั่งที่ต่อเนื่องที่ต้องพึ่งพาซึ่งกันและกันจะต้องถูกบันทึกไว้ด้วยกัน มิฉะนั้นความล้มเหลวอาจเกิดขึ้นกลางคำสั่งและจะมีเพียงหนึ่งคำสั่งเท่านั้นที่จะได้รับการบันทึก พิจารณาว่าผู้เล่นสองคนทำการซื้อขายและคำสั่งสองคำสั่งถูกบันทึกลงในดิสก์หรือไม่: "เพิ่ม 1 รายการไปยังผู้รับ" และ "ลบ 1 จากรายการจากผู้ส่ง" หากความล้มเหลวเกิดขึ้นหลังจากคำสั่งแรก แต่ก่อนที่จะบันทึกคำสั่งที่สองคุณจะมีการทำซ้ำรายการ (หากมีการกลับรายการคำสั่งซื้อแสดงว่าคุณมีรายการที่หายไป)

บันทึกทุกอย่างเป็นระยะ

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

บันทึกอักขระเมื่อออกจากระบบ (อย่าบันทึกสิ่งอื่น)

  • สิ่งที่สำคัญที่สุดสำหรับผู้เล่นคือตัวละครของพวกเขาซึ่งรวมถึงไอเท็มที่พวกเขามีทักษะที่พวกเขาได้รับรายชื่อเพื่อนและอื่น ๆ หากพวกเขาฆ่าสัตว์ประหลาดและปล้นสะดมอยู่ข้างหน้าพวกเขาและจากนั้นเซิร์ฟเวอร์ก็ล้มเหลวพวกเขาจะอกหักเล็กน้อยที่ไม่มีโอกาสหยิบปล้น แต่พวกเขาจะได้รับมัน ดังนั้นเพียงบันทึกสิ่งที่สำคัญและไม่ต้องกังวลกับสิ่งเล็ก ๆ น้อย ๆ อย่าบันทึกตำแหน่งของ NPC ตัวอย่างเช่น หากเซิร์ฟเวอร์หยุดทำงานเมื่อมันกลับมาพวกเขาจะวางไข่ในพื้นที่ทั่วไปที่ควรจะเป็นข้อยกเว้นแน่นอนสำหรับ NPC ที่ "ฉลาด" ที่มีเหตุผลบางอย่างที่ต้องอยู่ในที่ที่พวกเขาอยู่ เมื่อเซิร์ฟเวอร์ลงไป
  • นอกจากนี้ผู้เล่นไม่ควรลงชื่อเข้าใช้เป็นเวลาหลายชั่วโมงเกินไป (โปรดทราบว่าที่นี่ฉันกำลังพิจารณาว่า "จะกลับไปที่ล็อบบี้" เป็นการออกจากระบบ) ในที่สุดพวกเขาจะต้องหยุดพักห้องน้ำหรือรับอาหารหรือถูกขัดจังหวะโดยผู้ปกครอง / เพื่อน / อะไรก็ตามหรือนอนหลับ ดังนั้นพวกเขาจึงไม่ควรทำการล็อกออนอย่างไม่หยุดยั้งเกินกว่าจะพูดจริง ๆ 8 ชั่วโมงสำหรับนักเล่นเกมตัวยงที่สุด หาก "ผู้เล่น" เข้าสู่ระบบเป็นระยะเวลานานจริงๆมีโอกาสที่จะเป็นได้ทั้งคนหลายคนหรือบอทและไม่มีใครที่ต้องการหรือปกติ
  • นอกจากนี้กระบวนการออกจากระบบของคุณควรตรวจสอบสิ่งต่าง ๆ เช่นคำสั่งที่กล่าวถึงข้างต้นแล้ว โดยพื้นฐานแล้วมันควรจะมีการบรรจุตัวละครไว้อย่างชัดเจนดังนั้นจึงเป็นเวลาสำคัญที่จะถ่ายโอนข้อมูลไปยังดิสก์

ปิดความคิด

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

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


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

@NtscCobalt - ฉันอยู่กับคุณจนถึง "ฐานข้อมูลสไตล์ SQL" SQL เป็นข้อกำหนดจริงๆหรือไม่? แล้ว NoSQL ล่ะ?
beatgammit

@tjameson ความคิดเห็นของฉันถูกเขียนก่อนที่ฉันจะได้สัมผัส NoSQL ฉันแค่พยายามจะบอกว่าคุณไม่ควรม้วนรูปแบบของคุณเอง แต่อย่างไรก็ตามฉันยังคงแนะนำ SQL เพราะคุณควรรู้สคีมาก่อนมือ (หรือขี้เกียจและใช้ Entity-Key-Value) และความสอดคล้องมีความสำคัญมากกว่า ความสามารถในการแบ่งพาร์ติชันข้อมูลนั้น ดูstackoverflow.com/questions/7339374/…สำหรับข้อมูลเพิ่มเติม
NtscCobalt

1

ฉันคิดว่ามันขึ้นอยู่กับประเภทของเกมปริมาณการรับส่งข้อมูลระหว่างผู้เล่นและเซิร์ฟเวอร์

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

ในเกมเทิร์นเบสมันจะสมเหตุสมผลที่จะรักษาสถานะของผู้เล่นทุกครั้งที่พวกเขาจบเทิร์นของพวกเขาเช่นเดียวกับหลังจากเทิร์นของผู้เล่นฝ่ายตรงข้าม (บันทึกการสูญเสียสุขภาพ, ผลกระทบจากการสะกดคำ ฯลฯ )

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


1

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

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


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

ปัญหาของการบอกเมื่อผู้เล่นออกจากระบบในเกมเบราว์เซอร์ที่ใช้งานมานานจริงๆแล้วไม่ใช่เรื่องเล็กน้อย
Lanbo

ฉันเห็นด้วยว่ามันไม่สำคัญ แต่ก็เป็นปัญหาที่คุณต้องพูดไม่ทางใดก็ทางหนึ่งในเกมส่วนใหญ่ต่อไปแม้ว่าจะเป็นเพียงการตัดสินใจว่าภาพประจำตัวของพวกเขาจะไม่ปรากฏอีกต่อไปก็ตาม เมื่อดำเนินการเสร็จแล้วควรเป็นเรื่องง่าย ๆ ที่จะขอเข้าร่วมในสถานการณ์นั้นและบันทึกตำแหน่งที่ถูกต้องล่าสุด
Lunin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.