Pipeline d'Inicialització
Una pipeline asíncrona i ordenada que executa les tasques d'arrencada del teu projecte Unity amb nivells de criticitat, progrés ponderat i telemetria transmesa a qualsevol pantalla de càrrega.
Per a què serveix aquest sistema
Tot projecte Unity té una seqüència d'arrencada. Els assets s'han de carregar, els serveis registrar-se, la configuració remota obtenir-se i la sessió de joc preparar-se abans que el jugador vegi el primer fotograma. Sense una estructura per a aquesta seqüència, el codi d'arrencada acaba dispers entre MonoBehaviours, cadenes d'Awake i corrutines impossibles de provar o estendre.
La Pipeline d'Inicialització de Serenity substitueix aquell codi dispers per un conjunt ordenat de tasques asíncrones. Cada tasca declara la seva criticitat i pes, la pipeline les executa en seqüència i el progrés i els errors es transmeten a un port de telemetria que qualsevol pantalla de càrrega pot consumir.
El problema a Unity
El model d'inicialització predeterminat de Unity és pla. Awake i Start es disparen en un ordre que depèn de la configuració del script execution order, fràgil i invisible. Els equips ho compensen amb managers singleton, flags estàtics o cadenes de corrutines que es trenquen davant qualsevol refactorització. No existeix cap mecanisme estàndard per expressar que un pas d'arrencada és crític i un altre opcional, ni per mostrar una barra de progrés que reflecteixi amb precisió el treball de boot que queda.
A mesura que el projecte creix, la seqüència d'arrencada acumula dependències silencioses. Un servei assumeix que un altre ja està inicialitzat. Una petició remota falla silenciosament i deixa la sessió en un estat parcial. Una pantalla de càrrega mostra un spinner bloquejat perquè ningú no va connectar els esdeveniments de progrés. Aquests problemes només es manifesten en temps d'execució i només en condicions concretes de dispositiu o xarxa.
Com ho aborda Serenity
Serenity modela cada pas d'arrencada com un ITask amb un ID únic, un nivell de TaskCriticality i un float Weight. TaskCriticality té tres valors: Critical, Required i Degradable. Les tasques Critical avorten la pipeline si fallen. Les Degradable registren l'error i permeten que la pipeline continuï. La pipeline es defineix a través d'IInitializationPipelineProfileDefinition, que exposa una llista de només lectura d'instàncies ITaskDefinition que construeixen un ITask concret en temps d'execució mitjançant un TaskBuildContext.
L'InitializationPipelineService rep un conjunt ordenat d'instàncies ITask, un ISkipPolicy, un port IInitializationPipelineTelemetry i un ILogService. Construeix un pla de registres InitializationPipelineStep i els executa seqüencialment mitjançant RunAsync, cridant el port de telemetria a cada pas perquè les pantalles de càrrega rebin els esdeveniments OnStarted, OnProgress, OnTaskCompleted, OnTaskFailed i OnCompleted sense cap acoblament amb els interns de la pipeline.
Com encaixa a Serenity
La Pipeline d'Inicialització viu al namespace Serenity.InitializationPipeline i segueix l'estructura per capes de Domini, Aplicació i Instal·lació de la foundation. La capa de Domini defineix InitializationPipelineStep. La capa d'Aplicació exposa IInitializationPipelineProfileDefinition, IInitializationPipelineTelemetry, ISkipPolicy i InitializationPipelineService. La capa d'Instal·lació proveeix InitializationPipelineInstaller i el seu DTO d'entrada, que transporta els proveïdors de tasques, la política d'omissió, la implementació de telemetria i el servei de log.
Les tasques es creen com a definicions basades en ScriptableObject usant l'agregat Task del namespace Serenity.Tasking. ITaskDefinition, ITaskFactory i TaskBuildContext gestionen el límit de creació. La implementació ReflectionCallTask permet apuntar una tasca a qualsevol mètode del codi font per nom de tipus i mètode sense escriure una classe ITask dedicada. La pipeline coopera amb l'AssetPrefetcher i el flux de treball d'Addressables per escalfar assets a l'arrencada, amb Game Session per preparar la sessió i amb l'Event Dispatcher per publicar senyals d'inici.
Flux de treball pràctic
- Crea un ScriptableObject UnityInitializationPipelineProfile i afegeix les definicions de tasca en l'ordre d'execució desitjat.
- Assigna a cada definició de tasca un nivell de TaskCriticality i un float Weight que reflecteixi la seva part del temps d'arrencada.
- Implementa IInitializationPipelineTelemetry a la teva pantalla de càrrega per rebre esdeveniments de progrés i error.
- Opcionalment implementa ISkipPolicy per permetre que tasques no crítiques s'ometin segons les condicions en temps d'execució.
- Registra la pipeline a través de UnityInitializationPipelineInstaller, passant els proveïdors, la política d'omissió i la implementació de telemetria.
- Crida RunAsync a InitializationPipelineService a l'arrencada i espera el resultat booleà per saber si totes les tasques crítiques han tingut èxit.
Què inclou
- Primitiva ITask amb ID, TaskCriticality, Weight, RunAsync i LastError
- Tres nivells de criticitat: Critical, Required i Degradable
- Seguiment del progrés ponderat a través de registres InitializationPipelineStep
- Port IInitializationPipelineTelemetry amb OnStarted, OnProgress, OnTaskCompleted, OnTaskFailed i OnCompleted
- ISkipPolicy intercanviable per ometre tasques en temps d'execució sense modificar el perfil
- IInitializationPipelineProfileDefinition i autoria mitjançant ScriptableObject amb UnityInitializationPipelineProfile
- ReflectionCallTask per al despatx de mètodes sense codi addicional i sense necessitat d'una classe ITask dedicada
- UnityInitializationPipelineInstaller integrat al patró d'instal·ladors de la foundation
Quan fer-lo servir
- Projectes que necessiten una seqüència d'arrencada fiable i ordenada abans de carregar la primera escena de gameplay.
- Jocs amb pantalla de càrrega que ha de reflectir el progrés real a través de tasques d'inici heterogènies.
- Projectes on alguns passos d'arrencada són opcionals o omissibles segons feature flags o capacitats del dispositiu.
- Bases de codi que volen que els passos d'inici es creïn des de l'inspector de Unity sense escriure noves classes de C# per a cadascun.
Sistemes relacionats
Utilitza Serenity quan vulguis una seqüència d'arrencada inspeccionable, testejable i capaç d'alimentar qualsevol pantalla de càrrega, sense dispersar la lògica d'inicialització entre cadenes d'Awake i managers singleton.
English
Español
Català