คำถามติดแท็ก synchronization

4
การทำโหลดบาลานซ์ทำได้ใน MMO อย่างไร
ฉันเชื่อว่ามันเป็นข้อกำหนดทั่วไปของ MMOs ที่การประมวลผลสำหรับชิ้นส่วนหรืออาณาจักรเดียวสามารถทำได้ผ่านเซิร์ฟเวอร์หลายเครื่องเพื่อลดภาระ ฉันอยากรู้ว่าวิธีการนี้สามารถทำได้อย่างไรในขณะที่ยังคงรักษาโลกที่สอดคล้องกันซึ่งผู้เล่นทุกคนและ NPC ทั้งหมดสามารถโต้ตอบกันได้ คำถามของฉันคือการทำ load balancing ให้ประสบความสำเร็จใน MMO ได้อย่างไร? ลิงค์ใด ๆ หนังสือหรือข้อมูลทั่วไปเกี่ยวกับวิธีการพัฒนาความรู้ของฉันในเรื่องนี้ก็ชื่นชม

3
การซิงก์ไคลเอนต์ปริมาณการใช้งานต่ำกับเซิร์ฟเวอร์ใน MMO
ฉันใช้ MMO ที่ผู้เล่นบินไปในอวกาศบนยานอวกาศของเขาควบคุมด้วยปุ่มลูกศรและร่วมมือกับผู้เล่นคนอื่น ๆ ฉันต้องการใช้มันเพื่อให้ผู้เล่นสามารถหลบเรือของเขาจากจรวดหรืออย่างอื่นดังนั้นฉันจึงพยายามทำนายสถานะเกมทั้งหมดในฝั่งไคลเอ็นต์โดยใช้อัลกอริทึมจำลองโลกแบบเดียวกับการใช้เซิร์ฟเวอร์ โลกของเกมนั้นเขียนขึ้นบน C # และจะถูกเรียกภายในไคลเอนต์โดยตรง (มันเขียนบน Unity3D) และผ่าน CLR บนเซิร์ฟเวอร์ C ++ (ภายใต้ Linux) การเชื่อมต่อผ่าน UDP ปัญหาคือวิธีการดูแลรักษาผู้เล่น 1,000 คนในแผนที่เดียว (ไม่รวมวัตถุเกมอื่น ๆ mobs ... ): สมมติว่าฉันจะ: ซิงโครไนซ์เซิร์ฟเวอร์กับไคลเอนต์ 50 ครั้งต่อวินาที ส่งไปยังแต่ละไคลเอนต์ของวัตถุเกม (และผู้เล่น) ซึ่งเขาสามารถมองเห็นได้ (ภายในรัศมี) ต้องส่ง 100 วัตถุไปยังผู้เล่นแต่ละคนภายในรัศมีมุมมองของเขา จะต้องส่งค่าเฉลี่ย 50 ไบต์ต่อวัตถุเกม (มันเป็นรหัส, x, y coords, การหมุน, สถานะ ... ) …

