Lumberyard
Guía del usuario (Version 1.21)

Uso de GridMate para mundos a gran escala

GridMate es el sistema de redes de Lumberyard. Interest Manager es la solución de Lumberyard para mundos conectados a gran escala.

Relación entre el administrador de réplicas e Interest Manager

Interest Manager es una característica opcional que controla el envío de réplicas en aplicaciones de juego de red a gran escala. Administrador de réplicas funciona sin Interest Manager. Sin embargo, el administrador de réplicas envía réplicas a todos los homólogos. Por lo tanto, todas las entidades con el componente Network Binding en ellas aparecen en todos los homólogos. Cuando se crea e inicializa, Interest Manager indica al administrador de réplicas que deje de emitir todas las réplicas a todos los homólogos. Interest Manager ejerce como supervisor del administrador de réplicas, y coordina las réplicas y los homólogos.


        Administrador de réplicas e Interest Manager

Interest Manager

La emisión de todas las réplicas a todos los homólogos no es viable en los mundos en red a gran escala. Con estas aplicaciones, puede utilizar Interest Manager para controlar qué réplicas se emiten a qué homólogos y en qué condiciones. En el siguiente diagrama se muestra la relación entre Interest Manager, los clientes y las réplicas.


        Interest Manager, clientes y réplicas

En este marco, las réplicas tienen atributos. Cada homólogo puede tener reglas para definir las condiciones que deben cumplir los atributos para emparejarse, y que se envían o se eliminan de dicho homólogo. El servidor o el homólogo autorizado puede tener varios controladores de reglas para emparejar las reglas con los atributos. Interest Manager hace el trabajo de emparejar y fusionar resultados, así como de enviar o eliminar las réplicas de los homólogos correspondientes.

Supongamos que desea crear un sistema espacial que replique los objetos en función de dónde se encuentra el homólogo cliente dentro del mundo. Un atributo sería un volumen geométrico que representa la ubicación y los límites de la réplica. Una regla definiría un volumen geométrico que el cliente considera en sus proximidades de interés. Un controlador de reglas podría establecer coincidencias espaciales inteligentes entre estos objetos espaciales.

En un nivel bajo, GridMate utiliza las siguientes construcciones para implementar los atributos, las reglas y los controladores:

GridMate::ProximityInterestAttribute GridMate::ProximityInterestRule GridMate::ProximityInterestHandler

La Ejemplo de multijugador que se incluye con Lumberyard contiene una aplicación práctica de todo ello. Para obtener información detallada sobre atributos, reglas y controladores de reglas, consulte Escritura de sus propios atributos, reglas y controladores de reglas de Interest Manager en C++.

El almacenamiento en caché de sectores y administración del ciclo de vida de entidades

NetBindingSystem almacena en caché sectores para Interest Manager. Las instancias de sectores se almacenan en caché y se vuelven a utilizar desde la misma instancia de sector. Cada vez que una réplica se activa, se realiza una búsqueda en la memoria caché para ver si un sector que contiene la entidad ya está en la memoria caché. Si la búsqueda tiene éxito, la entidad se vuelve a utilizar.

Cuando una entidad de juego ya no es necesaria (es decir se llama a UnBindGameEntity), NetBindingSystem decide si desactiva la entidad o la destruye. Si la entidad está en la memoria caché, NetBindingSystem desactiva la entidad. Si la entidad no está en la memoria caché, NetBindingSystem destruye la entidad.

Implementación de la muestra Multiplayer

La muestra Multiplayer presenta cómo filtrar basándose en el interés de las entidades de red en su aplicación.

Dado que el objetivo es controlar las entidades, Interest Manager debe trabajar con entidades y componentes. La muestra Multiplayer utiliza los siguientes componentes para lograrlo:

  • Interest Manager

  • Game Player Net Interest

  • Proximity Net Interest

Aunque la muestra no abarca todo, sí proporciona un punto de partida para comprender la tecnología e implementar un sistema que se adapte a sus necesidades.

Componente Interest Manager

El AzFramework::InterestManagerComponent de Lumberyard está pensado para usarse como un componente del sistema en una aplicación.

El componente Interest Manager inicializa Interest Manager y los siguientes controladores de reglas integrados:

  • Controlador de regla de proximidad (GridMate::ProximityInterestHandler): utilice el controlador de reglas de proximidad para especificar, en función de su proximidad espacial, qué entidades aparecerán en cada uno de los homólogos. El controlador de reglas utiliza cuadros de límite alineados en ejes.

  • Controlador de reglas de máscaras de bits (GridMate::BitmaskInterestHandler): use el controlador de reglas de máscaras de bits para filtrar réplicas en función de su valor de máscara de bits. Esto es útil para las entidades cuya presencia se determina según un agrupamiento personalizado.

Para registrar InterestManagerComponent como un componente del sistema, anule AZ:: Module:: GetRequiredSystemComponents(). Como componente del sistema, InterestManagerComponent se inicializa antes que cualquier otra entidad y componente ajeno al sistema. Para obtener más información, consulte Componentes del sistema.

