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


18

ฉันมีระบบที่มีสิทธิ์ซึ่งเมื่อผู้เล่นเข้าร่วมการแข่งขันมันจะได้รับวัตถุที่เกิดแล้วทั้งหมด - กลับกลายเป็นตัวของมันเอง (ลูกค้า)

ดูเหมือนว่านี้:

  1. Client ส่งโทเค็นการเข้าถึงไปที่ Server
  2. Client ได้รับการยอมรับจาก Server
  3. Client สลับฉากกับฉากเกม
  4. Serverส่งผู้เล่น, ลัง, วัตถุที่คุณสามารถโต้ตอบด้วยเพื่อให้clientสามารถวางไข่และแสดงพวกเขา

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

ฉันคิดว่า - เราดี แต่ไม่ควรซิงโครไนซ์สภาพแวดล้อมด้วย? จะเชื่อมต่อเครือข่ายอย่างใด? เป็นเจ้าของเซิร์ฟเวอร์หรือไม่

มาดูLeague of Legendsกัน:

ป้อนคำอธิบายรูปภาพที่นี่

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


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

คำตอบ:


41

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

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

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


21
โปรดทราบว่าคำตอบนี้เน้นที่สินทรัพย์คงที่เท่านั้น สินทรัพย์ที่สร้างขึ้นแบบไดนามิก / ผู้เล่น (เช่น Minecraft world chunks หรือโลโก้ guild MMORPG ที่ผู้เล่นสามารถอัปโหลด) จะต้องถูกส่ง แต่ถึงอย่างนั้นก็มักจะพยายามลดจำนวนข้อมูลที่จำเป็น (เพื่อดำเนินการต่อตัวอย่าง Minecraft: ส่งการอัปเดตบล็อกแทนทั้งชิ้นโดยระบุประเภทบล็อก / สถานะและประสานงานที่เปลี่ยนแปลง) และ / หรือแคชข้อมูลในฝั่งไคลเอ็นต์ .
hoffmale

@hoffmale ใช่จุดดี; คำถามที่กล่าวถึงภูมิประเทศนั้นไม่คงที่ในตอนท้ายดังนั้นฉันไม่คิดว่าจะยกประเด็นนั้น แต่มันก็เป็นเรื่องที่ดี

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

4
และตัวอย่างเช่นหากคุณต้องการวางต้นไม้แบบสุ่มบนแผนที่แทนที่จะส่งพิกัดของต้นไม้ไปยังลูกค้ามันจะส่งเมล็ด (ของตัวสร้างตัวเลขสุ่ม) ไปยังลูกค้า
Grant Davis

5

ขึ้นอยู่กับปัจจัยหลายประการรวมถึงประเภทของเกม (ฉันจะถือว่า RTS ที่นี่แม้ว่า MMO โลกเปิดจะขึ้นอยู่กับใจ) สถานะภูมิประเทศพื้นฐานต่อผู้เล่นผู้เล่นจะถูกส่งไปยังการเชื่อมต่อหรือเป็นส่วนหนึ่งของสินทรัพย์ของลูกค้า - ลองนึกถึงเกม RTS ที่แผนที่จัดส่งมาพร้อมกับไคลเอนต์หรือดาวน์โหลดก่อนเริ่มเกม

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

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

หลังจากนั้นมีวิธีทั่วไปเล็กน้อยที่จะซิงค์อยู่:

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

4

สำหรับคำถามที่ถูกถามของคุณฉันไม่ทราบว่า League of Legends จัดการกับมันได้อย่างไร ฉันไม่เคยเล่นเกมนั้นดังนั้นฉันจึงไม่สามารถแนะนำได้ว่าจะต้องเล่นหรือไม่

แต่โดยทั่วไปแล้วคำตอบสำหรับคำถามของคุณนั้นค่อนข้างง่ายและตรงไปตรงมา:

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

ในทางกลับกันหากข้อมูลจะเปลี่ยนแปลงตลอดเวลาหรือหากคุณต้องการเปิดตัวเลือกนั้นไว้คุณมีตัวเลือกในเรื่องจริงหรือไม่? สำหรับกรณีนี้คุณต้องส่งข้อมูล มิฉะนั้นลูกค้าไม่มีสิ่งที่ต้องการ

สิ่งนี้ใช้กับการสื่อสารเครือข่ายทั้งหมดไม่ใช่แค่ข้อมูลภูมิประเทศ ทุกอย่าง


2

เลขที่

ฉันได้ทำเรื่องเกี่ยวกับการขุดในแหล่งที่มาของ League of Legends และทุกอย่างรวมถึงรุ่น Champion, Shopkeeper, พื้นหลังแผนที่ทั่วไปและสิ่งมีชีวิตปุยที่เพิ่มเข้ามาหลังจากความเป็นจริง (เช่นกระรอกน้อยบนหินบางชนิดและหอยทาก แม่น้ำ) จะถูกเก็บไว้ที่ฝั่งลูกค้า ความจริงที่ว่าลูกค้ามีทุกรุ่นเหล่านี้เป็นหนึ่งในเหตุผลที่ LoL มีขนาดใหญ่เป็นกิกะไบต์

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