5
ระบบเครือข่ายสำหรับเกมกลยุทธ์แบบเรียลไทม์
ฉันกำลังพัฒนาเกมกลยุทธ์แบบเรียลไทม์สำหรับหลักสูตรวิทยาศาสตร์คอมพิวเตอร์ที่ฉันเรียน หนึ่งในแง่มุมที่ยากกว่าของมันก็คือการเชื่อมต่อเครือข่ายและเซิร์ฟเวอร์ลูกค้า ฉันได้อ่านในหัวข้อนี้ (รวมถึงนักธนู 1500 คน ) แต่ฉันตัดสินใจใช้วิธีไคลเอ็นต์ - เซิร์ฟเวอร์ซึ่งต่างจากรุ่นอื่น ๆ (ผ่าน LAN เป็นต้น) เกมกลยุทธ์เรียลไทม์มาพร้อมกับปัญหาบางอย่าง โชคดีที่การกระทำของผู้เล่นทุกครั้งนั้นถูกกำหนดไว้แล้ว อย่างไรก็ตามมีเหตุการณ์ที่เกิดขึ้นตามช่วงเวลาที่กำหนดไว้ ตัวอย่างเช่นเกมประกอบด้วยกระเบื้องและเมื่อผู้เล่นใช้แผ่นกระเบื้อง 'ระดับพลังงาน' ซึ่งเป็นค่าบนแผ่นกระเบื้องนั้นควรเพิ่มขึ้นทีละวินาทีทุกครั้งหลังจากที่ถ่ายเสร็จ นี่เป็นคำอธิบายสั้น ๆ ที่ควรแสดงให้เห็นถึงกรณีการใช้งานของฉัน ตอนนี้ฉันกำลังทำไคลเอ็นต์แบบ thin ซึ่งเพิ่งส่งแพ็กเก็ตไปยังเซิร์ฟเวอร์และรอการตอบกลับ อย่างไรก็ตามมีปัญหาหลายประการ เมื่อเกมระหว่างผู้เล่นพัฒนาเป็น endgame มักจะมีมากกว่า 50 กิจกรรมต่อวินาที (เนื่องจากเหตุการณ์ที่กำหนดไว้อธิบายก่อนหน้าซ้อนขึ้น) และข้อผิดพลาดในการประสานเริ่มปรากฏขึ้นแล้ว ปัญหาที่ใหญ่ที่สุดของฉันคือแม้แต่ความเบี่ยงเบนเล็กน้อยในสถานะระหว่างลูกค้าอาจหมายถึงการตัดสินใจที่แตกต่างกันของลูกค้าซึ่งก้อนหิมะกลายเป็นเกมที่แยกจากกันโดยสิ้นเชิง ปัญหาอื่น (ซึ่งไม่สำคัญในตอนนี้) คือเวลาแฝงและต้องรอสองสามมิลลิวินาทีแม้แต่วินาทีหลังจากที่พวกเขาขยับเพื่อดูผลลัพธ์ ฉันสงสัยว่ากลยุทธ์และอัลกอริทึมใดที่ฉันสามารถใช้เพื่อทำให้สิ่งนี้ง่ายขึ้นเร็วขึ้นและสนุกสนานยิ่งขึ้นสำหรับผู้ใช้ สิ่งนี้น่าสนใจเป็นพิเศษเนื่องจากมีจำนวนกิจกรรมต่อวินาทีสูงพร้อมกับผู้เล่นหลายคนต่อเกม TL; DR สร้าง RTS ด้วย> 50 กิจกรรมต่อวินาทีฉันจะซิงโครไนซ์ไคลเอ็นต์ได้อย่างไร

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

