Giới thiệu
Như bạn đã biết unity cung cấp 3 phương thức Update
Đó là :
- Update
- FixedUpdate
- LateUpdate
Chúng đều có vai trò và ý nghĩa riêng và hoàn toàn khác nhau. Bài vết này sẽ giải thích sự khác biệt giữa Update và LateUpdate
Khác nhau về thời gian thực thi
Khẳng định đầu tiên là LateUpdate không bao giờ chạy trước Update.
Update được gọi ở đầu frame
LateUpdate được gọi sau khi tất cả Update hoàn tất
Nếu bạn nhầm lẫn chúng sẽ gây ra vấn đề hiển thị nội dung ra màn hình Đặc biệt là khi Camera di chuyển
Update và LateUpdate đều là event function
Chúng là các phương thức đặc biệt của Unity và có sẵn khi class của bạn kế thừa MonoBehaviour. Nghĩa là Update và LateUpdate đều được thực thi tự động bởi Unity. Chúng sẽ không chạy nếu bạn không kế thừa từ MonoBehaviour.
Nếu bạn chưa đọc qua bài giới thiệu về MonoBehaviour bạn có thể tìm thấy nó ở đây
Chúng ta hãy theo dõi ví dụ sau.
Đầu tiên chúng ta có đoạn code di chuyển nhân vật bằng Update, chúng ta sẽ sử dụng lại đoạn code ở bài giới thiệu về Transform.
Nó trông như thế này
Tiếp theo chúng ta viết một đoạn code ngắn để làm cho camera di chuyển theo nhân vật
Nó hoạt động chính xác như những gì chúng ta nghĩ.
Nhưng
Có một điểm tai hại ở cách thiết kế này mà bạn cần biết chúng ta sẽ nói về nó ở phần tiếp theo của bài viết. Chúng ta sẽ bỏ qua việc dùng trực tiếp Transform trong Update.
Lỗi khi đối tượng và camera được di chuyển bằng Update
Điều cần chú ý ở đây đó là Thứ tự thực thi Update giữa các Monobehaviour không được đảm bảo. Tức là bạn sẽ không biết chắc chắn rằng Update di chuyển của camera sẽ chạy trước hay Update di chuyển đối tượng chạy trước.
Trong trường hợp này, Update của Camera phải chạy sau Update của đối tượng.
Trường hợp chạy bình thường sẽ là:
[Frame 1] Đối tượng di chuyển -> Camera cập nhật di chuyển của đối tượng
[Frame 2] Đối tượng di chuyển -> Camera cập nhật di chuyển của đối tượng
[Frame 3] Đối tượng di chuyển -> Camera cập nhật di chuyển của đối tượng
Tuy nhiên do thứ tự Update không được đảm bảo nên có thể trường hợp sau sẽ sảy ra:
[Frame 1] Đối tượng di chuyển -> Camera cập nhật di chuyển của đối tượng
[Frame 2] Camera cập nhật di chuyển của đối tượng -> Đối tượng di chuyển
[Frame 3] Đối tượng di chuyển -> Camera cập nhật di chuyển của đối tượng
Ta thấy rằng ở frame 2 camera đã bỏ lỡ cập nhật hình ảnh di chuyển của đối tượng, nói cách khác camera đã bỏ qua khung hình
Để hình dung cụ thể hơn
Ban đầu đối tượng của chúng ta đang ở A (0, 0, 0)
[Frame 1] Đối tượng di chuyển về bên phải theo trục X 1cm
-> Camera hiển thị đối tượng ở vị trí B (1, 0, 0)
[Frame 2] Camera hiển thị đối tượng vẫn ở B
-> Đối tượng di chuyển về bên phải theo trục X 1cm (đến điểm C(2, 0, 0))
[Frame 3] Đối tượng di chuyển về bên phải theo trục X 1cm
-> Camera hiển thị đối tượng ở vị trí D (3, 0, 0)
Camera đã bỏ lỡ cập nhật hình ảnh đối tượng ở vị trí điểm C (2, 0, 0) lên màn hình
Tần suất bỏ lỡ khung hình sẽ xảy ra thường xuyên nếu thiết bị của bạn bị drop khung hình
Để tránh điều này bạn có thể sử dụng LateUpdate.
Xử lý cập nhật Camera trong LateUpdate
Vấn đề gây ra việc bỏ lỡ khung hình đó là việc Camera chạy trước. Nếu Camera được thực thi sau khi Update của đối tượng sẽ không có vấn đề gì sảy ra.
Ta sẽ chuyển đoạn code xử lý camera sang LateUpdate như sau
Lúc này quá trình render sẽ hoạt động đúng như mong đợi. Ngoài Camera đôi khi có những thứ bạn cần chờ có kết quả từ Update để tiếp tục xử lý trong trường hợp đó hãy sử dụng LateUpdate