ฉันจะเขียนลูปของเกมหลักได้อย่างไร [ปิด]


130

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

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


4
คำตอบที่ชั่วร้าย: แล้วการใช้เอ็นจิน someones เพื่อทำลูปนี้ให้คุณล่ะ? :)
user712092

คุณสามารถถามจำนวนรวมของเฟรมที่ผู้ใช้ต้องการเรียกใช้และใช้สำหรับลูปถึง n คูณจำนวนบัฟเฟอร์
UğurGümüşhan

คำตอบ:


121

วนรอบของเกมหลักจัดการกับภารกิจหลักสามอย่าง:

  1. รับอินพุตของผู้ใช้
  2. อัปเดตสถานะเกม
  3. วาดเกม

การวนลูปเกมง่าย ๆ เพียงแค่ทำให้ทั้งสามภารกิจเป็นหนึ่งเดียวขณะที่วนซ้ำ สิ่งนี้มีผลลัพธ์ที่ไม่พึงประสงค์:

  1. เกมวิ่งด้วยความเร็วที่แตกต่างกันในคอมพิวเตอร์ที่แตกต่างกัน
  2. CPU (สามารถใช้โดยไม่จำเป็น) pegged ที่การใช้งาน 100%
  3. "สถานะเกม" / เมนูหายไปหรือผสมกับรหัสเกม
  4. การวนซ้ำของเกมหลักนั้นยาวและยากต่อการดูแลรักษา
  5. รหัสเป็นการยากที่จะขยาย / พอร์ตไปยังแพลตฟอร์มอื่น

ห่วง gamed ขั้นสูงแก้ไขปัญหาที่ระบุไว้ข้างต้น นี่คือบทความที่มีประโยชน์:

เพื่อเป็นตัวอย่างเกมที่ยอดเยี่ยมลองดูตัวอย่างเกม Allegro skater:

  • รหัสห่วงเกมอยู่ในframework.c
  • เรียกดูรหัสที่มาเต็มได้ที่นี่

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


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

1
CPU ควรค้างอยู่ที่การใช้งาน 100% (หรือมากกว่า 50% ถ้าคุณมีอย่างน้อย 2 คอร์) ลองคิดดู คุณมีวิธีที่จะได้รับเลือดออกฟิสิกส์ขอบกราฟิกฆาตกรถ้าคุณกำลังนั่งอยู่กลับไปที่นั่นพูดกับตัวเอง "โอ้ แต่ฉันไม่ต้องการที่จะใช้ทั้งหมดของ CPU." ใช่คุณควรใช้ CPU 100% ถ้าเป็นไปได้ (นั่นหมายถึงมัลติเธรดในคอมพิวเตอร์ทุกวันนี้ดังนั้นจึงเป็นเรื่องยากมากที่จะใช้ 100% ของ 4 คอร์ตลอดเวลา) ใช้ประโยชน์สูงสุดจากเครื่องที่คุณใช้อยู่
bobobobo

5
ให้ผมผนวก: สำหรับโปรแกรมสก์ท็อป บนอุปกรณ์พกพาคุณจะเผาผลาญแบตเตอรี่ได้มากขึ้นดังนั้นคุณจึงกังวลเกี่ยวกับการใช้งาน 100%
bobobobo

1
@ user6003859: ฉันแก้ไขลิงก์แล้ว
Leftium

1
ลิงค์ที่มีประโยชน์อื่น: gameprogrammingpatterns.com/game-loop.html
brita_

51

ฉันอยากจะแนะนำบทความของ Glenn Fiedler เกี่ยวกับความเป็นอิสระของกลุ่มเฟรมที่แข็งแกร่ง " Fix Your Timestep! "

(ไม่เกี่ยวข้องกับหัวข้อที่อยู่ในมือ แต่บทความอื่น ๆ ในซีรีส์ยังค่อนข้างดี - เช่นเดียวกับทุกอย่างในเว็บไซต์ของเขา!)


นี่เป็นบทความที่ดีจริงๆ ขอบคุณสำหรับการโพสต์!
hokiecsgrad

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

4

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

http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php

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