Tôi đang cố giới hạn khung hình trên giây trong vòng lặp đang thực hiện kiểm tra giao lộ, sử dụng C++ với chrono và chuỗi.Làm thế nào để giới hạn FPS trong một vòng lặp với C + +?
Đây là mã của tôi:
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::chrono::system_clock::time_point lastFrame = std::chrono::system_clock::now();
while (true)
{
// Maintain designated frequency of 5 Hz (200 ms per frame)
now = std::chrono::system_clock::now();
std::chrono::duration<double, std::milli> delta = now - lastFrame;
lastFrame = now;
if (delta.count() < 200.0)
{
std::chrono::duration<double, std::milli> delta_ms(200.0 - delta.count());
auto delta_ms_duration = std::chrono::duration_cast<std::chrono::milliseconds>(delta_ms);
std::this_thread::sleep_for(std::chrono::milliseconds(delta_ms_duration.count()));
}
printf("Time: %f \n", delta.count());
// Perform intersection test
}
Vấn đề tôi đang gặp là mỗi đầu ra khác của đồng bằng đang cho thấy một lượng rất nhỏ, chứ không phải là ~ 200 ms/khung Tôi đang nhắm đến:
Time: 199.253200
Time: 2.067700
Time: 199.420400
Time: 2.408100
Time: 199.494200
Time: 2.306200
Time: 199.586800
Time: 2.253400
Time: 199.864000
Time: 2.156500
Time: 199.293800
Time: 2.075500
Time: 201.787500
Time: 4.426600
Time: 197.304100
Time: 4.530500
Time: 198.457200
Time: 3.482000
Time: 198.365300
Time: 3.415400
Time: 198.467400
Time: 3.595000
Time: 199.730100
Time: 3.373400
Bất kỳ suy nghĩ nào về lý do tại sao điều này xảy ra?
Thời gian của bạn có vẻ là khoảng 200ms, vậy vấn đề là gì? Bạn không thể mong đợi để có được bất cứ điều gì gần thời gian chính xác .. bạn nhận được một ít hơn 200, sau đó bạn nhận được một chút nhỏ hơn, đối phó với nó - bạn sẽ không bao giờ nhận được chính xác 200 mỗi lần. –
Tôi không nhắm đến thời gian chính xác, nhưng tôi không hiểu tại sao một số vòng lặp lặp lại là 1-4 ms và các vòng lặp khác là ~ 200 ms. – Irongrave
vì đôi khi deltacount của bạn <200 và bạn vẫn xuất nó – strangeqargo