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

"การเข้าอีกครั้ง" จะป้องกันไม่ให้เหตุการณ์เรียกใช้งานซ้ำซ้อนเมื่อถึงระดับหนึ่ง ระดับสูงสุดในขณะนี้คือ 10
ประโยชน์ของเหตุการณ์ที่เลื่อนเวลา
พฤติกรรม Immediate มีข้อเสียบางประการ สำหรับทุกอินสแตนซ์ที่เพิ่มเข้าไปในเกมของคุณ คุณสมบัติที่เปลี่ยนแปลง หรือการกระตุ้นอื่นใดที่ถูกเรียก ใช้เวลาต้องให้เครื่องยนต์เรียกใช้โค้ด Luau ก่อนที่จะเกิดสิ่งอื่นๆ
- หากต้องการเปลี่ยน 1,000 คุณสมบัติ ต้องมีโค้ด 1,000 ชิ้นที่อาจต้องทำงานหลังจากการเปลี่ยนแปลงแต่ละครั้ง
- บั๊กที่แปลกและยากที่จะวินิจฉัยสามารถเกิดขึ้นได้ เช่น การเรียกใช้งานเหตุการณ์การลบก่อนที่บางอย่างจะถูกเพิ่ม
- ระบบที่สำคัญต่อประสิทธิภาพสามารถเรียกเหตุการณ์ที่ทำให้ต้องกลับไปกลับมาที่ Luau
- ตัวจัดการเหตุการณ์สามารถทำการเปลี่ยนแปลงสถานที่หรือเรียกเหตุการณ์อื่นได้ทุกเมื่อที่มีการเรียกเหตุการณ์
- เหตุการณ์สามารถเกิดขึ้นซ้ำหลายครั้งถึงแม้ว่าจะไม่มีความจำเป็น เช่น คุณสมบัติเปลี่ยนสองครั้ง
ด้วยการมีส่วนเฉพาะของวงจรชีวิตของเครื่องยนต์ที่ Luau สามารถทำงานได้ เครื่องยนต์สามารถได้รับประสิทธิภาพที่ดีขึ้นโดยการใช้สมมุติฐานหลายอย่าง:
- ระบบที่สำคัญต่อประสิทธิภาพไม่จำเป็นต้องคืนค่าให้กับ Luau ซึ่งทำให้เกิดการเพิ่มประสิทธิภาพ
- จนกว่าเครื่องยนต์จะเปลี่ยนแปลง สถานที่จะไม่เปลี่ยนแปลงนอกจุดการฟื้นฟู
จุดการฟื้นฟู
หลังจากถูกเลื่อนเวลา แล้วตัวจัดการเหตุการณ์จะกลับมาที่จุดการฟื้นฟูถัดไป ขณะนี้ชุดของจุดการฟื้นฟูประกอบด้วย:
- การประมวลผลข้อมูลเข้า (ฟื้นฟูหนึ่งครั้งต่อข้อมูลที่จะประมวลผล ดูที่ UserInputService)
- การฟื้นฟูสคริปต์รอแบบดั้งเดิม เช่น wait(), spawn(), และ delay()
รูปแบบโค้ดที่ได้รับผลกระทบทั่วไป
ด้วยเหตุการณ์ระยะไกล ตัวอย่างต่อไปนี้จะหยุดทำงานอย่างถูกต้องหรือมีพฤติกรรมที่แตกต่างออกไปอย่างละเอียด เนื่องจากพวกเขาอิงจากการฟื้นฟูเหตุการณ์ได้ทันที
กระตุ้นและจับเหตุการณ์กลางการดำเนินการ
ในตัวอย่างนี้ 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("ในสัญญาณ:", part:GetFullName(), #part:GetChildren())
end
part.Destroying:Connect(onPartDestroying)
part:Destroy()
เนื่องจาก Destroy() ทำงานทันทีหลังจากที่สคริปต์ที่เรียกมันกลับไปที่สคริปต์ได้ เสียงแล้วได้ถูกทำลายไปแล้วเมื่อถึงเวลาที่ onPartDestroying() ถูกเรียกใช้ สำหรับตัวอย่างเพิ่มเติม ดูที่ Instance.Destroying.