Vì vậy, tôi đã làm việc trên một dự án trong một thời gian và gần đây đã vấp phải một vấn đề:
Cách tiếp cận phổ biến đối với vật lý độc lập tốc độ khung hình là sử dụng khoảng thời gian cập nhật cố định (ví dụ: Unity) hoặc chỉ nhân mỗi thay đổi vật lý với delta. Vì vậy, nó sẽ trông giống như thế này:
update(int delta)
{
...
positionX += velocityX * delta;
...
}
Và khi tăng tốc được thêm vào, sự thay đổi vận tốc được xử lý tương tự:
update(int delta)
{
...
velocityX += accelerationX * delta;
...
}
Điều này hoạt động tốt cho hầu hết các trường hợp sử dụng. Trên thực tế rất tốt, tôi đã không nhận thấy bất cứ điều gì đã tắt trong nhiều tháng. Nhưng có một vấn đề với logic này, cụ thể là vị trí sẽ hơi lệch đối với tốc độ khung hình hoàn toàn khác nhau. Vấn đề này không đáng kể khi làm việc với các thay đổi tốc độ khung hình nhỏ, nhưng hoàn toàn đáng chú ý một khi thời gian delta thay đổi bởi số lượng lớn hơn. Giả sử, tốc độ FPS từ 30 đến 600. Bây giờ, trong một trò chơi bình thường, FPS chỉ bị khóa và ngay cả khi các vị trí bị tắt trong một vài khung hình như 5% thì không thành vấn đề vì người ta không chú ý đến nó. Nhưng tôi tự nhân bội số delta với một yếu tố để hoàn thành một hiệu ứng nhất định và lỗi này có phần đáng chú ý và phá vỡ trò chơi .
Một ví dụ nhỏ để làm rõ những gì tôi muốn nói:
Có một đối tượng trò chơi với vị trí bắt đầu posX = 0 và x-Velocity là 10 và gia tốc ngang là 0,1.
Sau hai khung hình, với 50FPS, điều này sẽ dẫn đến (với một delta trung bình)
velocityX += acceleration * delta;
posX += velocityX * delta;
velocityX += 0.1 * 20; //velocityX = 12
posX += 12 * 20 //posX = 240
//next frame
velocityX += 0.1 * 20; //velocityX = 14
posX += 14 * 20 //posX = 520 (240 + 280)
Sau một khung hình với 25FPS, bằng với khoảng thời gian giống như hai khung hình với 50FPS, điều này sẽ giúp chúng tôi:
velocityX += 0.1 * 40; //velocityX = 14
posX += 14 * 40; //posX = 560
Vì vậy, hai tình huống có cùng khoảng thời gian trôi qua, chúng tôi nhận được kết quả khác nhau (520 cho 50FPS và 560 cho 25FPS).
Bây giờ, vấn đề rõ ràng là có thêm một khung hình (trong ví dụ này, nó có thể là bất kỳ số lượng khung hình nào nhưng kết quả vẫn khác nhau trong cùng một khoảng thời gian) trong đó gia tốc được áp dụng và do đó bạn sẽ có được nhiều FPS hơn.
Ổn định đồng bằng không phải là một lựa chọn vì tôi cần các đồng bằng khác nhau cho hiệu ứng đã nói, vì vậy tôi cần vật lý để hoàn toàn độc lập ở đó. Có ai từng gặp một tình huống tương tự và có giải pháp nào cho nó không?