Sự khác biệt giữa Update và FixedUpdate trong Unity là gì và tôi có nên bận tâm không?


10

Tôi được yêu cầu sử dụng Update()cho đồ họa và FixedUpdate()vật lý, nhưng đôi khi đầu vào của tôi không đăng ký khi tôi sử dụng FixedUpdate(). Nó hoạt động tốt nếu tôi sử dụng Update()cho tất cả mọi thứ mặc dù.

Tôi có nên bận tâm với FixedUpdate(), hoặc tôi đang làm gì đó sai?

Câu trả lời:


10

FixedUpdatecó thể chạy nhanh hơn hoặc chậm hơn Updatetùy thuộc vào cài đặt của bạn. Điều đó sẽ phụ thuộc vào tải (tốc độ Updatechạy) và tốc độ bạn đã đặt FixedUpdate(tìm thấy trong Chỉnh sửa-> Cài đặt dự án-> Thời gian). Lý tưởng nhất, vì Updateđược chạy một lần trên mỗi khung, đây là nơi bạn muốn chụp đầu vào. Nếu bạn cần hành động theo đầu vào trong FixedUpdatephương thức (như điều khiển các cơ thể vật lý), hãy đặt cờ Updatesau đó xử lý chúng trong FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

Việc kiểm soát vật lý từ FixedUpdatephương pháp vẫn là một ý tưởng tốt , vì không có khả năng vật lý cần được cập nhật thường xuyên và vật lý trên một bản cập nhật cố định dễ dự đoán hơn (tính xác định ) so với vật lý trên một bản cập nhật biến.


Nếu thay vì một điều kiện bool (es.GetMouseButtonDown) thì chúng ta cần đọc giá trị từ một trục (Input.GetAxis ("Ngang"))? Nếu cập nhật được thực thi nhiều lần hơn thì FixedUpdate, lời khuyên của bạn trong trường hợp đó là gì? Cuối cùng chúng ta có nên xem xét để tính giá trị trung bình của trục xảy ra trong một số Cập nhật trước khi sử dụng nó vào Cập nhật không? (+1 btw)
Heurrorms

Làm cách nào để tìm ra FixedUpdate của tôi nhanh như thế nào?
Tokamocha

1
@Tokamocha Tỷ lệ cập nhật cố định được đặt trong Chỉnh sửa-> Cài đặt dự án-> Thời gian.
MichaelHouse

@Heisenorms Cá nhân tôi sẽ chỉ sử dụng giá trị cuối cùng và xem nó hoạt động tốt như thế nào. Nếu tôi nhận được kết quả không mong muốn, tôi có thể tính trung bình đang chạy của giá trị trục cho đến khi nó được xử lý FixedUpdate. Đó là một trong những điều cần thử nghiệm chơi để thực sự tìm ra "cảm giác" nào đúng.
MichaelHouse

1
Tôi đã tìm thấy trong các thử nghiệm gần đây, trái với những gì được ngụ ý trong các tài liệu, các cờ đầu vào mới đã có sẵn trong FixedUpdate (ít nhất là trên PC). Vì vậy, đặt cờ trong Cập nhật và sau đó thực hiện trên FixUpdate tiếp theo sau đó (tức là khung tiếp theo) như được hiển thị ở đây thực sự có thể thêm khung độ trễ cho trò chơi, liên quan đến việc xử lý trực tiếp đầu vào trong FixedUpdate. Điều này đòi hỏi một số lưu ý mặc dù để tránh xử lý hai đầu vào trên các khung có nhiều FixedUpdate hoặc thiếu các đầu vào trên các khung không có FixedUpdate.
DMGregory

7

Bạn cần hiểu những gì mỗi người làm. Update()được gọi thường xuyên nhất có thể (không chắc chắn, có thể nó có thể được giới hạn), dù bằng cách nào - mỗi khung. FixedUpdate()được gọi là mỗi lượng thời gian không đổi (do đó "cố định").

Đầu vào đi vào Update(), đơn giản như vậy (vì như bạn nhận thấy FixedUpdate()có thể không bắt được sự kiện đầu vào). Logic trò chơi tuy nhiên có thể đi vào một trong hai. Vật lý cần phải có tính quyết định và đó là lý do tại sao nó phải ở trong đó FixedUpdate(). Những thứ khác không phải. Tùy thuộc vào cách sử dụng mà bạn phải quyết định chức năng nào là phù hợp.

Ngoài ra, đáng để nói rằng một số ứng dụng có tất cả cập nhật logic trò chơi FixedUpdate()(thậm chí bên ngoài Unity) - nó được gọi là "vòng lặp trò chơi bước cố định". Có tất cả mã cập nhật trong một chức năng bước cố định mang lại cho bạn tính quyết định và làm cho ứng dụng của bạn có nhiều khả năng hoạt động theo cùng một cách mỗi lần (và trên mỗi thiết bị). Cũng cho phép một số tính năng ưa thích, như replay.


Vì vậy, nếu tôi đặt mọi thứ vào FixedUpdate (), trò chơi của tôi vẫn sẽ đăng ký tất cả các đầu vào, phải không?
Tokamocha

1
Không, bạn có thể đặt ở đó tất cả các cập nhật logic trò chơi nhưng không kiểm tra đầu vào.
NPS

2
Câu trả lời này chứa đầy thông tin. Trước hết, FixedUpdate được gọi là 1 / fixedDeltaTime lần mỗi giây , không phải cứ sau n: th fixedDeltaTime. Thứ hai, logic trò chơi phải luôn luôn đi trong FixedUpdate vì nó giúp dễ dàng hơn lý do. Cập nhật chỉ dành cho mục đích kết xuất (tôi biết hầu như không có ai trong cộng đồng Unity theo dõi điều này, nhưng đó thực sự là cách nó phải được thực hiện). Thứ ba, FixedUpdate và mối quan hệ của nó với động cơ vật lý không liên quan gì đến tính quyết định.
Thr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.