ฉันเพิ่งอ่านบทความนี้เกี่ยวกับ Game Loops: http://www.koonsolo.com/news/dewitters-gameloop/
และการนำไปใช้ครั้งสุดท้ายที่แนะนำทำให้ฉันสับสนอย่างยิ่ง ฉันไม่เข้าใจวิธีการทำงานและดูเหมือนเป็นระเบียบสมบูรณ์
ฉันเข้าใจหลักการ: อัปเดตเกมด้วยความเร็วคงที่ไม่ว่าอะไรก็ตามที่เหลือจะทำให้เกมเป็นไปได้หลายครั้ง
ฉันคิดว่าคุณไม่สามารถใช้:
- รับอินพุต 25 ขีด
- เกมแสดงผลสำหรับ 975 เห็บ
วิธีการตั้งแต่คุณจะได้รับการป้อนข้อมูลสำหรับส่วนแรกของสองและสิ่งนี้จะรู้สึกแปลก? หรือเป็นสิ่งที่เกิดขึ้นในบทความ?
เป็นหลัก:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
มันจะใช้ได้ยังไง?
สมมติว่าคุณค่าของเขา
MAX_FRAMESKIP = 5
สมมุติว่า next_game_tick ซึ่งกำหนดช่วงเวลาหลังจากเริ่มต้นก่อนที่ลูปเกมหลักจะพูดว่า ... 500
ในที่สุดเมื่อฉันใช้ SDL และ OpenGL สำหรับเกมของฉันด้วย OpenGL ที่ใช้สำหรับการเรนเดอร์เท่านั้นสมมติว่าGetTickCount()
คืนค่าเวลาตั้งแต่ SDL_Init ถูกเรียกซึ่งมันทำ
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
ที่มา: http://www.libsdl.org/docs/html/sdlgetticks.html
ผู้เขียนสมมติว่า:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
ถ้าเราขยายwhile
คำสั่งที่เราได้รับ:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750 เพราะเวลาผ่านไปนับตั้งแต่next_game_tick
ได้รับมอบหมาย loops
เป็นศูนย์ตามที่คุณเห็นในบทความ
ดังนั้นเราจึงได้ป้อนขณะที่วงขอทำตรรกะบางอย่างและยอมรับการป้อนข้อมูล
Yadayadayada
ในตอนท้ายของ while while ซึ่งผมขอเตือนคุณว่าอยู่ใน loop ของเกมหลักของเราคือ:
next_game_tick += SKIP_TICKS;
loops++;
มาอัปเดตว่าการทำซ้ำครั้งต่อไปของรหัส while เป็นอย่างไร
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1,000เนื่องจากเวลาผ่านไปและการทำสิ่งต่างๆก่อนที่เราจะไปถึงการเปิดตัวลูปครั้งต่อไปซึ่ง GetTickCount () ถูกเรียกคืน
540เพราะในรหัส 1000/25 = 40 ดังนั้น 500 + 40 = 540
1เพราะลูปของเราวนซ้ำหนึ่งครั้ง
5คุณรู้ไหมว่าทำไม
ดังนั้นตั้งแต่นี้ในขณะที่วนรอบจะขึ้นอยู่กับชัดเจนMAX_FRAMESKIP
และไม่ได้ตั้งใจTICKS_PER_SECOND = 25;
ว่าเกมจะทำงานได้อย่างถูกต้องอย่างไร
ฉันไม่แปลกใจเลยที่เมื่อฉันนำสิ่งนี้ไปใช้ในรหัสของฉันฉันอาจเพิ่มอย่างถูกต้องเนื่องจากฉันเปลี่ยนชื่อฟังก์ชั่นของฉันเพื่อจัดการกับการป้อนข้อมูลของผู้ใช้และวาดเกมเป็นสิ่งที่ผู้เขียนบทความมีอยู่ในรหัสตัวอย่าง .
ฉันวางfprintf( stderr, "Test\n" );
ลูปในขณะที่ไม่พิมพ์จนกว่าเกมจะจบ
ลูปของเกมนี้ทำงานอย่างไร 25 เท่าต่อวินาทีรับประกันในขณะที่เรนเดอร์เร็วเท่าที่จะทำได้?
สำหรับฉันถ้าฉันไม่มีอะไรใหญ่มันก็ดูเหมือนว่า ... ไม่มีอะไรเลย
และนี่ไม่ใช่โครงสร้างของสิ่งนี้ในขณะที่วนซ้ำวิ่งประมาณ 25 ครั้งต่อวินาทีจากนั้นอัปเดตเกมให้ตรงกับที่ฉันพูดไว้ตอนเริ่มต้นของบทความ
ถ้าเป็นเช่นนั้นทำไมเราไม่ทำอะไรที่ง่าย ๆ
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
และนับการแก้ไขด้วยวิธีอื่น
ยกโทษให้กับคำถามที่ยาวมากของฉัน แต่บทความนี้ทำอันตรายมากกว่าดีกับฉัน ตอนนี้ฉันสับสนอย่างรุนแรง - และไม่รู้ว่าจะใช้ลูปเกมที่เหมาะสมได้อย่างไรเนื่องจากคำถามเหล่านี้เกิดขึ้นทั้งหมด