Tôi chắc chắn là một chút bị mất với thư viện chrono C++ mới.Xử lý vòng lặp cập nhật bằng C++ Chrono?
Ở đây tôi có vòng lặp cập nhật. Nó chạy hai hoạt động:
engine.Update()
engine.Render()
Đây là những hoạt động lâu dài và khó có thể biết được chúng là bao lâu.
Vì vậy, chúng tôi đo thời gian họ đã thực hiện, sau đó thực hiện một số phép tính và tìm cách tốt nhất để dần dần gọi cập nhật trước khi chúng tôi gọi kết xuất.
Để thực hiện việc này, tôi đang sử dụng chức năng Chrono của C++ 11. Tôi đã chọn nó bởi vì nó có vẻ giống như một việc tốt: chính xác hơn, phụ thuộc nhiều hơn vào nền tảng. Tôi đang tìm thấy tôi đang gặp nhiều vấn đề hơn bây giờ mặc dù.
Sau đây là mã của tôi, cũng như vấn đề chính của tôi. Bất kỳ trợ giúp nào về một trong hai vấn đề, hoặc một cách thích hợp để thực hiện các hoạt động của tôi là rất cần thiết!
Tôi đã đánh dấu câu hỏi của mình trong các nhận xét trực tiếp bên cạnh các dòng được đề cập, mà tôi sẽ lặp lại bên dưới.
File header:
class MyClass
{
private:
typedef std::chrono::high_resolution_clock Clock;
Clock::time_point mLastEndTime;
milliseconds mDeltaTime;
}
Bản cập nhật đơn giản hóa vòng lặp
// time it took last loop
milliseconds frameTime;
// The highest we'll let that time go. 60 fps = 1/60, and in milliseconds, * 1000
const milliseconds kMaxDeltatime((int)((1.0f/60.0f) * 1000.0f)); // It's hard to tell, but this seems to come out to some tiny number, not what I expected!
while (true)
{
// How long did the last update take?
frameTime = duration_cast<milliseconds>(Clock::now() - mLastEndTime); // Is this the best way to get the delta time, with a duration cast?
// Mark the last update time
mLastEndTime = Clock::now();
// Don't update everything with the frameTime, keep it below our maximum fps.
while (frameTime.count() > 0) // Is this the best way to measure greater than 0 milliseconds?
{
// Determine the minimum time. Our frametime, or the max delta time?
mDeltaTime = min(frameTime, kMaxDeltatime);
// Update our engine.
engine->Update((long)mDeltaTime.count()); // From here, it's so much easier to deal with code in longs. Is this the best way to shove a long through my code?
// Subtract the delta time out of the total update time
frameTime -= mDeltaTime;
}
engine->Render();
}
Câu hỏi chính là: mDeltaTime tôi luôn đi ra nhỏ xíu. Về cơ bản nó bị mắc kẹt trong một vòng lặp vô hạn. Điều này là do kMaxDeltatime là siêu nhỏ, nhưng nếu tôi đang nhắm mục tiêu 60 khung hình mỗi giây, tôi đã không tính toán mili giây chính xác?
Dưới đây là tất cả những câu hỏi được liệt kê từ trên:
const milliseconds kMaxDeltatime((int)((1.0f/60.0f) * 1000.0f)); // It's hard to tell, but this seems to come out to some tiny number, not what I expected!
frameTime = duration_cast<milliseconds>(Clock::now() - mLastEndTime); // Is this the best way to get the delta time, with a duration cast?
while (frameTime.count() > 0) // Is this the best way to measure greater than 0 milliseconds?
engine->Update((long)mDeltaTime.count()); // From here, it's so much easier to deal with code in longs. Is this the best way to shove a long through my code?
Tôi xin lỗi vì những kẻ nhầm lẫn. Tôi cảm thấy như một thằng ngốc với thư viện chrono này. Hầu hết các trang web trợ giúp hoặc tài liệu tham chiếu hoặc thậm chí mã trực tiếp cũng rất khó hiểu và dễ hiểu đối với những gì tôi đang áp dụng. Con trỏ vào cách tôi nên tìm kiếm các giải pháp hoặc mã được hoan nghênh rất nhiều!
EDIT: Joachim chỉ ra rằng std :: min/max hoạt động tốt cho mili giây! Đã cập nhật mã để phản ánh thay đổi.
Như cho 'min' /' chức năng max' cho lần, thật dễ dàng để tạo ra các chức năng quá tải đơn giản cho họ. –
@JoachimPileborg Bạn có thể xây dựng? – MintyAnt
Tại sao bạn lại có "vòng lặp bận"? "Polling is Evil". Nếu bạn muốn có một sự chậm trễ, tại sao không chặn trên một bộ đếm thời gian? – paulsm4