2
วิธีทำให้นาฬิกาไคลเอนต์เซิร์ฟเวอร์ซิงค์กันสำหรับเกมเครือข่ายที่มีความแม่นยำเช่น Quake 3
ฉันกำลังทำงานกับนักยิงจากบนลงล่าง 2D และพยายามอย่างเต็มที่เพื่อคัดลอกแนวคิดที่ใช้ในเกมบนเครือข่ายเช่น Quake 3 ฉันมีเซิร์ฟเวอร์ที่เชื่อถือได้ เซิร์ฟเวอร์ส่งสแน็ปช็อตไปยังลูกค้า สแน็ปช็อตมีการประทับเวลาและตำแหน่งเอนทิตี เอนทิตีถูกสอดแทรกระหว่างตำแหน่งสแน็ปช็อตเพื่อให้การเคลื่อนไหวดูราบรื่น ตามความจำเป็นการแก้ไขเอนทิตีเกิดขึ้นเล็กน้อย "ในอดีต" เพื่อให้เรามีสแนปชอตหลายรายการที่จะแก้ไขระหว่าง ปัญหาที่ฉันเผชิญคือ "การซิงโครไนซ์นาฬิกา" เพื่อความเรียบง่ายเรามาเสแสร้งสักครู่ว่าไม่มีเวลาแฝงเป็นศูนย์เมื่อทำการโอนย้ายแพ็คเก็ตไปและกลับจากเซิร์ฟเวอร์ หากนาฬิกาเซิร์ฟเวอร์คือ 60 วินาทีข้างหน้าของนาฬิกาไคลเอนต์การประทับเวลาสแน็ปช็อตจะเป็น 60000ms ล่วงหน้าของการประทับเวลาโลคัลไคลเอ็นต์ ดังนั้นสแนปชอตเอนทิตีจะรวบรวมและนั่งประมาณ 60 วินาทีก่อนที่ลูกค้าจะเห็นเอนทิตีที่กำหนดใด ๆ ที่ทำให้การเคลื่อนไหวของเขาเพราะมันใช้เวลานานขนาดนั้นในการติดตามลูกค้า ฉันจัดการเอาชนะมันได้โดยการคำนวณความแตกต่างระหว่างเซิร์ฟเวอร์และนาฬิกาลูกค้าในแต่ละครั้งที่ได้รับสแนปชอต // For simplicity, don't worry about latency for now... client_server_clock_delta = snapshot.server_timestamp - client_timestamp; เมื่อกำหนดระยะเวลาในการแก้ไขเอนทิตีฉันจะเพิ่มความแตกต่างให้กับเวลาปัจจุบันของลูกค้า อย่างไรก็ตามปัญหานี้ก็คือมันจะทำให้เกิดความสะเพร่าเนื่องจากความแตกต่างระหว่างนาฬิกาทั้งสองจะเปลี่ยนแปลงอย่างฉับพลันเนื่องจากสแน็ปช็อตมาถึงเร็วกว่า / ช้ากว่าคนอื่น ฉันจะซิงโครไนซ์นาฬิกาอย่างใกล้ชิดได้อย่างไรว่าการหน่วงเวลาที่รับรู้ได้เพียงอย่างเดียวคือการเข้ารหัสแบบยากสำหรับการแก้ไขและสิ่งที่เกิดจากเวลาแฝงของเครือข่ายปกติ กล่าวอีกนัยหนึ่งฉันจะป้องกันไม่ให้การแก้ไขเริ่มต้นช้าเกินไปหรือเร็วเกินไปเมื่อนาฬิกาถูกซิงโครไนซ์อย่างมีนัยสำคัญโดยไม่มีการกระตุก แก้ไข: ตามวิกิพีเดีย NTP สามารถใช้เพื่อซิงโครไนซ์นาฬิกาผ่านอินเทอร์เน็ตได้ภายในเวลาไม่กี่มิลลิวินาที …

2
ระบบเครือข่ายผู้เล่นหลายคนพร้อมฟิสิกส์
ฉันอยากรู้ว่าระบบเครือข่ายผู้เล่นหลายคนพร้อมฟิสิกส์นั้นถูกนำไปใช้ในเกมแข่งรถ เรามีโลกที่เต็มไปด้วยยานพาหนะที่เคลื่อนไหวเร็วซึ่งควบคุมโดยผู้คนที่แตกต่างกัน สมมติว่ายานพาหนะมีอาวุธและสามารถยิงซึ่งกันและกัน (Twisted Metal, Vigilante v8) ฉันกังวลเกี่ยวกับเพลงฮิตและการปะทะกัน เซิร์ฟเวอร์ที่เชื่อถือได้หรือเป็นทางเลือกที่ดีกว่า

