지연된 엔진 이벤트

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

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로 왕복해야 하는 이벤트를 발생시킬 수 있습니다.
  • 이벤트 처리기는 이벤트가 발생할 때마다 장소를 변경하거나 다른 이벤트를 트리거할 수 있습니다.
  • 속성이 두 번 변경되더라도 이벤트가 여러 번 발생할 수 있습니다.An event can fire multiple times despite being redundant, such as a property changing twice.

Luau가 실행될 수 있는 엔진 수명 주기의 특정 부분을 가지면 엔진은 다양한 가정을 사용하여 향상된 성능을 얻을 수 있습니다.

  • 성능 중요 시스템은 성능 향상을 위해 Luau에 양보할 필요가 없습니다.
  • 엔진 자체가 변경하지 않는 한, 장소는 재시작 지점 외부에서 결코 변경되지 않습니다.

재시작 지점

지연된 후, 이벤트 처리기는 다음 재시작 지점에서 재시작됩니다. 현재 재시작 지점 집합에는 다음이 포함됩니다:

영향을 받는 일반적인 코드 패턴

원격 이벤트로 인해 다음 예제는 올바르게 작동을 중지하거나 미묘하게 다른 동작을 보입니다; 즉시 재개되는 이벤트에 의존합니다.

중간 실행 중 이벤트 트리거 및 캡처

이 예제에서는 연기된 이벤트가 활성화되어 있기 때문에 반환되는 false 항상 지연된 이벤트가 활성화되어 있기 때문에 반환됩니다.올바르게 작동하려면 스레드가 이벤트가 발생할 때까지 양보해야 합니다.


local success = false
event:Connect(function ()
success = true
end)
doSomethingToTriggerEvent() -- `이벤트` 발생 원인
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에 참조하십시오.