Unity și .NET, ce urmează?

Suportul .NET Standard 2.1 în Unity 2021 LTS ne permite să începem să modernizăm runtime-ul Unity în mai multe moduri. În prezent lucrăm la două îmbunătățiri.

Îmbunătățirea modelului de programare async/wait . Async/wait este o abordare fundamentală de programare pentru scrierea codului de joc care trebuie să aștepte finalizarea unei operațiuni asincrone fără a bloca bucla principală a motorului.

În 2011, înainte ca async/wait să fie obișnuit în .NET, Unity a introdus operații asincrone cu coroutine bazate pe iterator, dar această abordare este incompatibilă cu async/wait și poate fi mai puțin eficientă. Între timp, .NET Standard 2.1 a îmbunătățit suportul pentru async/wait în C# și .NET odată cu introducerea unei gestionări mai eficiente a operațiunilor asincrone/wait prin ValueTask și permițând propriul sistem asemănător sarcinii prin AsyncMethodBuilder.

Acum putem profita de aceste îmbunătățiri, așa că lucrăm la activarea utilizării asincrone/așteptării cu operațiunile asincrone existente în Unity (cum ar fi așteptarea următorului cadru sau așteptarea finalizării UnityWebRequest). În primul pas, îmbunătățim suportul pentru anularea sarcinilor asincrone în așteptare atunci când un MonoBehavior este distrus sau când ieșim din modul Play utilizând jetoane de anulare . De asemenea, am lucrat îndeaproape cu cei mai mari contributori ai comunității, cum ar fi autorul UniTask , pentru a ne asigura că vor putea folosi aceste noi funcționalități.

Reducerea alocărilor de memorie și a copiilor prin utilizarea Span. Deoarece Unity este un motor C++ cu un strat de scripting C#, există multe schimburi de date între cei doi. Acest lucru poate fi ineficient, deoarece adesea necesită fie copierea datelor înainte și înapoi, fie alocarea de noi obiecte gestionate.

Span a fost introdus în C# 7.2 pentru a îmbunătăți astfel de scenarii și este disponibil implicit în .NET Standard 2.1. În ultimii ani, este posibil să fi auzit sau citit despre multe îmbunătățiri semnificative ale performanței aduse .NET Runtime datorită Span (consultați detaliile îmbunătățirilor în .NET Core 2.1 , .NET Core 3.0 , .NET 6 , .NET 6 ) . Dorim să profităm de utilizarea sa în Unity, deoarece aceasta va ajuta la reducerea alocărilor și, în consecință, Garbage Collection se întrerupe, îmbunătățind în același timp performanța generală a multor API-uri.