กระสุนทำงานในวิดีโอเกมอย่างไร


64

ฉันเจอคำถามนี้เมื่อฉันออกแบบวิดีโอเกมใน C #

หากเราพิจารณาเกมเช่นBattlefieldหรือCall of Dutyกระสุนหลายร้อยหรือหลายพันกระสุนกำลังบินในเวลาเดียวกัน เหตุการณ์ถูกเรียกใช้อย่างต่อเนื่องและจากสิ่งที่ฉันรู้สิ่งนี้ดูดพลังการประมวลผลมากมาย ... หรือไม่? ฉันต้องการทราบว่านักพัฒนาเกมต่าง ๆ จัดการกับสัญลักษณ์แสดงหัวข้อย่อย (2D และ 3D) และวิธีที่มีประสิทธิภาพที่สุดสำหรับแต่ละรายการอย่างไร

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

ฉันมีความคิดสองสามข้อ แต่ก็มีข้อเสีย:


วิธีที่มีประสิทธิภาพที่สุดที่ฉันคิดได้ (สำหรับเกม 2D):

สมมติว่าฉันต้องสร้างคลาสที่ชื่อว่า Bullet แต่ผู้ใช้กดปุ่มค้างไว้นาน 0.01 วินาทีทุกครั้งที่มีการสร้างวัตถุ Bullet กระสุนนี้มี:

  • 1ความเร็ว

  • 2ตำแหน่งเริ่มต้นของตำแหน่งที่มันถูกยิงจาก

  • 3 Sprite เนื้อ

  • 4เอฟเฟกต์ที่โจมตี

เนื่องจากสัญลักษณ์แสดงหัวข้อจะเป็นคลาสของตัวเองจึงสามารถจัดการการวาดการเคลื่อนไหวและการดำเนินการฟังเอง

หน่วยประมวลผลจะไม่สามารถประมวลผลวัตถุนับพันรายการได้ยากหรือไม่แล้วจะถูกทำลาย (เมื่อมีการเรียกใช้เอฟเฟกต์เมื่อโจมตี) พื้นที่แรม?


วิธีการที่มีประสิทธิภาพสำหรับเกม 3D - อีกหนึ่งความคิดที่ฉันมีคือ:

ให้บอกว่าฉันสร้างคลาสอาวุธ อาวุธนี้มีคุณสมบัติหลากหลายซึ่งบางส่วน:

  • 1ตรวจสอบว่าอาวุธเล็งไปที่ใดและตัดสินว่ามองเป้าหมายหรือไม่

  • 2เรียกภาพเคลื่อนไหวของการยิงปืน

  • 3มีเมธอด doDamage () ที่บ่งบอกบางสิ่งที่จะลบความแข็งแรงออกจากสิ่งที่ปืนชี้ไป

  • 4แจ้งคลาสกระสุนเคลื่อนไหวเมื่อกดปุ่ม

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


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

คำถามของฉันคือผู้สร้างเกมมีประสิทธิภาพมากที่สุดทำอะไร? วิธีนี้เปลี่ยนจากเกม 2D เป็น 3D หรือไม่?


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

42
สัญลักษณ์แสดงหัวข้อย่อยมักจะทำงานผ่านpew-pew-pewเทคโนโลยี :)
MonkeyZeus

5
ไม่เคยมีกระสุนหลายแสนเที่ยวบินในเวลาเดียวกัน ไม่มีปืนที่ยิงพวกมันเร็วขนาดนั้น แม้แต่พรรคพลังอันยิ่งใหญ่ก็พุ่งทะลุ 75 กระสุนต่อวินาที ตาม "ช่วงการยิงที่มีประสิทธิภาพ" ที่ระบุในวิกิพีเดียกระสุนนั้นบินได้นานที่สุดประมาณ 3 วินาทีดังนั้นกลุ่ม Phalanx สามารถวางกระสุนได้ 225 ครั้งในอากาศในคราวเดียว M16 มียอดออกมาประมาณ 12 รอบ / วินาทีและไม่สามารถรักษาอัตรานั้นไว้ได้ (สูงสุดสำหรับไฟที่ยั่งยืนคือ 0.25 รอบ / วินาที) มีเพียงไม่กี่กระบอกที่ยิงได้ในคราวเดียว!
Cort Ammon

