Verse’te bir ifade ya anlık ya da asenk. olabilir. Bu, bir ifadenin değerlendirilmesinin simülasyon güncellemelerine göre alabileceği süreyi ifade eder.
Simülasyon güncellemesini, yeni bir karenin gösterilmesi gibi düşünebilirsin.
Çevrimiçi bir oyunun sunucuyla senkronizasyon dışına çıkması gibi yeni bir kareden önce birden fazla simülasyon güncellemesinin olabileceği durumlar vardır.
anlık | asenk. |
---|---|
Anlık bir ifade gecikme olmaksızın değerlendirilir, yani değerlendirme, geçerli simülasyon güncellemesi içinde tamamlanacaktır. | Asenk. bir ifadenin değerlendirilmesinin zaman alması olasılığı vardır ama bu zorunda değildir. Asenk. bir ifade, geçerli veya daha sonraki bir simülasyon güncellemesinde tamamlanabilir veya tamamlanmayabilir. |
Asenk. Bağlamlar
Asenk. ifadeler, bir asenk. bağlamı olan herhangi bir Verse kodunda kullanılabilir.
Bir asenk. bağlam, suspends efekti belirleyicisine sahip bir fonksiyonun gövdesidir. suspends
efekti, asenk. fonksiyonların askıya alınabileceğini ve bu simülasyonlar tamamlanmadan önce birkaç simülasyon güncellemesi boyunca çeşitli noktalarda kontrolü diğer eşzamanlı ifadelere işbirlikçi bir şekilde aktarabileceğini belirtir.
Bir Verse cihazındaki OnBegin()
fonksiyonu, asenk. kod için başlangıç noktası olarak kullanılan yaygın bir asenk. fonksiyondur.
Bir asenk. fonksiyonu çağırmak, anlık bir fonksiyonu çağırmakla aynı sözdizimine sahiptir:
OnBegin<override>()<suspends> : void =
HideAllPlatforms()
HideAllPlatforms()<suspends> : void =
for (Platform : Platforms):
Platform.Hide()
Sleep(Delay)
Bir asenk. ifadenin, diğer tüm ifadeler gibi bir sonucu olabilir. Bir asenk. ifadenin sonucu yalnızca tamamlandığında kullanılabilir.
# 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}")
Bir asenk. bağlam içindeki herhangi bir kod bloku (bir asenk. fonksiyonun gövdesi içinde), anlık ve asenk. ifadelerin herhangi bir karışımını içerebilir.
Bir kod blokundaki ifadelerin herhangi biri asenk. ise tüm kod bloku asenk. olarak kabul edilir.
Bir kod blokundaki ifadelerin hepsi anlık ise tüm kod bloku anlık olarak kabul edilir.
Aşağıdaki örnekte verilen tüm ifadeler asenk. ifadelerdir, dolayısıyla genel kod bloku asenk.tir:
Sleep(2.0) # waits 2 seconds
Boss.TauntEmote() # waits until TauntEmote() completes
Player.MoveToNearestNPC() # waits until MoveToNearestNPC() completes
Aşağıdaki örnekte verilen tüm ifadeler anlık ifadelerdir, bu nedenle genel kod bloku anlıktır:
Print("Reset after explosion")
Platform.Show()
set SecondsUntilExplosion = 12.0
Aşağıdaki örnekte verilen ifadeler asenk.. ve anlık ifadelerin bir karışımıdır, bu nedenle genel kod bloku asenk.tir:
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
Anlık ifadeler kendiliğinden birbirine eklenir. Tüm bitişik anlık (asenk. olmayan) ifadeler atomik olarak kabul edilir; bunların kodlarının, aynı güncelleme içinde kesinti olmadan ve geçici durdurma veya bağlam geçişi olmadan çalışması garanti edilir. Bu şekildeki kod, etrafına otomatik bir karşılıklı dışlama primitifi sarılmış gibi davranır.
Yukarıdaki kod örneğinde şu anlık ifadeler atomik olarak ele alınır:
# 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
Diğer tüm kod blokları gibi, bir asenk. kod blokundaki son ifade sonuç olarak kullanılır.
Eşzamanlılık İfadeleri
Verse, ifadelerin eşzamanlı (aynı anda) olarak mı yoksa sırayla, birbiri ardına mı yürütüldüğünü belirlemek için eşzamanlılık ifadeleri kullanır. Bir asenk. ifade zaman içinde yürütülür veya çağrılır, bu nedenle bu eşzamanlılık ifadeleri özellikle asenk. ifadeler kullanırken faydalı olabilir.
Yapılandırılmış Eşzamanlılık
Bir asenk. ifade, yürütmesi uzun sürerse diğer ifadelerin yürütülmesini engeller. Örneğin, Sleep(90.0)
ifadesini kullanmak, programın 90 saniye beklemesine neden olarak bir sonraki ifadeyi Sleep(90.0)
tamamen yürütülene kadar engeller.
Yapılandırılmış eşzamanlılık ifadeleri, asenk. mantıksal zaman akışını belirtmek ve asenk. ifadelerin engelleyici niteliğini, belirli bir asenk. bağlam kapsamına (bir asenk. fonksiyon gövdesi gibi) mantıksal olarak kısıtlanmış bir yaşam süresiyle değiştirmek için kullanılır.
Bu, ilişkili kapsamlarıyla kısıtlanan block
, if
, for
ve loop
gibi yapılandırılmış akış denetimine benzer.
Verse asenk. ifadeleri, diğer dillerdeki asenk. uygulamalarında kullanılan yield
ve await
primitiflerini kullanmaz. Aynı mekanizmalar, Verse eşzamanlılık ifadeleri ve dahili mekanizmalar kullanılarak yerine getirilir.
Yapılandırılmış eşzamanlılık hakkında daha fazla bilgi edinmek için Sync, Race, Rush ve Branch sayfalarına bakabilirsin.
Yapılandırılmamış Eşzamanlılık
Yalnızca tek bir yapılandırılmamış eşzamanlılık ifadesi vardır: spawn. Bu ifade, belirli bir asenk. bağlam kapsamıyla mantıksal olarak kısıtlanmış olmayan ve potansiyel yürütüldüğü kapsamın ötesine olarak yayılabilecek bir yaşam süresine sahiptir.
Yapılandırılmamış eşzamanlılık bir acil durum çıkışı gibidir; bunu düzenli olarak kullanmamalısın ama bazen en iyi ve tek seçeneğin olabilir.
Yapılandırılmış eşzamanlılık ifadeleri (sync,
race,
rush
ve branch
) mümkün olduğu her durumda yapılandırılmamış eşzamanlılık (spawn
) ifadelerinden önce kullanılmalıdır.
Yapılandırılmamış eşzamanlılık hakkında daha fazla bilgi için bkz. Spawn.
Şu Anda Yürütülen Asenk. İfadeleri Takip Etme Görevleri
Bir asenk. ifade, kendisiyle ilişkilendirilmiş bir göreve sahiptir.
Görev, yürütmeye başlanan ancak başka bir görevin tamamlanmasına izin vermek üzere askıya alınan bir asenk. fonksiyonu temsil eden bir objedir.
Görev, bir asenk. ifadenin durumunu kontrol etmek ve istenirse asenk. ifadeyi iptal etmek için kullanılabilir.
Görevler hakkında daha fazla bilgi için bkz. Görev.