# Ejecución

El tiempo de ejecución trata [escenas](https://github.com/decentraland/docs/blob/main/contributor/contributor/content/entity-types/scenes.md) como módulos típicos de Node. Una vez que el sandbox está configurado (es decir, todos los [globals](https://github.com/decentraland/docs/blob/main/contributor/globals.md) se inyectan y [módulos](https://github.com/decentraland/docs/blob/main/contributor/modules.md) están listos para ser cargados), el código de la escena será evaluado para que pueda poblar el [objeto](https://github.com/decentraland/docs/blob/main/contributor/globals.md#module) .

El host recogerá dos métodos de `objeto`: [`onStart`](#onStart) (opcional) y [`onUpdate`](#onUpdate) (obligatorio).

```ts
type Exports = {
  onStart?: () => Promise<void>;
  onUpdate: (deltaSeconds: number) => Promise<void>;
};
```

Durante el ciclo de vida de una escena, el tiempo de ejecución se asegurará de que las llamadas a estos métodos nunca se realicen de forma concurrente. La `Promise` devuelta siempre se esperará antes de que la escena reciba una nueva llamada.

{% @mermaid/diagram content="flowchart LR
A\[onStart] -->|await| B\[onUpdate]
B -->|await| B" %}

{% hint style="info" %}
La sincronización efectiva y con buen rendimiento entre escenas individuales y el motor de renderizado del juego es un asunto complicado. Puedes encontrar lecciones de la implementación de la Foundation en [ADR-148](https://adr.decentraland.org/adr/ADR-148).
{% endhint %}

**`onStart`**

El ciclo de vida de una escena comienza con el método asíncrono `onStart` . Es el lugar para realizar inicializaciones únicas que deben completarse antes de que se haga la primera llamada a [`onUpdate`](#onUpdate) .

```ts
onStart(): Promise<void>
```

Las escenas deben usar esta llamada para solicitar cualquier estado preexistente del tiempo de ejecución (como las [entidades básicas](https://github.com/decentraland/docs/blob/main/contributor/entities.md)) y realizar su propia configuración inicial.

Exportar `onStart` se recomienda para todas las escenas (y se hace automáticamente al usar el SDK), pero no es un requisito del protocolo. El método puede estar ausente, o devolver una `Promise`.

**`onUpdate`**

Mientras una escena se está ejecutando activamente, el método asíncrono `onUpdate` será invocado periódicamente por el tiempo de ejecución para informar del paso del tiempo. Este es el corazón de la escena: en cada llamada sucesiva, las entidades pueden actualizarse, procesarse la entrada, reproducirse animaciones, enviarse mensajes, mostrarse UI, etc.

```ts
onUpdate(deltaSeconds: number): Promise<void>
```

El `deltaSeconds` el parámetro es el número fraccionario de segundos transcurridos desde la última llamada a `onUpdate` fue iniciada por el tiempo de ejecución (independientemente de cuándo la `Promise` devuelta se resolvió). Esto es específico para cada escena en ejecución.

Dado que `onUpdate` las llamadas nunca se solapan, la secuencia de `deltaSeconds` produce una línea de tiempo coherente.

En circunstancias ideales, las escenas tienen la oportunidad de ejecutarse `onUpdate` antes de que se renderice cada frame. Sin embargo, dependiendo de los recursos disponibles, las escenas que ejecutan una carga de trabajo pesada pueden no resolver su `Promise` a tiempo para el siguiente frame. Cada escena es independiente en este aspecto: implementaciones ligeras de `onUpdate` pueden ser invocadas varias veces en el mismo periodo que una única llamada que consume mucho tiempo en otra escena.

Ver [ADR-148](https://adr.decentraland.org/adr/ADR-148) para más detalles.

### Ejecución de Múltiples Escenas

El World Explorer no solo debe soportar la ejecución de varias escenas en sandbox, sino que debería hacerlo en todo momento. Hay dos razones para esto:

Primero, cuando los jugadores exploran el mundo, su vista alcanza más allá de los límites geográficos de la escena en la que están. Las escenas cercanas (hasta una distancia arbitraria o configurable) deben estar en ejecución para generar el contenido que los jugadores deberían poder ver.

Segundo, las escenas no solo se ejecutan dentro de sus propios límites no solapados. También pueden superponerse unas sobre otras, afectando el área alrededor del jugador pero proporcionando diferente funcionalidad.

Este es el caso de dos tipos de escenas en particular: la escena de avatar y las experiencias portátiles.

#### La Escena de Avatar <a href="#avatarscene" id="avatarscene"></a>

Desde el momento en que el jugador entra en el mundo, una escena global encargada de renderizar los avatares de otros jugadores comienza a ejecutarse.

Esta escena no está limitada por límites geográficos, y puede mostrar sus entidades (así como widgets de UI para comunicación) independientemente de la ubicación del jugador.

#### Experiencias Portátiles

Decentraland permite que los wearables tengan su propio comportamiento, que se ejecuta en su propio contexto de escena. Estas escenas están centradas alrededor del jugador y pueden enriquecer la experiencia añadiendo entidades o mostrando widgets de UI.

Comienzan a ejecutarse cuando el wearable está equipado y se detienen cuando se retira.