3
เพียงเพื่อชี้ให้เห็นว่ามันไม่เคยดีที่จะทำให้วัตถุคลาสแต่ละคลาสเมื่อพวกมันง่าย มันจะดีกว่าที่จะมีหนึ่งอินสแตนซ์ bulletField สำหรับแต่ละประเภทของกระสุน ค่าใช้จ่ายเล็กน้อยในความยาวรหัสและ whatnot จะช่วยให้คุณเพิ่ม 4 ไบต์ต่อคำ bullet (ถ้าประเภทเป็นจำนวนเต็ม) นอกจากนี้วัตถุหนึ่งสามารถสแกนรายการได้อย่างง่ายดาย
The Great Duck

4
@Cort - นั่นเป็นเรื่องจริงถ้ามีอาวุธปืนเพียงหนึ่งเดียวในพื้นที่เกม เกมที่กล่าวถึง OP เช่น Battlefield และ CoD ที่ผู้เล่นหลายคนสามารถยิงปืนอัตโนมัติได้ในเวลาเดียวกัน มันไม่มีเหตุผลที่จะมีตัวเลขที่ไร้สาระถ้าแต่ละรอบจริง ๆ คิดเป็นร่างกายในอวกาศ
Jesse Williams

คำตอบ:


78

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

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

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

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

  4. พวกมันมีอายุการใช้งานคงที่ / ช่วงดังนั้นฉันสามารถหมดอายุกระสุนเก่าและรีไซเคิลหน่วยความจำเป็นกระสุนใหม่ได้อย่างรวดเร็ว

  5. เมื่อพวกเขาตีอะไรบางอย่างฉันก็สามารถหมดอายุพวกเขาดังนั้นพวกเขาจึงมีชีวิตที่ จำกัด

  6. เนื่องจากเรารู้ว่ามันถูกสร้างขึ้นมาเมื่อใดหากเราต้องการสิ่งใหม่และเราไม่มีรายการว่างในรายการที่จัดสรรไว้ล่วงหน้าของฉันฉันสามารถคว้าสิ่งที่เก่าแก่ที่สุดและรีไซเคิลได้และผู้คนจะไม่สังเกตเห็นว่ากระสุนหมดอายุเร็ว .

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

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


12
ฉันต้องไม่เห็นด้วยกับ 5) ซึ่งอันที่จริงก็แค่ทำให้ทุกอย่างซับซ้อนขึ้นในเกมสมัยใหม่ ในนักกีฬารุ่นก่อนหน้านี้เป็นที่ยอมรับทุกวันนี้แม้แต่ COD ก็อนุญาตให้ผู้เล่นยิงทะลุกำแพงไม้ได้ 6) จะยอมรับไม่ได้สำหรับระบบการแข่งขันใด ๆ แม้ว่ามันจะเป็นปัญหาที่หายาก
SBoss

17
@SBoss ใช้ถ้อยคำใหม่: "เมื่อพวกเขาตีสิ่งที่พวกเขาไม่สามารถเจาะทะลุได้ฉันก็สามารถทำให้พวกเขาตายได้ดังนั้นพวกเขาจึงมีอายุการใช้งานที่ จำกัด " และสำหรับ 6 คนคุณจะได้รับกรณีที่เลวร้ายที่สุดโดยกำหนดอัตราการยิงสูงสุดต่อตัวละครและจากนั้นรักษาความยาวnum_characters * max_bullets_per_character
ratchet freak

14
@Soss ฉันคิดว่า # 6 เหมาะสำหรับเช่น เกมอวกาศจากบนลงล่างซึ่งกระสุนที่เคลื่อนไหวช้าอาจเดินทางไกลออกไปนอกจอก่อนที่จะโจมตีบางสิ่ง / หายไป เห็นได้ชัดว่ามันไม่ใช่ปัญหาในเกมประเภท CoD ที่กระสุนปืนเคลื่อนที่อย่างรวดเร็วและไปถึงขอบเขตของโลก
BlueRaja - Danny Pflughoeft

1
เกมส่วนใหญ่ไม่ได้ทำสัญลักษณ์แสดงหัวข้อย่อย (ballistic ภายนอก) เลย เกมส่วนใหญ่ใช้เทคนิคที่เรียกว่า "การสแกน Hit"
Aron

45

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

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

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

