protected override void OnUpdate() { // Send update at SendRateHz. timeSinceLastSend += Time.deltaTime; if (timeSinceLastSend < 1.0f / SendRateHz) { return; } timeSinceLastSend = 0.0f; for (var i = 0; i < positionData.Length; i++) { var component = positionData.Position[i]; if (component.DirtyBit != true) { continue; } var entityId = positionData.SpatialEntityIds[i].EntityId; var update = new SchemaComponentUpdate(component.ComponentId); Generated.Improbable.SpatialOSPosition.Serialization.Serialize(component, update.GetFields()); worker.Connection.SendComponentUpdate(entityId, new ComponentUpdate(update)); component.DirtyBit = false; positionData.Position[i] = component; } }
protected override void OnUpdate() { // Send update at SendRateHz. timeSinceLastSend += Time.deltaTime; if (timeSinceLastSend < 1.0f / SendRateHz) { return; } timeSinceLastSend = 0.0f; for (var i = 0; i < transformData.Length; i++) { var component = transformData.Transforms[i]; if (component.DirtyBit != true) { continue; } var entityId = transformData.SpatialEntityIds[i].EntityId; var update = new SchemaComponentUpdate(component.ComponentId); Transform.Serialization.Serialize(component, update.GetFields()); WorkerSystem.Connection.SendComponentUpdate(entityId, new ComponentUpdate(update)); component.DirtyBit = false; transformData.Transforms[i] = component; } }
public void SendComponentUpdate(EntityId entityId, uint componentId, SchemaComponentUpdate update, UpdateParameters?updateParameters = null) { lock (connectionLock) { ThrowIfNotConnected(); connection.SendComponentUpdate(entityId.Value, new ComponentUpdate(componentId, update), updateParameters); } }
protected override void OnUpdate() { for (var i = 0; i < transformData.Length; i++) { var transform = transformData.Transform[i]; if (transform.DirtyBit != true) { continue; } var lastTransformSent = transformData.LastTransformSent[i]; lastTransformSent.TimeSinceLastUpdate += Time.deltaTime; transformData.LastTransformSent[i] = lastTransformSent; if (lastTransformSent.TimeSinceLastUpdate < 1.0f / TransformSynchronizationConfig.MaxTransformUpdateRateHz) { continue; } // todo Need to be doing things with velocity and orientation too for this to work // also consider moving all this to the intermediate systems // var squareDisatnce = // TransformUtils.SquareDisatnce(lastTransformSent.Transform.Location, // transformData.Transform[i].Location); // // if (squareDisatnce == 0.0f) // { // continue; // } // // if (lastTransformSent.TimeSinceLastUpdate < // TransformSynchronizationConfig.MaxTimeForStalePositionWithoutUpdateS) // { // if (squareDisatnce < TransformSynchronizationConfig.MaxSquarePositionChangeWithoutUpdate) // { // continue; // } // } var entityId = transformData.SpatialEntityIds[i].EntityId; var update = new SchemaComponentUpdate(transform.ComponentId); TransformInternal.Serialization.SerializeUpdate(transform, update); WorkerSystem.Connection.SendComponentUpdate(entityId, new ComponentUpdate(update)); transform.DirtyBit = false; transformData.Transform[i] = transform; lastTransformSent.TimeSinceLastUpdate = 0.0f; lastTransformSent.Transform = transform; transformData.LastTransformSent[i] = lastTransformSent; } }
public static WrappedOp <ComponentUpdateOp> CreateComponentUpdateOp(long entityId, uint componentId) { var schemaComponentUpdate = new SchemaComponentUpdate(componentId); var op = new ComponentUpdateOp { Update = new ComponentUpdate(schemaComponentUpdate), EntityId = new EntityId(entityId) }; return(new WrappedOp <ComponentUpdateOp>(op)); }
protected override void OnUpdate() { for (var i = 0; i < positionData.Length; i++) { var position = positionData.Position[i]; if (position.DirtyBit != true) { continue; } var lastPositionSent = positionData.LastPositionSent[i]; lastPositionSent.TimeSinceLastUpdate += Time.deltaTime; positionData.LastPositionSent[i] = lastPositionSent; if (lastPositionSent.TimeSinceLastUpdate < 1.0f / TransformSynchronizationConfig.MaxPositionUpdateRateHz) { continue; } var squareDistance = TransformUtils.SquareDistance(lastPositionSent.Position.Coords, positionData.Position[i].Coords); if (squareDistance == 0.0f) { continue; } if (lastPositionSent.TimeSinceLastUpdate < TransformSynchronizationConfig.MaxTimeForStalePositionWithoutUpdateS) { if (squareDistance < TransformSynchronizationConfig.MaxSquarePositionChangeWithoutUpdate) { continue; } } var entityId = positionData.SpatialEntityIds[i].EntityId; var update = new SchemaComponentUpdate(position.ComponentId); Position.Serialization.SerializeUpdate(position, update); WorkerSystem.Connection.SendComponentUpdate(entityId, new ComponentUpdate(update)); position.DirtyBit = false; positionData.Position[i] = position; lastPositionSent.TimeSinceLastUpdate = 0.0f; lastPositionSent.Position = position; positionData.LastPositionSent[i] = lastPositionSent; } }
protected override void OnUpdate() { dirtyComponents = new NativeQueue <SerializedMessagesToSend.UpdateToSend>(Allocator.TempJob); var dirtyComponentsWriter = dirtyComponents.AsParallelWriter(); var marker = foreachMarker; Dependency = Entities.WithName("EntityAclReplication") .WithoutBurst() .WithAll <HasAuthority>() .WithChangeFilter <Component>() .ForEach((ref Component component, in SpatialEntityId entity) => { marker.Begin(); if (!component.IsDataDirty()) { marker.End(); return; } // Serialize component var schemaUpdate = SchemaComponentUpdate.Create(); Serialization.SerializeUpdate(component, schemaUpdate); component.MarkDataClean(); // Schedule update var componentUpdate = new ComponentUpdate(ComponentId, schemaUpdate); var update = new SerializedMessagesToSend.UpdateToSend(componentUpdate, entity.EntityId.Id); dirtyComponentsWriter.Enqueue(update); marker.End(); }) .ScheduleParallel(Dependency); spatialOsSendSystem.AddReplicationJobProducer(Dependency, dirtyComponents); dirtyComponents = default; }