ความแตกต่างระหว่าง Update และ FixedUpdate ใน Unity คืออะไรและฉันควรจะสนใจอะไร?


10

ฉันบอกว่าจะใช้Update()สำหรับกราฟิกและFixedUpdate()ฟิสิกส์ FixedUpdate()แต่บางครั้งปัจจัยการผลิตของฉันจะไม่ลงทะเบียนเมื่อฉันใช้ มันใช้งานได้ดีถ้าฉันใช้Update()กับทุกสิ่ง

ฉันควรจะรำคาญFixedUpdate()หรือฉันกำลังทำอะไรผิดหรือเปล่า?

คำตอบ:


10

FixedUpdateสามารถทำงานได้เร็วหรือช้ากว่าUpdateทั้งนี้ขึ้นอยู่กับการตั้งค่าของคุณ สิ่งนั้นจะขึ้นอยู่กับโหลด (ความเร็วในการUpdateทำงาน) และความเร็วที่คุณตั้งไว้FixedUpdate(ดูได้ใน Edit-> Project Settings-> Time) โดยหลักการแล้วUpdateจะทำงานหนึ่งครั้งต่อเฟรมนี่คือที่ที่คุณต้องการจับภาพอินพุต หากคุณจำเป็นต้องดำเนินการกับอินพุตในFixedUpdateวิธีการ (เช่นการควบคุมร่างกายฟิสิกส์) ให้ตั้งค่าสถานะUpdateแล้วจัดการกับสิ่งต่อไปนี้FixedUpdate:

bool leftMouseDown = false;

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

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

ยังคงเป็นความคิดที่ดีในการควบคุมฟิสิกส์จากFixedUpdateวิธีการเนื่องจากฟิสิกส์ไม่น่าจะต้องมีการปรับปรุงบ่อยครั้งและฟิสิกส์ในการอัพเดทแบบคงที่นั้นง่ายต่อการทำนาย ( ดีกรี ) กว่าฟิสิกส์ในการอัพเดทตัวแปร


แล้วถ้าแทนที่จะเป็นเงื่อนไขบูล (es.GetMouseButtonDown) เราต้องอ่านค่าจากแกน (Input.GetAxis ("แนวนอน"))? หากมีการดำเนินการอัปเดตมากกว่านี้แล้วคงที่ UpdateUpdate คุณมีคำแนะนำอะไรในกรณีนี้ ในที่สุดเราควรพิจารณาการคำนวณค่าเฉลี่ยของแกนที่เกิดขึ้นระหว่างการอัพเดทหลายครั้งก่อนที่จะนำไปใช้ในการอัพเดทหรือไม่? (+1 btw)
Heisenbug

ฉันจะทราบได้อย่างไรว่า FixedUpdate ของฉันเร็วแค่ไหน
Tokamocha

1
@Tokamocha อัตราการอัพเดทคงที่ถูกกำหนดไว้ใน Edit-> Project Settings-> Time
MichaelHouse

@ Heisenbug โดยส่วนตัวแล้วฉันจะใช้ค่าสุดท้ายและดูว่ามันใช้งานได้ดีแค่ไหน FixedUpdateถ้าฉันได้รับผลที่ไม่คาดคิดผมอาจจะคำนวณค่าเฉลี่ยของการทำงานของค่าแกนจนกว่าจะมีการประมวลผลโดย นั่นเป็นหนึ่งในสิ่งเหล่านั้นที่ต้องมีการทดสอบการเล่นเพื่อให้เข้าใจว่า "รู้สึก" ถูกต้องจริง ๆ
MichaelHouse

1
ฉันได้พบในการทดสอบเมื่อเร็ว ๆ นี้ซึ่งตรงกันข้ามกับสิ่งที่บอกเป็นนัยในเอกสารแล้วแฟล็กอินพุตใหม่มีอยู่ใน FixedUpdate (อย่างน้อยบนพีซี) ดังนั้นการตั้งค่าสถานะในการอัปเดตแล้วดำเนินการกับมันใน FixedUpdate ถัดไปหลังจากนั้น (เช่นเฟรมถัดไป) ดังที่แสดงที่นี่สามารถเพิ่มเฟรมเวลาแฝงลงในเกมเมื่อเทียบกับการจัดการอินพุตใน FixedUpdate โดยตรง สิ่งนี้ต้องการการดูแลบางอย่างแม้ว่าจะหลีกเลี่ยงอินพุตที่มีการจัดการสองเท่าในเฟรมที่มี FixedUpdates หลายตัวหรืออินพุตที่ขาดหายไปในเฟรมที่ไม่มี FixedUpdate
DMGregory

7

คุณต้องเข้าใจสิ่งที่แต่ละคนทำ Update()ได้รับการเรียกบ่อยเท่าที่จะทำได้ (ไม่แน่ใจว่ามันอาจจะถูกต่อยอด) ไม่ว่าจะด้วยวิธีใด - แต่ละเฟรม FixedUpdate()ได้รับการเรียกทุกระยะเวลาคงที่ (เพราะฉะนั้น "คงที่")

การป้อนข้อมูลจะUpdate()ง่ายเหมือนที่ (เพราะอย่างที่คุณสังเกตเห็นFixedUpdate()อาจไม่ได้รับการป้อนข้อมูลเหตุการณ์) เกมลอจิกอาจเข้าไปในหนึ่งเดียว FixedUpdate()ฟิสิกส์จะต้องมีการกำหนดและที่ว่าทำไมมันควรจะอยู่ใน สิ่งอื่น ๆ ไม่จำเป็นต้อง ขึ้นอยู่กับการใช้งานที่คุณต้องตัดสินใจว่าหน้าที่ใดเหมาะสม

Althouth เป็นสิ่งที่ควรค่าแก่การกล่าวว่าแอปพลิเคชั่นบางตัวมีการอัพเดทลอจิกเกมทั้งหมดFixedUpdate()(แม้ภายนอกUnity) - มันเรียกว่า "loop step game loop" การมีรหัสการอัปเดตทั้งหมดในฟังก์ชั่นขั้นตอนคงที่ช่วยให้คุณกำหนดได้และทำให้แอปของคุณมีแนวโน้มที่จะทำงานในลักษณะเดียวกันทุกครั้ง (และในแต่ละอุปกรณ์) ยังช่วยให้คุณสมบัติแฟนซีบางอย่างเช่นไกล


ดังนั้นถ้าฉันใส่ทุกอย่างใน FixedUpdate () เกมของฉันจะยังคงลงทะเบียนอินพุตทั้งหมดใช่มั้ย
Tokamocha

1
ไม่คุณสามารถอัปเดตลอจิกเกมทั้งหมดได้ แต่ไม่ต้องตรวจสอบอินพุต
NPS

2
คำตอบนี้เต็มไปด้วยข้อมูลพลาด อันดับแรกของ FixUpdate ทั้งหมดได้รับการเรียก 1 / fixedDeltaTime ครั้งต่อวินาทีไม่ใช่ทุก n: th fixedDeltaTime ประการที่สองตรรกะของเกมควรอยู่ใน FixedUpdate เสมอเนื่องจากทำให้ง่ายขึ้น การอัปเดตมีวัตถุประสงค์เพื่อการแสดงผลเท่านั้น (ฉันรู้ว่าแทบจะไม่มีใครในชุมชน Unity ติดตามเรื่องนี้ แต่นั่นเป็นสิ่งที่ควรทำจริง ๆ ) ประการที่สาม FixedUpdate และความสัมพันธ์กับเครื่องยนต์ฟิสิกส์ไม่มีส่วนเกี่ยวข้องกับการกำหนด
Thr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.