Verse의 표현식은 즉시(immediate) 표현식이거나 비동기화(async) 표현식일 수 있습니다. 이는 표현식이 시뮬레이션 업데이트를 기준으로 평가하는 데 걸리는 시간을 설명합니다.
시뮬레이션 업데이트를 새로운 프레임이 표시되는 시점으로 생각하면 이해하기가 쉽습니다.
온라인 게임이 서버와 동기화되지 않는 경우처럼 새로운 프레임 전에 여러 시뮬레이션 업데이트가 발생하는 경우도 있습니다.
| 즉시 | 비동기 |
|---|---|
즉시 표현식은 딜레이 없이 평가합니다. 즉, 평가가 현재 시뮬레이션 업데이트 내에 완료됩니다. | 비동기화 표현식은 평가하는 데 시간이 걸릴 가능성이 있지만 반드시 그런 것은 아닙니다. 비동기화 표현식은 현재 또는 이후의 시뮬레이션 업데이트에서 완료되거나 완료되지 않을 수 있습니다. |
비동기화 컨텍스트
비동기화 표현식은 비동기화 컨텍스트가 있는 모든 Verse 코드에서 사용할 수 있습니다.
비동기화 컨텍스트는 suspends 이펙트 지정자가 있는 함수의 바디입니다. suspends 이펙트는 비동기화 함수가 정지하고 여러 시뮬레이션 업데이트가 완료되기 전 다양한 지점에서 다른 동시성 표현식으로 컨트롤을 이전할 수 있음을 나타냅니다.
Verse 장치의 OnBegin() 함수는 비동기화 코드의 시작점으로 사용되는 일반적인 비동기화 함수입니다.
비동기화 함수 호출에는 즉시 함수 호출과 동일한 다음과 같은 구문이 있습니다.
OnBegin<override>()<suspends> : void =
HideAllPlatforms()
HideAllPlatforms()<suspends> : void =
for (Platform : Platforms):
Platform.Hide()
Sleep(Delay)다른 표현식과 마찬가지로 비동기화 표현식도 결과를 가질 수 있습니다. 비동기화 표현식의 결과는 완료된 후에만 제공됩니다.
# Npc is undefined until it is bound after MoveToNearestNPC() completes which may be several frames into the future
Npc := Player.MoveToNearestNPC()
#Only called after MoveToNearestNPC() completes
Print("Moved to {Npc}")비동기 컨텍스트(비동기 함수의 본문 내부) 안에 있는 모든 코드 블록에는 즉시 및 비동기 표현식이 함께 있을 수 있습니다.
어떤 표현식에 비동기화 코드 블록이 있는 경우 전체 코드 블록이 비동기로 간주됩니다.
모든 표현식에 즉시 코드 블록이 있는 경우 전체 코드 블록이 즉시로 간주됩니다.
아래 예시의 모든 표현식은 비동기화 표현식이므로 전체 코드 블록은 비동기입니다.
Sleep(2.0) # waits 2 seconds
Boss.TauntEmote() # waits until TauntEmote() completes
Player.MoveToNearestNPC() # waits until MoveToNearestNPC() completes아래 예시의 모든 표현식은 즉시 표현식이므로 전체 코드 블록은 즉시입니다.
Print("Reset after explosion")
Platform.Show()
set SecondsUntilExplosion = 12.0아래 예시의 표현식은 비동기화 표현식과 즉시 표현식이 혼합되어 있으므로 전체 코드 블록은 비동기입니다.
Print("Started")
var Seconds := 1.0
Sleep(Seconds)
Print("Waited {Second} seconds")
set Second += 1.0
Sleep(Seconds)
Print("Waited {Second} seconds")
set Second += 1.0
즉시 표현식은 서로 붙어 있습니다. 인접한 비동기화가 아닌 즉시 표현식은 모두 아토믹으로 간주됩니다. 즉 코드가 선점 또는 컨텍스트 전환 없이 동일한 업데이트 내에서 중단되지 않고 확실하게 실행됩니다. 이는 마치 해당 코드에 자동 상호 배타성 프리미티브가 래핑된 것과 같습니다.
위의 코드 예시에서 이러한 즉시 표현식은 다음과 같이 아토믹으로 취급됩니다.
# These two expressions are always kept together
Print("Started")
var Seconds := 1.0
Sleep(Seconds)
# These two expressions are always kept together
Print("Waited {Second} seconds")
set Second += 1.0
다른 코드 블록과 마찬가지로 비동기화 코드 블록의 마지막 표현식은 결과로 사용됩니다.
동시성 표현식
Verse에서는 동시성 표현식(Concurrency Expression)을 사용하여 표현식이 동시에 실행되는지, 아니면 순차적으로 실행되는지 결정합니다. 비동기화 표현식은 시간에 걸쳐 실행 또는 인보크되므로 동시성 표현식은 비동기화 표현식을 사용하는 경우 특히 유용할 수 있습니다.
구조적 동시성
비동기화 표현식은 실행에 오랜 시간이 걸리는 경우 다른 표현식의 실행을 차단합니다. 예를 들어 Sleep(90.0)을 사용하면 프로그램이 90초 동안 대기하며 Sleep(90.0)이 완전히 실행될 때까지 다음 표현식을 차단합니다.
구조적 동시성 표현식은 비동기화 논리 타임 플로를 지정하고, 특정 비동기화 컨텍스트 스코프에 논리적으로 제한되는 수명(예: 비동기화 함수 바디)으로 비동기화 표현식의 차단 속성을 수정하는 데 사용됩니다.
이것은 연관 스코프 내로 제한하는 block, if, for, loop 같은 구조적 플로 컨트롤과 유사합니다.
Verse 비동기화 표현식은 다른 언어의 비동기화 구현에 사용되는 yield 및 await 프리미티브를 사용하지 않습니다. Verse 동시성 표현식과 내부 메커니즘을 사용하여 동일한 메커니즘이 구현됩니다.
구조적 동시성에 대한 자세한 내용은 Sync, Race, Rush, Branch를 참고하세요.
비구조적 동시성
비구조적 동시성 표현식은 spawn 하나뿐입니다. 이 표현식의 수명은 특정 비동기화 컨텍스트 스코프에 논리적으로 제한되지 않지만 실행되는 스코프 이상으로 연장될 수 있습니다.
비구조적 동시성은 비상 출구와 유사합니다. 정기적으로 사용해서는 안 되지만 경우에 따라 최선의 유일한 방법이 되기도 합니다.
구조적 동시성 표현식(sync, race, rush, branch)은 가능하면 비구조적 동시성(spawn) 표현식 앞에 사용되어야 합니다.
비구조적 동시성에 대한 자세한 내용은 Spawn을 참고하세요.
현재 실행 중인 비동기화 표현식 추적 작업
비동기화 표현식에는 작업이 연결되어 있습니다.
작업(task)은 실행이 시작되었지만 다른 작업이 완료되도록 정지된 비동기화 함수를 나타내는 오브젝트입니다.
작업을 사용하여 비동기화 표현식의 상태를 확인하고 원하는 경우 비동기화 표현식을 취소할 수 있습니다.
작업에 대한 자세한 내용은 작업을 참고하세요.