Quando usar mensagens - AWS SimSpace Weaver

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Quando usar mensagens

O envio de mensagens SimSpace Weaver oferece outro padrão para a troca de informações entre aplicativos de simulação. As assinaturas fornecem um mecanismo de pull para ler dados de aplicativos ou áreas específicas da simulação; as mensagens fornecem um mecanismo push para enviar dados para aplicativos ou áreas específicas da simulação.

Abaixo estão dois casos de uso em que é mais útil enviar dados usando mensagens em vez de extrair ou ler dados por meio de uma assinatura.

exemplo 1: Enviar um comando para outro aplicativo para alterar a posição de uma entidade
// Message struct definition struct MessageMoveEntity { uint64_t entityId; std::array<float, 3> destinationPos; }; // Create the message MessageMoveEntity message {45, {236.67, 826.22, 0.0} }; // Create the payload out of the struct const Api::MessagePayload& payload = Api::Utils::CreateMessagePayload( reinterpret_cast<const std::uint8_t*>(&message), sizeof(MessageTickAndId) ); // Grab the MessageEndpoint of the recipient app. Api::MessageEndpoint destination = ... // One way is to resolve it from the domain name and position WEAVERRUNTIME_TRY( Api::MessageEndpoint destination, Api::Utils::MessageEndpointResolver::ResolveFromPosition( txn, "MySpatialSimulation", Api::Vector2F32 {200.0, 100.0} ) ); // Then send the message Api::SendMessage(txn, payload, destination);

No lado receptor, o aplicativo atualiza a posição da entidade e a grava no State Fabric.

Result<void> ReceiveMessages(Txn& txn) noexcept { WEAVERRUNTIME_TRY(auto messages, Api::ReceiveMessages(txn)); for (Api::Message& message : messages.messages) { std::cout << "Received message: " << message << std::endl; // Deserialize payload to the message struct const MessageMoveEntity& receivedMessage = Api::Utils::ExtractMessage<MessageMoveEntity>(message); ProcessMessage(txn, receivedMessage); } return Aws::WeaverRuntime::Success(); } void ProcessMessage(Txn& txn, const MessageMoveEntity& receivedMessage) { // Get the entity corresponding to the entityId Entity entity = EntityFromEntityId (receivedMessage.entityId); // Update the position and write to StateFabric WEAVERRUNTIME_TRY(Api::StoreEntityIndexKey( txn, entity, k_vector3f32TypeId, // type id of the entity reinterpret_cast<std::int8_t*>(&receivedMessage.destinationPos), sizeof(receivedMessage.destinationPos))); }
exemplo 2: Enviando uma mensagem de criação de entidade para um aplicativo espacial
struct WeaverMessage { const Aws::WeaverRuntime::Api::TypeId messageTypeId; }; const Aws::WeaverRuntime::Api::TypeId k_createEntityMessageTypeId = { 1 }; struct CreateEntityMessage : WeaverMessage { const Vector3 position; const Aws::WeaverRuntime::Api::TypeId typeId; }; CreateEntityMessage messageData { k_createEntityMessageTypeId, Vector3{ position.GetX(), position.GetY(), position.GetZ() }, Api::TypeId { 0 } } WEAVERRUNTIME_TRY(Api::MessageEndpoint destination, Api::Utils::MessageEndpointResolver::ResolveFromPosition( transaction, "MySpatialDomain", DemoFramework::ToVector2F32(position) )); Api::MessagePayload payload = Api::Utils::CreateMessagePayload( reinterpret_cast<const uint8_t*>(&messageData), sizeof(CreateEntityMessage)); Api::SendMessage(transaction, payload, destination);

No lado receptor, o aplicativo cria uma nova entidade no State Fabric e atualiza sua posição.

Result<void> ReceiveMessages(Txn& txn) noexcept { WEAVERRUNTIME_TRY(auto messageList, Api::ReceiveMessages(transaction)); WEAVERRUNTIME_TRY(auto tick, Api::CurrentTick(transaction)); for (auto& message : messageList.messages) { // cast to base WeaverMessage type to determine MessageTypeId WeaverMessage weaverMessageBase = Api::Utils::ExtractMessage<WeaverMessage>(message); if (weaverMessageBase.messageTypeId == k_createEntityMessageTypeId) { CreateEntityMessage createEntityMessageData = Api::Utils::ExtractMessage<CreateEntityMessage>(message); CreateActorFromMessage(transaction, createEntityMessageData)); } else if (weaverMessageBase.messageTypeId == k_tickAndIdMessageTypeId) { ... } } } void ProcessMessage(Txn& txn, const CreateEntityMessage& receivedMessage) { // Create entity WEAVERRUNTIME_TRY( Api::Entity entity, Api::CreateEntity(transaction, receivedMessage.typeId) ); // Update the position and write to StateFabric WEAVERRUNTIME_TRY(Api::StoreEntityIndexKey( transaction, entity, receivedMessage.typeId, reinterpret_cast<std::int8_t*>(&receivedMessage.position), sizeof(receivedMessage.position))); }