2
วิธีซิงโครไนซ์การกระทำเช่นการกระโดดในผู้เล่นหลายคนได้อย่างไร
ฉันเป็นนักพัฒนาเกมมือใหม่และฉันค้นคว้าเกี่ยวกับเกมที่มีผู้เล่นหลายคน ฉันสังเกตว่ามันมีเวลาแฝงอยู่เสมอผู้เล่นจะได้รับการอัพเดตจากการกระทำในอดีตเสมอ แต่มีเทคนิคต่าง ๆ เช่นการคำนวณคนตายเพื่อจัดการเวลาแฝง ฉันสามารถทำนายการเคลื่อนไหวและทำให้การเคลื่อนไหวราบรื่น แต่ฉันจะทำให้การประสานเหมือนกระโดดหยุดเดินได้อย่างไร สมมติว่าลูกค้า A กำลังเคลื่อนไหวเขาอยู่ที่ 100m ในเวลา 10.2 ด้วยความเร็ว 100m / วินาทีและส่งข้อมูลนี้ ลูกค้า B จะได้รับข้อมูลนี้ในภายหลังให้เป็น 10.4 ดังนั้นที่ลูกค้า B ฉันสามารถใช้การคาดการณ์และวางลูกค้า A ที่ 120m แต่ถ้าลูกค้าทำกระโดดได้ที่ 110m ที่ 10.3 ฉันไม่สามารถคาดการณ์ได้และเนื่องจากฉันใช้การคาดการณ์ฉันจึงไม่สามารถแสดงให้ลูกค้า A กระโดดข้ามไปในอดีต ฉันอาจจัดการกับปัญหานี้โดยไม่ส่งการกระทำข้ามเลย แต่ถ้าเกมของฉันมีช่องว่างบางอย่างที่ผู้เล่นสามารถล้มและตาย ดังนั้นถ้าฉันไม่ซิงค์แอคชั่นกระโดดผู้เล่นคนอื่นจะสังเกตเห็นว่าผู้เล่นคนหนึ่งกำลังทำงานอยู่เขาจะตกเป็นโมฆะและปรากฏบนหน้าจออีกครั้งเพื่อทำลายการมีส่วนร่วมทางสายตา Jump เป็นเพียงตัวอย่างอาจมีหลายสถานการณ์ที่การทำนายไม่สามารถทำได้ ดังนั้นจะจัดการกับพวกเขาอย่างไร ตัวอย่างหนึ่งดังกล่าวสามารถเป็นได้หลายเกมออนไลน์เวทีการต่อสู้เช่น Awesomenauts