แล้วมันจะแก้ไขได้อย่างไร? ผู้เล่นแต่ละคนจะส่งเฉพาะข้อมูลที่มีความสำคัญต่อผู้เล่นอื่นในเกมไปยังเซิร์ฟเวอร์ ไม่มีใครจำเป็นต้องรู้ว่าคุณมีเวลา 5 วินาทีในคูลดาวน์ Q หรือว่า Deep Terror Thresh Skin สร้างฟองอากาศให้คุณ สิ่งที่ผ่านเข้ามาในเกมเป็นสิ่งที่ชอบ Vel'Koz casted Q, Viktor ย้ายไปทางซ้าย ฯลฯ ...

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

บันทึก:

หากคุณต้องการดูสิ่งที่ลูกค้ามีอยู่และดังนั้นเซิร์ฟเวอร์จึงไม่ผ่านคุณให้ค้นหาโฟลเดอร์ C: \ Riot Games \ RADS \ lol_Game_Client \ Projects (ซึ่งอาจจะน้อยไปก็ได้โปรดยกโทษฉันด้วย ' ฉันทำงานออกจากหน่วยความจำในขณะนี้) และค้นหาไฟล์ .RAF unpacker ออนไลน์ จากนั้นคุณสามารถเห็นทุกสิ่งที่อยู่ในพื้นที่เช่นการโหลดหน้าจอกระเด็นและพื้นผิวผิวแม้แต่โครงกระดูกแชมป์เปี้ยน


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

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

2
สำหรับเกมที่มีผู้เล่นหลายคน? ภัยพิบัติที่แท้จริง คุณไม่ต้องการให้ผู้เล่นคนอื่นทุกคนรอที่จะเริ่มเกมเพราะคนคนหนึ่งต้องดาวน์โหลดเนื้อหาบางอย่างที่พวกเขาไม่เคยต้องการมาก่อน
Anthony Grist

1
@AnthonyGrist นั่นเป็นสาเหตุว่าทำไมหลาย ๆ เกมอย่าง League of Legends ต้องการให้ผู้เล่นดาวน์โหลดสินทรัพย์เกมทั้งหมดก่อนที่จะเข้าร่วมคิวเพื่อค้นหาการแข่งขัน สิ่งนี้ได้ผลดีกว่าการเล่นเกมช้าในขณะที่คุณรอสินทรัพย์ขนาดใหญ่ โปรดทราบว่าในเกมประเภทนี้ผู้เล่นตื่นเต้นกับการ ping ที่ลดลง 10 มิลลิวินาทีและมักจะเล่นกับ <50 ms ของ ping และสามารถบอกได้ว่ามันกระโดดข้ามระยะ 100 ถึง 150 หรือไม่ การรอเอาทรัพย์สินออกมาระหว่างเกมจะเป็นหายนะใน MOBA หรือ FPS และถ้ามันเกิดขึ้นในเวลาที่ไม่ถูกต้องมันอาจเปลี่ยนผลลัพธ์ของเกมได้
JustWannaFly

@AnthonyGrist (ต่อ) ฉันคิดว่าคุณคงคิดแบบนี้ได้ ในเกมแบบผู้เล่นหลายคน / แข่งขันกันผู้เล่นแลกเปลี่ยนเวลาในการโหลด / การติดตั้ง / ติดตั้งอีกต่อไปเพื่อประสบการณ์การเล่นเกมแบบเรียลไทม์มากขึ้นโดยให้ลูกค้าดูแลการอัพเดทและการเข้าคิวทั้งหมด สิ่งนี้ทำให้ผู้เล่นเฉพาะที่ต้องการสินทรัพย์ต้องรอจนกว่าเขาจะต้องการเข้าร่วมปาร์ตี้ที่เตรียมไว้ผู้เล่นทุกคนในปาร์ตี้จะต้องรอเข้าแถวเพื่อหาคู่ต่อสู้
JustWannaFly

1

ตัวอย่างของที่นี้ที่ไม่ได้ทำคือ Elder Scrolls ออนไลน์ที่จะไว้วางใจของลูกค้าเกี่ยวกับระดับความสูงของระดับพื้นดิน

นักขุดทองลดลงระดับพื้นดินหลายฟุต จากนั้นพวกเขาสามารถเดินไปรอบ ๆ "ใต้" ภูมิประเทศและขุดทรัพยากรจากด้านล่างโดยไม่ถูกพีซีเห็นหรือถูกโจมตีโดย NPC

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

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

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


1
TL; DR: เสมอสมมติว่าลูกค้าเป็นโกหกโกงอีแร้ง แต่การตรวจสอบเซิร์ฟเวอร์ของทุกสิ่งช่วยลดความสามารถของคุณ
Draco18s
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.