Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Quando usare la messaggistica
La messaggistica in SimSpace Weaver offre un altro modello per lo scambio di informazioni tra applicazioni di simulazione. Gli abbonamenti forniscono un meccanismo pull per leggere i dati da applicazioni o aree specifiche della simulazione; i messaggi forniscono un meccanismo push per inviare dati ad applicazioni o aree specifiche della simulazione.
Di seguito sono riportati due casi d'uso in cui è più utile inviare dati utilizzando la messaggistica piuttosto che estrarre o leggere i dati tramite un abbonamento.
Esempio 1: Invio di un comando a un'altra app per modificare la posizione di un'entità
// 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);
Sul lato ricevente, l'app aggiorna la posizione dell'entità e la scrive nello 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))); }
Esempio 2: Invio di un messaggio di creazione dell'entità a un'app spaziale
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);
Sul lato ricevente, l'app crea una nuova entità nello State Fabric e ne aggiorna la posizione.
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))); }