ในฐานะที่เป็นสำหรับการจัดการการชนกันระหว่างกระสุนกระสุนและวัตถุอื่น ๆ ในเกมตรวจสอบการชนได้ง่ายมากโดยการเรียงลำดับวัตถุของคุณให้เป็นรูปสี่เหลี่ยมหรือoctrees Octrees ใช้เป็นหลักในเกม 3 มิติในขณะที่ quadtrees สามารถใช้ในเกม 2d หรือ 3d ข้อดีของการใช้หนึ่งในต้นไม้เหล่านี้คือคุณสามารถลดจำนวนการตรวจสอบการชนกันได้อย่างมาก ตัวอย่างเช่นหากคุณมี 20 วัตถุที่ใช้งานในระดับโดยไม่ต้องใช้หนึ่งในต้นไม้เหล่านี้คุณจะต้องตรวจสอบทั้งหมด 20 สำหรับการปะทะกันด้วยกระสุน การแบ่ง 20 วัตถุระหว่างใบไม้ (โหนดสิ้นสุด) ของต้นไม้และคุณสามารถลดจำนวนเช็คลงไปได้อย่างไรก็ตามมีหลายหน่วยงานที่อยู่ในใบไม้เดียวกันกับสัญลักษณ์แสดงหัวข้อย่อย

สำหรับวิธีการเหล่านี้ - hitscan และ projectile ทั้งสองสามารถใช้ได้อย่างอิสระในเกม 2d หรือ 3d ขึ้นอยู่กับว่าอาวุธคืออะไรและผู้สร้างตัดสินใจว่าอาวุธจะทำงานได้อย่างไร


ข้อมูลเกี่ยวกับรูปแบบการออกแบบ Hitscan และ quad / octrees ช่วยได้จริงๆ ขอบคุณสำหรับข้อมูล!
Eric

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

2
มีเกมที่ฟิสิกส์ของสัญลักษณ์แสดงหัวข้อย่อย (ตรงข้ามกับพูดกระสุนปืนใหญ่) เคารพสิ่งต่าง ๆ เช่นแรงโน้มถ่วง (กระสุนหล่น), ความต้านทานอากาศ? (นั่นคือเกมที่นอกเหนือจากเกมพิเศษที่โฟกัสคือการยิงเป้าที่แม่นยำหรืออะไรทำนองนั้น: FPS เป็นต้น) ฉันไม่ใช่นักเล่นเกม แต่ฉันประหลาดใจที่จำเป็นต้องมีระดับความเที่ยงตรง (แม้บางครั้ง)
davidbak

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

1
@davidbak Battlefield เนื่องจาก Bad Company 2 มีกระสุนตก ทั้งปืนไรเฟิลปืนพกถังกระสุนจรวดทุกอย่าง Battlefield 3 ไม่มีค่าใช้จ่ายบน Origin คุณสามารถตรวจสอบ (IIRC) แน่นอนว่า Battlefield 4 ยังมี 'ฟีเจอร์' นี้ด้วย เกมอื่น ๆ ที่คุณสามารถดูได้นี่คือ "Sniper Elite" 2 หรือ 3 เป็นชื่อที่ใหม่กว่า ฟิสิกส์มีบทบาทสำคัญในเกมนั้น
Apache

7

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

สำหรับตัวอย่าง 2 มิติของคุณคุณอาจมีตำแหน่งและความเร็วของกระสุน (คุณอาจต้องการอายุการใช้งานหรือระยะทางสูงสุดทั้งนี้ขึ้นอยู่กับวิธีการใช้สัญลักษณ์แสดงหัวข้อย่อยของคุณ) ซึ่งโดยปกติจะเกี่ยวข้องกับค่า 2 (x, y) หากพวกมันลอยตัวนั่นคือ 16 ไบต์ หากคุณมีกระสุน 100 นัดนั่นเป็นเพียง 1600 ไบต์หรือประมาณ 1.5k ไม่มีอะไรในเครื่องวันนี้

ถัดไปคุณพูดถึงผีสาง คุณจะต้องสไปรต์เดียวเพื่อแสดงสัญลักษณ์แสดงหัวข้อย่อยแต่ละหัวข้อ ขนาดของมันจะขึ้นอยู่กับความลึกของบิตที่คุณวาดและขนาดที่มันควรจะปรากฏบนหน้าจอ แม้จะไม่มีการบีบอัดที่ 256x256 ใน full float 32-bit ต่อ channel นั่นคือ 1MB สำหรับ sprite (และนั่นจะใหญ่มาก!) คุณจะวาดเทพดาเดียวกันในแต่ละตำแหน่งกระสุน แต่มันไม่ได้ใช้หน่วยความจำเพิ่มเติมสำหรับสำเนาแต่ละเทพดา มันจะคล้ายกันสำหรับเอฟเฟกต์แบบตี

