ฉันมีหนูมองและเดินในเกมของฉัน แต่พวกมันช้ามากและใช้งานยาก ฉันคิดว่าเป็นเพราะฉันใช้ความเร็วคงที่ ฉันได้ยินมาว่าในโครงการขนาดใหญ่ผู้พัฒนาใช้เวลาเดลต้า ฉันจะคำนวณเวลาเดลต้าในจำนวนที่มากเกินไปได้อย่างไร ฉันจะคำนวณความเร็วโดยใช้เวลาเดลต้าได้อย่างไร
ฉันมีหนูมองและเดินในเกมของฉัน แต่พวกมันช้ามากและใช้งานยาก ฉันคิดว่าเป็นเพราะฉันใช้ความเร็วคงที่ ฉันได้ยินมาว่าในโครงการขนาดใหญ่ผู้พัฒนาใช้เวลาเดลต้า ฉันจะคำนวณเวลาเดลต้าในจำนวนที่มากเกินไปได้อย่างไร ฉันจะคำนวณความเร็วโดยใช้เวลาเดลต้าได้อย่างไร
คำตอบ:
"เวลาเดลต้า" เคยเป็นเวลาที่ผ่านไประหว่างการอัพเดตเฟรมสองครั้ง (แต่สามารถใช้ในบริบทอื่น ๆ ได้ซึ่งโดยปกติจะเป็นผลมาจากการลบเวลา)
คุณสามารถรับเวลาเดลต้าใน glut โดยใช้วิธีglutGetและพารามิเตอร์ GLUT_ELAPSED_TIME รวมทั้งการดำเนินการบางอย่าง
บรรทัดต่อไปนี้คืนค่าจำนวนมิลลิวินาทีนับตั้งแต่ glutInit ถูกเรียก (หรือการโทรครั้งแรกไปที่ glutGet (GLUT_ELAPSED_TIME)):
int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
ดังนั้นหากคุณลงทะเบียน timeSinceStart ปัจจุบันที่แต่ละวนการเรนเดอร์คุณสามารถรู้ deltaTime โดยการลบอันเก่าไปยังอันใหม่
int oldTimeSinceStart = 0;
while( ... )
{
int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
int deltaTime = timeSinceStart - oldTimeSinceStart;
oldTimeSinceStart = timeSinceStart;
//... stuff to update using deltaTime
}
นอกจากนี้คุณยังสามารถทำได้เกือบจะในลักษณะเดียวกันโดยใช้ไลบรารี C / C ++ ctimeพร้อมนาฬิกา ()และนิพจน์ค่าคงที่มาโครCLOCKS_PER_SECที่ระบุความสัมพันธ์ระหว่างติ๊กนาฬิกาและวินาที
โดยทั่วไปคุณสามารถใช้ deltaTime เพื่ออัปเดตการเคลื่อนไหวของคุณตามอัตราส่วนเป็นเวลาที่ผ่านไปนี้แทนที่จะใช้ค่าเวลาคงที่ ด้วยวิธีนี้ความเร็วในการเคลื่อนที่ของตัวละครของคุณควรจะใกล้เคียงกันหากโปรแกรมของคุณทำงานที่ 60 fps หรือหากทำงานที่ 10 fps
นี่คือตัวอย่างเล็ก ๆ : สมมติว่าคุณต้องการย้ายบางสิ่งบางอย่าง 10 หน่วยต่อวินาทีบนแกน x คุณสามารถทำสิ่งนี้ได้ (ถ้าเดลต้าไทม์ใช้มิลลิวินาทีอย่างแน่นอน)
Position.x += 10/1000 * deltaTime;
ด้วยวิธีนี้ไม่ว่าโปรแกรมของคุณจะอัปเดต 2 ครั้งหรือ 100 ครั้ง 1 วินาทีหลังจากนั้นตำแหน่งควรจะเกือบเหมือนเดิมและการเล่นเกมจะได้รับผลกระทบน้อยกว่าจากคอมพิวเตอร์ขนาดเล็กที่มีเฟรมต่อวินาทีต่ำกว่าหากใช้ค่าคงที่
ด้วยค่าคงที่ ==> low fps = การอัพเดทน้อย = การเคลื่อนไหวช้าในขณะที่ fps สูง = การปรับปรุงเพิ่มเติม = การเคลื่อนไหวที่เร็วมาก
ด้วย deltaTime ==> "เกือบ" การเคลื่อนไหวเดียวกัน
สุดท้ายคุณควรอ่านขั้นตอนเวลาคงที่เทียบกับขั้นตอนเวลาแปรผันบน gamedev.stackexchange
positive int
มักจะไปถึง 2.147.483.647 ถ้าลงนามและถึง 4.294.967.295 ถ้าไม่ได้ลงนาม ... ดังนั้นแม้ถ้าเราพิจารณาที่มีขนาดเล็กหนึ่ง 2.147.483.647 มิลลิวินาทีเป็นเกือบ 25 วัน ... มันควรจะมากพอที่จะจัดการกับเกมมากที่สุด ตัวจับเวลาและแม้ว่าจะไม่เพียงพอเรายังคงสามารถใช้งานได้อย่างสมเหตุสมผลunsigned int
(~ 50 วัน) หรือแม้แต่ a long long
(อย่างที่ฉันมักจะทำ)
QueryPerformanceCounter
บน Windows และgettimeofday
ในส่วนอื่น ๆ นั้นไม่ได้เลวร้าย คุณจะต้องทำให้มือของคุณสกปรกและตั้งเป้าหมายให้น้อยกว่าตัวส่วนร่วมที่น้อยที่สุดของ API แพลตฟอร์มโดยเฉพาะใน C และ C ++