การกำหนดเวลาแบบกึ่งถาวรหรือแบบคงที่ครบหรือไม่


15

ฉันกำลังทำ iphone shmup และพยายามตัดสินใจว่าจะใช้ loop ของเกมประเภทใด ฉันต้องการใช้การประทับเวลาแบบกึ่งถาวรหรือการประทับเวลาแบบคงที่ทั้งหมด

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

จากนั้นด้วยการประทับเวลาที่แก้ไขอย่างสมบูรณ์ฉันกำลังโทรหาการปรับปรุงอย่างน้อยหนึ่งครั้ง (FIXED_INTERVAL) ตามด้วยการแก้ไขหนึ่งครั้ง (dt / FIXED_INTERVAL) โดยที่ dt <FIXED_INTERVAL ต่อการวนรอบเกม

ดังนั้นดูเหมือนว่าการตัดสินใจครั้งใหญ่ที่ฉันต้องทำคือ: ฉันต้องการจัดการกับความท้าทายในการใช้การอัปเดต (dt) กับตัวแปร dt หรือฉันต้องการจัดการกับความท้าทายในการนำการแก้ไขมาใช้หรือไม่

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

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


ครอบคลุมสวยอย่างทั่วถึงที่นี่: gamedev.stackexchange.com/questions/1589/ …
michael.bartnett

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

คำตอบ:


12

แก้ไขอย่างเต็มที่

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

ประสานเสียง Lopis มีการเขียนที่ดีขึ้นเกี่ยวกับวิธีการที่เขาดำเนินการเป็นขั้นตอนเวลาที่กำหนดในเกมของเขาเคซี่ย์ Contraptions โบนัสสำหรับคุณเขาเป็นนักพัฒนา iphone แม้ว่าเทคนิคของเขาจะไม่เจาะจง iPhone

ไฮไลท์บางส่วนจากบทความ

  • ใช้ตัวสะสมเวลา
  • ใช้อัตราฟิสิกส์ 120Hz สำหรับอัตราเฟรม 60Hz
  • จำลองหนึ่งขั้นตอนคงที่ในอนาคตและใช้การสะสมเวลาผ่านไปเพื่อวาดรหัส lerp ระหว่างสถานะฟิสิกส์ปัจจุบันและสถานะฟิสิกส์อนาคต
  • gotchas ต่างๆ

2

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

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

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

เมื่อคุณเขียน iPhone shmup ทั้งของคุณupdateและrenderความต้องการของคุณโดยเฉพาะอย่างยิ่ง CPU มาก; คุณสามารถล็อคอัตราเฟรมเป็น 30Hz หรือ 60Hz ไม่ต้องกังวลกับการติดตั้งใช้งานและยังมีเกมที่ดูเรียบเนียน


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

สิ่งที่ฉันกำลังพูดถึงทำให้เดือดร้อนอย่างนี้: ทำสิ่งที่ซับซ้อนน้อยที่สุดที่จะได้ผล
Blair Holloway

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