คุณพูดถึงการยิงทุก ๆ 0.01 วินาที นั่นจะเป็น 100 กระสุนต่อวินาทีจากอาวุธของคุณ แม้แต่อาวุธแห่งอนาคตที่มีอยู่มากมาย! ตามบทความวิกิพีเดียนี้ :

เมื่อทริกเกอร์ถูกดึงอัตราการยิงจะเป็นอัตรารอบ อัตราการยิงแบบปกติคือ 600-900 RPM สำหรับปืนไรเฟิลจู่โจม, 1,000-1,100 RPM ในบางกรณี, 900-1,200 RPM สำหรับปืนกลมือและปืนกลและ 600-1,200 RPM สำหรับปืนกล M134 Miniguns ที่ติดตั้งบนเฮลิคอปเตอร์จู่โจมและยานเกราะต่อสู้อื่น ๆ สามารถบรรลุอัตราการยิงมากกว่า 100 รอบต่อวินาที (6,000 รอบต่อนาที)

นั่นคืออัตราของเฮลิคอปเตอร์โจมตี!

สำหรับโลกที่มีขนาดใหญ่อย่างที่คุณพูดถึงใน Battlefield / Call of Duty / ฯลฯ พวกเขาอาจคำนวณตำแหน่งสัญลักษณ์แสดงหัวข้อย่อยทั้งหมด แต่ไม่สามารถวาดได้ทั้งหมดหากการกระทำอยู่ไกล หรือพวกเขาอาจไม่จำลองพวกเขาจนกว่าคุณจะเข้าใกล้ (ฉันต้องยอมรับว่าฉันคาดเดาเพียงเล็กน้อยในส่วนนี้เนื่องจากฉันไม่ได้ทำงานในสิ่งที่มีขนาดใหญ่)


6

หน่วยประมวลผลจะไม่สามารถประมวลผลวัตถุนับพันรายการได้ยากหรือไม่แล้วจะถูกทำลาย (เมื่อมีการเรียกใช้เอฟเฟกต์เมื่อโจมตี) พื้นที่แรม?

ฉันคิดว่าคุณประเมินว่าคอมพิวเตอร์มีความรวดเร็วเพียงใด นี้เป็นบางครั้งปัญหาในระบบของ 80s และ 90s ที่ ส่วนหนึ่งเป็นเพราะเหตุใด Space Invaders ดั้งเดิมจะไม่ยอมให้คุณยิงกระสุนอีกจนกว่ากระสุนนัดปัจจุบันจะโจมตี เกมบางเกมประสบกับ "การชะลอตัว" หากมีสไปรต์บนหน้าจอมากเกินไป

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

คุณต้องระวังอัลกอริธึมเล็กน้อย - คุณไม่สามารถทำการตรวจสอบวัตถุทุกชิ้นกับวัตถุอื่น ๆ ได้อย่างไร้เดียงสาเมื่อคุณมีวัตถุนับพัน กระสุนมักไม่ตรวจสอบการชนกับกระสุนอื่น

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


ฉันสงสัยว่าเลื่อยลูกโซ่ทำงานอย่างไรในบริบทนี้
reas0n

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

1

ฉันอยู่ไกลจากผู้เชี่ยวชาญ แต่ฉันทำงานกับเกมยิง 2D แบบผู้เล่นหลายคนในเวลาว่าง

วิธีการของฉัน

มีคลาสย่อยที่แตกต่างกันระหว่างไคลเอนต์และเซิร์ฟเวอร์ (แม้ว่าจะเล่นออฟไลน์อินสแตนซ์ของเซิร์ฟเวอร์จะเริ่มในกระบวนการที่แยกต่างหากและเชื่อมต่อกับเกม 'หลัก')

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

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

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

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

หมายเหตุเกี่ยวกับวิธีการต่าง ๆ

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

ด้วยโมเดล 3 มิติซึ่งอาจมี hitbox ที่ซับซ้อนจึงเป็นมาตรฐานในการทดสอบการชนกับกล่อง FIRST แบบ จำกัด ขอบเขตและหากทำได้สำเร็จให้ไปที่การตรวจสอบการชนกันของข้อมูลเพิ่มเติมโดยละเอียด


0

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

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