FixedUpdate chạy ổn định, sao không dùng cho tất cả tác vụ?
Minh Khoa
Tác giả
Tóm tắt:
FixedUpdate()ổn định về bước thời gian mô phỏng, không phải ổn định theo từng frame được render. Physics cần nhịp này; input, UI, camera và hình ảnh thì không.
FixedUpdate() mặc định chạy với timestep 0.02s — tương đương 50 bước vật lý mỗi giây. Nghe rất đều, rất đáng tin, vậy tại sao không gom hết logic game vào đây?
Cú lừa nằm ở chữ “ổn định”.
## ⏱️ 1. FixedUpdate ổn định cái gì?
Unity giữ lượng thời gian mô phỏng của mỗi bước cố định. Nhưng số lần FixedUpdate() trong một frame render thì không cố định:
- Game chạy nhanh hơn physics: một frame có thể không có
FixedUpdate(). - Game chạy chậm: Unity có thể gọi
FixedUpdate()nhiều lần liên tiếp trong một frame để bắt kịp.
Render 120 FPS, Physics 50 Hz:
Update: U U U U U U ...
FixedUpdate: F F F ...
Render 20 FPS, Physics 50 Hz:
Mỗi frame có thể phải chạy: F → F → Update
Hãy tưởng tượng Update() là camera chụp một tấm hình mỗi frame, còn FixedUpdate() là kế toán physics chốt sổ theo từng khoảng 20ms. Có lúc camera chụp mà chưa có sổ mới; có lúc phải chốt 2–3 cuốn sổ rồi camera mới được chụp.
👉 Ổn định cho mô phỏng không đồng nghĩa với mượt cho mắt người.
🛑 2. Vì sao không dùng FixedUpdate cho tất cả?
Input sẽ phản hồi chậm hoặc bị bỏ lỡ
Input xảy ra theo frame người chơi tương tác. Với Legacy Input, các sự kiện như Input.GetButtonDown() được reset mỗi frame nên Unity khuyên đọc trong Update().
Nếu chỉ đọc trong FixedUpdate(), một cú bấm nhanh có thể phải chờ physics tick tiếp theo. Với Input System mới, bạn vẫn nên nhận input bằng action/callback rồi lưu lại trước khi áp dụng lên Rigidbody.
UI, camera và animation có thể bị giật
Màn hình đang render 120 FPS nhưng logic trong FixedUpdate() chỉ đổi 50 lần/giây. Kết quả: nhiều frame dùng lại cùng một trạng thái, nhìn thành khựng hoặc trễ.
Rigidbody quan trọng có thể bật Interpolation để làm mượt hình ảnh. Nhưng đó không phải lý do để đưa UI, camera hay animation thị giác vào .