Cách lấy và sử dụng thời gian delta


13

Tôi có những con chuột nhìn và đi lại trong trò chơi của mình, nhưng chúng rất chậm và khó sử dụng. Tôi nghĩ đó là vì tôi đang sử dụng tốc độ cố định. Tôi nghe nói rằng trong các dự án lớn, các nhà phát triển sử dụng thời gian delta. Làm thế nào để tôi tính thời gian delta trong glut? Làm cách nào để tính tốc độ bằng thời gian delta?


Câu trả lời:


17

"Thời gian delta" được sử dụng là thời gian trôi qua giữa hai lần cập nhật khung hình (nhưng nó cũng có thể được sử dụng trong các bối cảnh khác; đây thường là kết quả của phép trừ thời gian).

Bạn có thể lấy thời gian delta trong glut bằng phương pháp glutGet và tham số GLUT_ELAPSED_TIME, cùng với một số thao tác.

Dòng sau trả về số mili giây kể từ khi glutInit được gọi (hoặc cuộc gọi đầu tiên đến glutGet (GLUT_ELAPSED_TIME)):

int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);

Vì vậy, nếu bạn đăng ký timeSinceStart hiện tại ở mỗi vòng kết xuất, bạn có thể biết deltaTime bằng cách trừ cái cũ sang cái mới.

int oldTimeSinceStart = 0;

while( ... )
{
     int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
     int deltaTime = timeSinceStart - oldTimeSinceStart;
     oldTimeSinceStart = timeSinceStart;

     //... stuff to update using deltaTime
}

Bạn cũng có thể thực hiện gần như cùng một cách, sử dụng thư viện ctime C / C ++ với clock () và biểu thức hằng số macro CLOCKS_PER_SEC chỉ định mối quan hệ giữa dấu đồng hồ và giây.


Về cơ bản, bạn có thể sử dụng deltaTime để cập nhật tỷ lệ chuyển động của mình theo thời gian đã trôi qua thay vì sử dụng giá trị thời gian cố định. Bằng cách này, tốc độ di chuyển của nhân vật của bạn sẽ gần như giống nhau nếu chương trình của bạn chạy ở tốc độ 60 khung hình / giây hoặc nếu nó chạy ở tốc độ 10 khung hình / giây.


Đây là một ví dụ nhỏ: giả sử bạn muốn di chuyển thứ gì đó 10 đơn vị mỗi giây trên trục x. Bạn có thể làm một cái gì đó như thế này (nếu deltaTime thực sự sử dụng mili giây).

Position.x += 10/1000 * deltaTime;

Bằng cách này, cho dù chương trình của bạn cập nhật 2 lần hay 100 lần, 1 giây sau, vị trí sẽ gần như giống nhau và trò chơi sẽ ít bị ảnh hưởng bởi khung hình / giây thấp của máy tính nhỏ hơn nếu nó sử dụng các giá trị cố định.

  • Với các giá trị cố định ==> fps thấp = ít cập nhật = chuyển động chậm trong khi fps cao = cập nhật nhiều hơn = chuyển động rất nhanh.

  • Với deltaTime ==> "gần như" các chuyển động tương tự.


Cuối cùng, bạn nên đọc Bước thời gian cố định so với bước thời gian biến trên gamedev.stackexchange.


Nó trả về mili giây như một số nguyên? Gross, và có thể không đủ. Tôi đã luôn phải sử dụng bộ hẹn giờ dành riêng cho nền tảng và sau đó tránh GLUT như bệnh dịch vì nó không tuyệt vời cho các trò chơi.
Sean Middleditch 17/07/13

@Sean Tôi cũng không sử dụng GLUT, nhưng đó là thông số của câu hỏi nên tôi đã trả lời điều này trong đầu;) Tuy nhiên, tôi bị thu hút bởi vị trí của bạn liên quan đến "sự thiếu sót" của int để xử lý mili giây trong các trò chơi . A positive intthường lên tới 2.147.483.647 nếu được ký và lên tới 4.294.967.295 nếu không được ký ... vì vậy ngay cả khi chúng tôi xem xét cái nhỏ hơn, 2.147.483.647 mili giây là gần 25 ngày ... Nó đủ để xử lý hầu hết trò chơi bộ hẹn giờ và ngay cả khi nó không đủ, chúng ta vẫn có thể sử dụng hợp lý unsigned int(~ 50 ngày) hoặc thậm chí là long long(như tôi thường làm).
Valkea

1
@Valkea Điểm không phải là tối đa, đó là độ phân giải ở cấp thấp. Vì một khung hình duy nhất ở 60 FPS chỉ là 16 2/3 ms, độ chính xác 1ms (tính từ mili giây là số nguyên) biểu thị tỷ lệ lỗi lớn hơn 5% - quá đủ để ném các mô phỏng ra xa. Một số nguyên của micro giây sẽ có thể chịu được, nhưng mili giây thì quá thô.
Steven Stadnicki

Vâng, bạn cần thời gian dưới một phần nghìn giây cho nhiều thứ và bộ hẹn giờ có độ phân giải cao để tìm ra thứ mà GLUT không cung cấp (mà tôi biết). Không tệ khi chỉ viết một mã nền tảng nhỏ để sử dụng QueryPerformanceCountertrên Windows và gettimeofdaytrên hầu hết các mã khác. Bạn sẽ phải làm bẩn tay mình và nhắm đến một chút nhiều hơn mẫu số chung ít nhất của API nền tảng, đặc biệt là trong C và C ++.
Sean Middleditch

Độ chính xác như vậy không hữu ích cho tất cả các trò chơi. Tuy nhiên đây là một lời giải thích rất thú vị, trả lời đầy đủ câu hỏi của tôi về quan điểm của bạn liên quan đến int và đồng hồ. Tôi chưa bao giờ cần đồng hồ có độ chính xác cao, nhưng tôi đoán đã đến lúc đào sâu kiến ​​thức về vấn đề này. Cảm ơn bạn;)
Valkea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.