Como referencia, vea el código siguiente. El archivo de origen es \dev\MultiplayerSample\Gem\Code\Source\MultiplayerSampleModule.cpp.

class MultiplayerSample : public CryHooksModule { public: MultiplayerSample() : CryHooksModule() { ... // System Components RegisterSystemComponent<AzFramework::InterestManagerComponent>(); // enabling interest management ... } template<class T> void RegisterSystemComponent() { m_descriptors.push_back(T::CreateDescriptor()); m_systemComponents.push_back(azrtti_typeid<T>()); } /** * Add required SystemComponents to the SystemEntity. */ AZ::ComponentTypeList GetRequiredSystemComponents() const { return m_systemComponents; // this is how Lumberyard will get your system components and attach them on your behalf } ... AZ::ComponentTypeList m_systemComponents; };

Game Player Net Interest

La regla de interés neto del jugador en el juego (MultiplayerSample::GamePlayerNetInterest) define las entidades en las que el jugador está interesado y contiene GridMate::ProximityInterestRule. La variable de consola mps_interestRadius determina el radio del interés de jugador. La muestra Multiplayer utiliza el siguiente procedimiento para crear la entidad de los jugadores. Puede encontrar el código fuente en el archivo dev\MultiplayerSample\Gem\Code\Source\Components\Spawn\PlayerSpawnComponent.cpp.

void PlayerSpawnComponent::SpawnPlayerEntity() { if (m_playerEntity == nullptr) { m_playerEntity = aznew AZ::Entity("Game Player"); if (m_playerEntity) { m_playerEntity->CreateComponent<GamePlayerComponent>(); m_playerEntity->CreateComponent<GamePlayerNetInterest>(); m_playerEntity->CreateComponent<AzFramework::NetBindingComponent>(); m_playerEntity->Init(); m_playerEntity->Activate(); AZ::EntityBus::MultiHandler::BusConnect(m_playerEntity->GetId()); } ... } }

La regla se crea en GamePlayerNetInterest::BindTargetEntity() y se le llama cuando la réplica de esta entidad está vinculada. La ubicación del código fuente es \dev\MultiplayerSample\Gem\Code\Source\Components\Networking\GamePlayerNetInterest.cpp.

void GamePlayerNetInterest::BindTargetEntity(const AZ::EntityId& entityId) { ... PeerId peerId = InvalidReplicaPeerId; EBUS_EVENT_ID_RESULT(peerId, GetEntityId(), GamePlayerInterfaceBus, GetPeerId); // Find our own peer ID. ProximityInterestHandler* proximityInterest = nullptr; EBUS_EVENT_RESULT(proximityInterest, AzFramework::InterestManagerRequestsBus, GetProximityInterest); if (proximityInterest) { m_proximityRule = proximityInterest->CreateRule(peerId); // Finally, create the interest manager rule. } ... }

Una vez creada la regla, la información espacial se puede configurar en cualquier momento. El ejemplo de multijugador utiliza OnTick para actualizar la ubicación del jugador. GamePlayerNetInterest recupera la última transformación de la ubicación del jugador y establece la regla de proximidad local en consecuencia. El código fuente está en GamePlayerNetInterest.cpp.

void GamePlayerNetInterest::OnTick(float deltaTime, AZ::ScriptTimePoint time) { ... AZ::Transform worldTM; EBUS_EVENT_ID_RESULT(worldTM, m_targetEntityId, AZ::TransformBus, GetWorldTM); // This updates your local proximity rules that define which entities you are interested in. m_proximityRule->Set(AZ::Aabb::CreateCenterRadius(worldTM.GetPosition(), m_interestRadius)); }

Componente Proximity Net Interest

El componente Proximity Net Interest describe el atributo de la entidad a la que está asociado. El componente escucha los cambios de transformación de la entidad y actualiza su atributo interno en consecuencia. Esto permite que Interest Manager controle la presencia de la entidad en los homólogos según el interés de red del jugador de los homólogos. En Entity Inspector (Inspector de entidades), el nombre de este componente es Proximity Interest attribute.


        Atributo de interés de proximidad en el Entity Inspector

Las entidades que Interest Manager filtra llevan adjunto el componente Proximity Net Interest. Este componente escucha los cambios de transformación de TransformComponent y actualiza su atributo GridMate en consecuencia. A continuación se incluye el fragmento de código relacionado \dev\MultiplayerSample\Gem\Code\Source\Components\Networking\ProximityNetInterest.cpp.

void ProximityNetInterestComponent::OnTransformChanged(const AZ::Transform& localTM, const AZ::Transform& worldTM) { ... AZ::Aabb bbox = AZ::Aabb::CreateNull(); CollisionInfo info; EBUS_EVENT_ID_RESULT(info, GetEntityId(), CollidableBus, GetCollisionInfo); // Get our bounding box. if (info.m_shape) { bbox = info.m_shape->GetEncompassingAabb(); } m_attribute->Set(bbox); // Update GridMate::ProximityInterestAttribute value for the InterestManager. ... }