1
การแลกเปลี่ยนข้อความไคลเอนต์เซิร์ฟเวอร์เซิร์ฟเวอร์และการซิงโครไนซ์นาฬิกา
ฉันกำลังทำเกมฟิสิกส์ที่รวดเร็วซึ่งเป็นตารางฮอกกี้ ด้วยค้อนสองตัวและลูกซนหนึ่งตัว เกมทำงานบน iphone / ipad และฉันกำลังเล่นเกมหลายคนผ่าน GameCenter นี่คือการทำงานของระบบเครือข่าย ลูกค้าที่เป็นดาวจับคู่จะถูกตัดสินในฐานะเซิร์ฟเวอร์และลูกค้าที่ยอมรับคำขอแข่งขันคือลูกค้า 'เซิร์ฟเวอร์' มีการทำงานของฟิสิกส์และการตอบสนองนั้นเกิดขึ้นทันทีและไคลเอนต์ก็มีการทำงานของฟิสิกส์เพื่อให้ดูราบรื่นระหว่างการแลกเปลี่ยนข้อความ สิ่งที่ฉันทำในฐานะเซิร์ฟเวอร์คือฉันส่งไปยังลูกค้าความเร็วลูกตุ้มของฉันและตำแหน่งของฉันและลูกค้าปรับความเร็ว / ตำแหน่งเด็กซนของเขาที่เกี่ยวข้องกับเซิร์ฟเวอร์เพื่อให้มันซิงค์ ไม่เช่นนั้นฟิสิกส์จะซิงโครไนซ์และมันไขสกรูขึ้น เมื่อเวลาในการตอบสนองของเครือข่ายดีผล 100 มิลลิวินาทีนั้นค่อนข้างดีฉันได้เกมที่เล่นได้อย่างราบรื่นทางฝั่งไคลเอ็นต์และพฤติกรรมแปลก ๆ นั้นน้อยที่สุด ปัญหาเกิดขึ้นเมื่อความล่าช้าอยู่ที่ประมาณ 150 ถึง 200ms ในกรณีดังกล่าวเกิดขึ้นที่ลูกค้าของฉันเด็กซนชนขอบและทิศทางกลับหัว แต่มันได้รับข้อความล่าช้าจากเซิร์ฟเวอร์และมันกลับเล็กน้อยทำให้เกิดความรู้สึกแปลก ๆ กับพฤติกรรมลูก ฉันได้อ่านบางสิ่งเกี่ยวกับเรื่องนี้: โป่งเครือข่ายตัวอย่าง คลิกตัวอย่างการซิงโครไนซ์ Wikipedia เกี่ยวกับ Clock Sync ดังนั้นฉันจะแก้ปัญหานี้อย่างไร เท่าที่ฉันได้อ่านตัวเลือกที่ดีที่สุดที่ฉันต้องทำคือการซิงโครไนซ์นาฬิกาบนเซิร์ฟเวอร์ / ไคลเอ็นต์ด้วยการประทับเวลาเพื่อที่เมื่อฉันได้รับข้อความหน่วงเวลาที่เกี่ยวข้องกับนาฬิกาของฉันฉันก็ไม่สนใจแล้วปล่อยให้ลูกค้าจำลอง งาน. พวกคุณเห็นด้วยไหม? และเนื่องจากฉันกำลังส่งข้อมูลที่ไม่น่าเชื่อถือ (UDP) ฉันอาจได้รับข้อความหรือข้อความล่าช้า หากเป็นวิธีที่ดีที่สุดฉันจะใช้การซิงโครไนซ์นาฬิกาได้อย่างไร ฉันอ่านขั้นตอนเกี่ยวกับวิธีการ แต่ฉันไม่เข้าใจมันมากนัก มันบอกว่า: ลูกค้าประทับเวลาท้องถิ่นปัจจุบันบนแพ็กเก็ต …

3
ฉันจะซิงค์สถานะเกมแบบผู้เล่นหลายคนได้อย่างมีประสิทธิภาพกว่าการอัพเดทแบบเต็มได้อย่างไร
ฉันเคยทำการเข้ารหัสเครือข่ายเกมมาก่อน แต่ส่วนใหญ่ใช้ TCP สำหรับเกมโดยไม่ต้องใช้เวลาจริง ฉันกำลังทำงานกับเกม 2D Java ที่มีผู้เล่นหลายคนบนเครือข่าย เพื่อการเรียนรู้ฉันต้องการทำสิ่งนี้ด้วยตัวเองโดยไม่มี API เครือข่ายที่มีอยู่ ฉันจะแสดงสถานะเกมที่ส่งถึงลูกค้าจากเซิร์ฟเวอร์ได้อย่างมีประสิทธิภาพได้อย่างไร มีมากที่สุดที่เห็นได้ชัด แต่อาจน้อยกว่าวิธีที่มีประสิทธิภาพซึ่งจะสร้างบางประเภทของวัตถุบริบทเกมของรัฐที่มีสถานที่ตั้งของผู้เล่นแต่ละรัฐนิเมชั่น ฯลฯ และส่งออกที่ผู้เล่นแต่ละคนคือการปรับปรุงทุก ดูเหมือนจะไม่ยากอย่างยิ่งที่จะใช้งาน แต่อาจมีขนาดใหญ่เกินไปที่จะบรรลุสิ่งที่ใกล้เคียงกับการโต้ตอบแบบเรียลไทม์ (แน่นอนว่าประสบการณ์ของฉันเกี่ยวกับสิ่งนี้ จำกัด ดังนั้นฉันอาจไม่ถูกต้อง) มีวิธีที่มั่นคงที่คุณเคยใช้มาก่อนในการส่งการเปลี่ยนแปลงในสถานะและมีความแตกต่างมากพอในการปฏิบัติงานที่มีค่างานพิเศษหรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.