ฟังก์ชั่นแบบต่อเฟรมการโทรและการส่งข้อความที่ขับเคลื่อนด้วยเหตุการณ์ในการออกแบบเกม


11

การออกแบบเกมแบบดั้งเดิมอย่างที่ฉันรู้นั้นใช้ความหลากหลายและฟังก์ชั่นเสมือนจริงเพื่ออัพเดทสถานะของเกม กล่าวอีกนัยหนึ่งชุดฟังก์ชั่นเสมือนจริงจะถูกเรียกในช่วงเวลาปกติ (เช่น: ต่อเฟรม) ในทุกวัตถุในเกม

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

จัดกิจกรรมขับเคลื่อนสถาปัตยกรรมเกมจะอธิบายได้ดีใน: เกมการเข้ารหัสที่สมบูรณ์โดยไมค์แมคชาฟฟรี

ฉันขอความช่วยเหลือจากคำถามต่อไปนี้:

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

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


ตัวอย่าง: คำถามนี้ทำให้เกิดความขัดแย้งเล็กน้อยที่นี่ดังนั้นฉันขอเสนอตัวอย่าง: ตาม MVC เครื่องมือเกมแบ่งออกเป็นสามส่วนหลัก:

  1. Application Layer (การสื่อสารของฮาร์ดแวร์และระบบปฏิบัติการ)
  2. เกมลอจิก
  3. มุมมองเกม

ในเกมแข่งรถ Game View รับผิดชอบในการแสดงผลหน้าจอโดยเร็วที่สุดอย่างน้อย 30 เฟรมต่อวินาที Game View รับฟังอินพุตของผู้เล่นด้วย ตอนนี้สิ่งนี้เกิดขึ้น:

  • ผู้เล่นกดแป้นคันเร่งเป็น 80%
  • GameView สร้างข้อความ "เหยียบเชื้อเพลิงรถยนต์ 2 กดถึง 80%" และส่งไปที่ Game Logic
  • เกมลอจิกได้รับข้อความประเมินคำนวณตำแหน่งและพฤติกรรมของรถยนต์ใหม่และสร้างข้อความต่อไปนี้สำหรับ GameView: "Draw Car 2 Fuel Pedal Pressed 80%", "Car 2 Sound Acceleration", "Car 2 Coordinates X, Y" .. .
  • GameView ได้รับข้อความและดำเนินการตามนั้น

คุณพบที่ไหน ลิงค์หรือการอ้างอิง? ฉันไม่ทราบวิธีการนี้ (แต่ฉันรู้ว่ารูปแบบการออกแบบ Weel ค่อนข้างทั่วไปและฉันแนะนำให้ใช้หลักการปรับทิศทางวัตถุโดยทั่วไป) แต่ฉันคิดว่าเหตุการณ์ที่ใช้พื้นฐานดีกว่า .. คิดว่าวิวัฒนาการในระบบเครือข่าย: จาก การโทรไปยังการโทรแบบอะซิงโครนัส .. ได้รับการปรับให้เหมาะสมในการคำนวณและในระดับนามธรรม
nkint

สวัสดี Nkint ขอขอบคุณสำหรับความคิดเห็นของคุณ โดยทั่วไปฉันต้องการเปรียบเทียบการสื่อสารที่ขับเคลื่อนด้วยเหตุการณ์และการโทรไปยังฟังก์ชันเสมือน ฉันจะแก้ไขคำถามของฉันเล็กน้อย Btw ดูที่ลิงค์นี้ที่มีรูปแบบการดีไซน์เกม: gameprogrammingpatterns.com
Bunkai.Satori

5
บางทีฉันอาจเป็นคนโง่ แต่คุณจะทำให้ระบบการส่งข้อความทำงานได้อย่างไรโดยไม่ต้องใช้ polymorphism? คุณไม่ต้องการคลาสพื้นฐาน (นามธรรมหรืออย่างอื่น) เพื่อกำหนดอินเทอร์เฟซตัวรับเหตุการณ์ของคุณ (แก้ไข: สมมติว่าคุณไม่ได้ทำงานในภาษาที่มีการสะท้อนที่เหมาะสม)
Tetrad

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

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

