Scheduling and dependency issues in dots.
Hey, guys I finally got the distance check to work but my fps is really low (40 fps) for only 500 entities. I have to call JobHandle.Complete() on the job that does the check. If I don't call complete there is a dependency issue with other physics jobs.
using Unity.Physics;
using Unity.Physics.Systems;
using Unity.Transforms;
using Unity.Mathematics;
namespace Assets.Code.Scripts.Movement.Flocking.ECS.Systems.V2
{
public class NeighbourSystem : JobComponentSystem
{
private EntityQuery query;
private BuildPhysicsWorld physicsSystem;
protected override void OnCreate()
{
this.physicsSystem = World.GetOrCreateSystem<BuildPhysicsWorld>();
this.query = GetEntityQuery(
ComponentType.ReadOnly<Translation>(),
new ComponentType(typeof(NeighbourElement)));
}
protected override JobHandle OnUpdate(JobHandle inputDependencies)
{
NeighbourJob job = new NeighbourJob
{
collisionWorld = this.physicsSystem.PhysicsWorld,
translationGroup = GetArchetypeChunkComponentType<Translation>(),
neighbourGroup = GetArchetypeChunkBufferType<NeighbourElement>(),
colliderGroup = GetArchetypeChunkComponentType<PhysicsCollider>(),
rotationGroup = GetArchetypeChunkComponentType<Rotation>(),
entityGroup = GetArchetypeChunkEntityType()
};
JobHandle handle = job.Schedule(this.query, inputDependencies);
handle.Complete();
return handle;
}
}
[BurstCompile]
public struct NeighbourJob : IJobChunk
{
public PhysicsWorld collisionWorld;
[ReadOnly] public ArchetypeChunkComponentType<Translation> translationGroup;
[ReadOnly] public ArchetypeChunkComponentType<PhysicsCollider> colliderGroup;
[ReadOnly] public ArchetypeChunkComponentType<Rotation> rotationGroup;
[ReadOnly] public ArchetypeChunkEntityType entityGroup;
public ArchetypeChunkBufferType<NeighbourElement> neighbourGroup;
public unsafe void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex)
{
NativeArray<Translation> translations = chunk.GetNativeArray(this.translationGroup);
BufferAccessor<NeighbourElement> neighbourArray = chunk.GetBufferAccessor(this.neighbourGroup);
NativeArray<PhysicsCollider> colliders = chunk.GetNativeArray(this.colliderGroup);
NativeArray<Rotation> rotations = chunk.GetNativeArray(this.rotationGroup);
NativeArray<Entity> entities = chunk.GetNativeArray(this.entityGroup);
for (int i = 0; i < chunk.Count; i++)
{
ColliderDistanceInput distanceInput = new ColliderDistanceInput
{
Collider = colliders[i].ColliderPtr,
Transform = new RigidTransform(rotations[i].Value, translations[i].Value),
MaxDistance = 0.5f
};
NativeList<DistanceHit> hits = new NativeList<DistanceHit>(Allocator.Temp);
//this.collisionWorld.CalculateDistance(distanceInput,ref hits);
neighbourArray[i].Clear();
for (int j = 0; j < hits.Length; j++)
{
Entity hitEntity = hits[j].Entity;
if(entities[i] == hitEntity)
continue;
neighbourArray[i].Add(new NeighbourElement {neighbour = hits[j].Entity});
}
hits.Dispose();
}
}
}
}
without handle.Complete() the error is:
InvalidOperationException: The previously scheduled job NeighbourJob writes to the Unity.Collections.NativeArray`1[Unity.Physics.BoundingVolumeHierarchy+Node] NeighbourJob.JobData.collisionWorld.CollisionWorld.Broadphase.m_StaticTree.Nodes. You must call JobHandle.Complete() on the job NeighbourJob, before you can read from the Unity.Collections.NativeArray`1[Unity.Physics.BoundingVolumeHierarchy+Node] safely.
Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckReadAndThrowNoEarlyOut (Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle handle) (at <b53f6837a4614744b595be69da4cbb29>:0)
Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle.CheckReadAndThrow (Unity.Collections.LowLevel.Unsafe.AtomicSafetyHandle handle) (at <b53f6837a4614744b595be69da4cbb29>:0)
Unity.Collections.LowLevel.Unsafe.NativeArrayUnsafeUtility.GetUnsafeReadOnlyPtr[T] (Unity.Collections.NativeArray`1[T] nativeArray) (at <b53f6837a4614744b595be69da4cbb29>:0)
Unity.Physics.BoundingVolumeHierarchy..ctor (Unity.Collections.NativeArray`1[T] nodes, Unity.Collections.NativeArray`1[T] nodeFilters) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/Geometry/BoundingVolumeHierarchy.cs:26)
Unity.Physics.Broadphase+Tree.get_BoundingVolumeHierarchy () (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/World/Broadphase.cs:359)
Unity.Physics.Broadphase.ScheduleStaticTreeBuildJobs (Unity.Physics.PhysicsWorld& world, System.Int32 numThreadsHint, Unity.Collections.NativeArray`1[T] shouldDoWork, Unity.Jobs.JobHandle inputDeps) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/World/Broadphase.cs:197)
Unity.Physics.Broadphase.ScheduleBuildJobs (Unity.Physics.PhysicsWorld& world, System.Single timeStep, Unity.Mathematics.float3 gravity, Unity.Collections.NativeArray`1[T] buildStaticTree, Unity.Jobs.JobHandle inputDeps, System.Int32 threadCountHint) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/World/Broadphase.cs:157)
Unity.Physics.CollisionWorld.ScheduleBuildBroadphaseJobs (Unity.Physics.PhysicsWorld& world, System.Single timeStep, Unity.Mathematics.float3 gravity, Unity.Collections.NativeArray`1[T] buildStaticTree, Unity.Jobs.JobHandle inputDeps, System.Int32 threadCountHint) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/Collision/World/CollisionWorld.cs:82)
Unity.Physics.Systems.BuildPhysicsWorld.OnUpdate (Unity.Jobs.JobHandle inputDeps) (at Library/PackageCache/com.unity.physics@0.3.2-preview/Unity.Physics/ECS/Systems/BuildPhysicsWorld.cs:241)
Unity.Entities.JobComponentSystem.Update () (at Library/PackageCache/com.unity.entities@0.11.0-preview.7/Unity.Entities/JobComponentSystem.cs:141)
Unity.Entities.ComponentSystemGroup.UpdateAllSystems () (at Library/PackageCache/com.unity.entities@0.11.0-preview.7/Unity.Entities/ComponentSystemGroup.cs:445)
UnityEngine.Debug:LogException(Exception)
Unity.Debug:LogException(Exception) (at Library/PackageCache/com.unity.entities@0.11.0-preview.7/Unity.Entities/Stubs/Unity/Debug.cs:19)
Unity.Entities.ComponentSystemGroup:UpdateAllSystems() (at Library/PackageCache/com.unity.entities@0.11.0-preview.7/Unity.Entities/ComponentSystemGroup.cs:450)
Unity.Entities.ComponentSystemGroup:OnUpdate() (at Library/PackageCache/com.unity.entities@0.11.0-preview.7/Unity.Entities/ComponentSystemGroup.cs:398)
Unity.Entities.ComponentSystem:Update() (at Library/PackageCache/com.unity.entities@0.11.0-preview.7/Unity.Entities/ComponentSystem.cs:109)
Unity.Entities.DummyDelegateWrapper:TriggerUpdate() (at Library/PackageCache/com.unity.entities@0.11.0-preview.7/Unity.Entities/ScriptBehaviourUpdateOrder.cs:192)
How can I schedule the job so I don't have to complete it on the main thread?
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612235608im_/https://answers.unity.com/themes/thub/images/avi.jpg)