So sánh Update và LateUpdate

tìm hiểu điểm khác nhau giữa Update và LateUpdate

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

Lượt nghé thăm