คำตอบ:


8

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

อะไรคือข้อดีและข้อเสียของทั้งสองวิธี?

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

อันไหนดีกว่าอีกอัน?

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

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

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

อันไหนมีประสิทธิภาพมากขึ้นและยากต่อการพัฒนา

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


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

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

7

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

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

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

บรรทัดล่าง: ไม่มีวิธีที่ดีกว่าหรือไม่ได้เป็นพิเศษ


สวัสดี Bummzack ในที่สุดคำตอบแรกมาถึง ขอบคุณที่ :-) เมื่อฉันพูดถึงสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ฉันหมายถึงระบบ MVC ที่มีสามเลเยอร์สำคัญ: Appliaction, GameView, GameLogic การสื่อสารทั้งหมดระหว่าง trhee เหล่านี้จะกระทำผ่านการส่งข้อความ สิ่งนี้แตกต่างอย่างมากกับระบบดั้งเดิมที่มีลูปอัปเดต ทุกระบบมีสถาปัตยกรรมที่แตกต่างข้อดีและข้อเสียบางอย่างและมีค่าประสิทธิภาพที่แตกต่างกัน ฉันจึงเชื่อว่าจะมีบางอย่างที่ดีขึ้นเล็กน้อยในบางพื้นที่ หลังจากการวิเคราะห์ที่ดีเราควรสรุปได้ว่าอันไหนดีกว่า
Bunkai.Satori

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

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

1
โหวตขึ้นสำหรับคำตอบที่สะท้อนถึงความคิดเห็นของ Tetrad ด้านล่างคำถามเดิม @ Bunkai.Satori 'โลกของเกมได้รับการตรวจสอบเพียงครั้งเดียว' คือการวนรอบการอัปเดตทุกอย่างที่จำเป็นต้องได้รับการอัปเดต ข้อความเหตุการณ์มีความหมายว่าเป็นสิ่งที่ทำไม่บ่อยนัก แต่ยังคงเป็นสิ่งสำคัญในเครื่องมือ (PlayerDied, MonsterDied ฯลฯ ) ซึ่งการตรวจสอบทุกเฟรมในลูป Update () จะเป็นการสิ้นเปลือง อัปเดต () วนรอบตัวเอง
James

1
หากคุณมีรุ่นที่สองให้ดูบทที่ชื่อว่าการควบคุมลูปหลัก ควรตั้งชื่อสิ่งเดียวกันในรุ่นที่ 3 นั่นควรตอบคำถามของคุณจริงๆ
Ray Dey

4

สิ่งนี้เริ่มต้นเป็นความเห็นต่อคำตอบของ bummzack แต่ใช้เวลานาน

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

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

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

พวกเขาเป็นเครื่องมือที่ยอดเยี่ยม แต่อย่าง bummzack กล่าวอย่าคิดว่า polymorphism และเหตุการณ์ต่าง ๆ แก้ปัญหาเดียวกันได้


สวัสดี Bearcdp ขอบคุณสำหรับการตอบกลับของคุณ มันสมเหตุสมผลสำหรับฉัน มีอยู่สิ่งหนึ่งในใจของฉันที่โหวตให้กับข้อความเหตุการณ์: พูดว่ามี 200 ojects ในที่เกิดเหตุ หากคุณใช้การเรียกฟังก์ชั่นแบบเฟรมต่อเฟรมสำหรับวัตถุทั้งหมดคุณต้องตรวจสอบวัตถุทั้งหมด 200 รายการเพื่อตรวจสอบทุกเฟรม (ตัวอย่างเช่นแน่นอนช่วงเวลาการโทรสามารถจัดการได้) ด้วยการส่งข้อความเหตุการณ์ gameworld จะถูกตรวจสอบเพียงครั้งเดียว หากมีการชนกัน 5 ครั้งวัตถุ 5 ชิ้นเท่านั้นที่จะได้รับการแจ้งเตือนจากข้อความเกี่ยวกับเหตุการณ์การชนกันแทนที่จะทดสอบการตรวจจับการชนกัน 200 ครั้งด้วยการโทรต่อเฟรม ความคิดเห็นของคุณคืออะไร?
Bunkai.Satori

