อีเวนต์เครื่องยนต์ถูกเลื่อนออกไป

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

คุณสมบัติ Workspace.SignalBehavior ควบคุมว่าตัวจัดการเหตุการณ์จะถูกยิงทันทีหรือถูกเลื่อนออกไปเราแนะนำตัวเลือก Enum.SignalBehavior.Deferred ซึ่งช่วยปรับปรุงประสิทธิภาพและความถูกต้องของเครื่องยนต์ตัวจัดการเหตุการณ์สำหรับเหตุการณ์ที่ถูกเลื่อนออกไป จะถูกดำเนินการต่อที่จุดเลื่อนใหม่ พร้อมกับตัวจัดการเหตุการณ์ใหม่ใดๆ

ไดอะแกรมต่อไปนี้เปรียบเทียบพฤติกรรมการเหตุการณ์ Immediate และพฤติกรรมการเหตุการณ์ Deferred

  • ด้วยพฤติกรรม Immediate หากเหตุการณ์กระตุ้นเหตุการณ์อื่น ตัวจัดการเหตุการณ์ที่สองจะเรียกใช้ทันที
  • ด้วยพฤติกรรม Deferred ครั้งที่สองจะถูกเพิ่มลงในด้านหลังของคิวและทำงานในภายหลัง

เวลาทั้งหมดที่ใช้ไม่เปลี่ยนแปลง แต่การสั่งซื้อแตกต่างกัน

A comparison of three event handlers firing with Immediate and Deferred behavior

การ "กลับเข้า" ป้องกันไม่ให้เหตุการณ์ยิงกันอย่างต่อเนื่องเมื่อถึงความลึกที่กำหนด ขีดจํากัดปัจจุบันสําหรับสิ่งนี้คือ 10

ผลประโยชน์จากอีเวนต์ที่เลื่อนออกไป

พฤติกรรม Immediate มีข้อเสียบางอย่างสำหรับทุกตัวอย่างที่เพิ่มลงในเกมของคุณ คุณสมบัติที่เปลี่ยนแปลง หรือการกระตุ้นอื่นๆ ที่เรียกใช้ เครื่องยนต์จะต้องรันโค้ด Luau ก่อนที่จะเกิดอะไรขึ้น

  • เพื่อเปลี่ยน 1,000 คุณสมบัติ 1,000 บรรทัดของโค้ดอาจต้องทำงานหลังจากแต่ละการเปลี่ยนแปลง
  • ข้อบกพร่องที่แปลกและยากต่อการวินิจฉัยสามารถเกิดขึ้นได้ เช่น การยกเลิกการยิงอีเวนต์ก่อนที่จะเพิ่มบางอย่าง
  • ระบบที่สำคัญต่อประสิทธิภาพสามารถยิงเหตุการณ์ที่ต้องการให้พวกเขาย้อนกลับและไปยัง Luau
  • ตัวจัดการอีเวนต์สามารถทำการเปลี่ยนแปลงต่อสถานที่หรือเรียกการเหตุการณ์อื่นใดเมื่อใดก็ได้ที่อีเวนต์ถูกยิง
  • อีเวนต์สามารถยิงหลายครั้งแม้จะซ้ำกันก็ตาม เช่น การเปลี่ยนแปลงคุณสมบัติสองครั้ง

โดยมีส่วนหนึ่งเฉพาะของวงจรชีวิตของเครื่องยนต์ที่ Luau สามารถทำงานได้ เครื่องยนต์สามารถได้รับประสิทธิภาพที่ดีขึ้นโดยใช้หลายสมมติฐาน:

  • ระบบที่สำคัญต่อประสิทธิภาพไม่จำเป็นต้องยอมแพ้ต่อ Luau ซึ่งนำไปสู่การเพิ่มประสิทธิภาพ
  • เว้นแต่เครื่องยนต์เองจะเปลี่ยนแปลงมันแล้ว สถานที่จะไม่เปลี่ยนแปลงนอกจุดเลื่อนต่อไป

จุดเลื่อนต่อไป

หลังจากถูกเลื่อนออกไปแล้ว ตัวจัดการอีเวนต์จะถูกดำเนินต่อที่จุดเลื่อนใหม่ต่อไป ขณะนี้ชุดจุดเลื่อนใหม่รวมถึง:

รูปแบบโค้ดที่ได้รับผลกระทบทั่วไป

ด้วยเหตุการณ์ระยะไกล ตัวอย่างต่อไปนี้จะหยุดทำงานอย่างถูกต้องหรือมีพฤติกรรมที่แตกต่างกันเล็กน้อย; พวกเขาพึ่งพาการดำเนินการต่อไปทันทีที่เหตุการณ์ถูกระงับ

กระตุ้นและจับเหตุการณ์ระหว่างการดำเนินการกลาง

ในตัวอย่างนี้ false จะถูกส่งคืนเสมอเมื่อเหตุการณ์ถูกเลื่อนออกไปเนื่องจากคอลเลกชันไม่ได้รันเพื่อทำงานอย่างถูกต้อง กระทู้จะต้องส่งจนกว่าจะมีการยิงอีเวนต์อย่างน้อยที่สุด


local success = false
event:Connect(function ()
success = true
end)
doSomethingToTriggerEvent() -- ทําให้เหตุการณ์ `event` เกิดขึ้น
return success

ฟังการเกิดครั้งแรกของอีเวนต์


connection = event:Connect(function ()
connection:Disconnect()
-- ทำอะไรบางอย่าง
end)

เมื่อเปิดใช้งานการดําเนินการแบบล่าช้าสําหรับอีเวนต์แล้ว การเรียกใช้ตัวจัดการอีเวนต์หลายรายการสามารถถูกจัดลําดับก่อนที่คุณจะแยกตัวออกจากอีเวนต์เรียก Disconnect() ทิ้งการเรียกใช้ตัวจัดการอีเวนต์ที่รอดำเนินการทั้งหมด—พฤติกรรมเดียวกันที่มีอยู่สำหรับอีเวนต์ทันที

หรือใช้ Once() เป็นวิธีที่สะดวกกว่าในการเชื่อมต่อกับอีเวนต์ที่คุณต้องการเพียงการเรียกครั้งแรกเท่านั้น

อีเวนต์ที่เปลี่ยนเชื้อสายหรือคุณสมบัติ

อีเวนต์ที่ถูกเลื่อนออกไปทำให้เกิดอีเวนต์ที่จัดการการเปลี่ยนแปลงในต้นกำเนิดหรือคุณสมบัติที่จะยิงหลังจากที่ต้นกำเนิดหรือคุณสมบัติเปลี่ยนแปลง:


local part = Instance.new("Part", workspace)
local function onPartDestroying()
print("In signal:", part:GetFullName(), #part:GetChildren())
end
part.Destroying:Connect(onPartDestroying)
part:Destroy()

เนื่องจาก Destroy() ทำงานทันทีหลังจากสคริปต์ที่เรียกมันให้ผลผลิตแล้ว อินสแตนซ์ถูกทำลายแล้วในเวลา onPartDestroying() ที่เรียกสำหรับตัวอย่างเพิ่มเติมดูที่ Instance.Destroying