Aviso de fim do suporte: em 20 de maio de 2026, AWS encerrará o suporte para AWS SimSpace Weaver. Depois de 20 de maio de 2026, você não poderá mais acessar o SimSpace Weaver console ou os SimSpace Weaver recursos. Para obter mais informações, consulte AWS SimSpace Weaver Fim do suporte.
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))); }