2
ตรวจสอบ gameworld ?? นั่นหมายความว่าอย่างไร? มันจะต้องหมายถึงการรันการตรวจสอบ 200 ตัวเดียวกันเพื่อแยก 5 ที่ต้องการส่งข้อความเกี่ยวกับ ด้วยแนวคิดฟังก์ชั่นเสมือนจริง gameworld จะถูกตรวจสอบเพียงครั้งเดียวเช่นกัน (ฟังก์ชั่นของแต่ละวัตถุ) และจากนั้นย้ายไปยัง 5 ที่ต้องการการเปลี่ยนแปลงสถานะ ... โดยไม่มีค่าใช้จ่ายของระบบส่งข้อความ
Steve H

1
ฟัง Steve H โลกไม่ได้ขัดแย้งกัน ฉันใช้เหตุการณ์เป็นหลักสำหรับเหตุการณ์ระดับสูงเช่น PlayerJump, EnemyHit สำหรับการจัดการประสิทธิภาพของการตรวจสอบการชนคุณต้องเลือกโครงสร้างข้อมูลเพื่อจัดระเบียบตำแหน่งทางกายภาพของวัตถุในเกมของคุณเพื่อให้คุณสามารถจัดลำดับความสำคัญของวัตถุที่ต้องการและไม่จำเป็นต้องตรวจสอบการชนกัน เมื่อคุณได้กำหนดคู่ของวัตถุทั้งหมดที่มีการชนกันแล้วคุณสามารถจัดส่งเหตุการณ์ที่มีข้อมูลการชนกันที่เกี่ยวข้อง (วัตถุสองชิ้นข้อมูลความเร็ว / ตำแหน่ง / บรรทัดฐาน ฯลฯ )
michael.bartnett

สวัสดี Steve และ Beardcp ขอบคุณสำหรับความคิดเห็นของคุณ สิ่งที่คุณเขียนนั้นสมเหตุสมผล ดูเหมือนว่าจะมีการนำระบบส่งข้อความเหตุการณ์ไปใช้งานได้หลายอย่าง อาจมีการเปลี่ยนแนวคิดการทำงานเสมือนต่อเฟรมอย่างแท้จริงตามที่กล่าวไว้ข้างต้น อย่างไรก็ตามระบบการส่งข้อความสามารถอยู่ร่วมกับแนวคิดฟังก์ชั่นเสมือนต่อเฟรมได้เช่นเดียวกับที่คุณพูด
Bunkai.Satori

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

2

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

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

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

แก้ไขให้ชัดเจนขึ้นในประโยคแรกของฉัน


สวัสดี DeadMG ให้ฉันอธิบาย: ในกรณีที่กล่าวถึงข้างต้นการออกแบบแบ่งออกเป็นสามส่วนหลัก: เลเยอร์ Appliaction (การเข้าถึงฮาร์ดแวร์), Game Logic, Game View สิ่งที่ได้รับการแสดงผลต่อเฟรมคือ Game View อย่างไรก็ตามเมื่อ Game View บันทึกการป้อนข้อมูลของผู้ใช้ (เช่นเหยียบแป้นเบรกในเกมไล่ล่า) มันจะส่งข้อความ "Car 2 Brake Pressed" ไปที่ Game Logic เพื่อประมวลผล เกมลอจิกประเมินการกระทำนี้คำนวณพฤติกรรมของรถและส่งข้อความไปยังมุมมองเกม: "ยางรถยนต์ 2 บล็อก", "รถยนต์ 2 ย้ายไปที่ X, Y" วิธีนี้ไม่จำเป็นต้องตรวจสอบต่อเฟรมหากมีการกดเบรกบนรถทุกคัน
Bunkai.Satori

@Bunkai: ดังนั้นคุณมีการออกแบบที่ขับเคลื่อนด้วยเหตุการณ์และการออกแบบบางอย่างที่เรียกว่าแต่ละเฟรม นั่นค่อนข้างเห็นด้วยกับคำตอบของฉัน
DeadMG

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