Unity.Physics is way too slow... with Cast Others Do I miss Something?

Routine > Check if player is near enemy (CalcalateDistance)

Check if enemy can see player (Raycast)

i used ComponentSystem, not Job. Because cannot use PhysicsWorld in job.
Result : 0.8fps with 300 Entities.
Is my code wrong? Or Unity.physics is slow?

using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Transforms;
using Unity.Physics;
using Unity.Physics.Extensions;
using Unity.Physics.Systems;
using Unity.Physics.Authoring;
using System;


public class FollowNearSystem : ComponentSystem
{
    public EntityQuery m_Follower;
    EntityCommandBufferSystem m_ECB;
    public PointDistanceInput pointDistanceInput;
    public RaycastInput raycastInput;
    public BuildPhysicsWorld phyWorld;
    EntityManager em;
    public NativeList<DistanceHit> DistanceHits;
    public ComponentDataFromEntity<Tag> tag;
    protected override void OnCreateManager()
    {

        m_ECB = World.GetOrCreateSystem<EntityCommandBufferSystem>();
        em = World.EntityManager;
        m_Follower = GetEntityQuery(
           typeof(FollowNear)
       );
        phyWorld = World.Active.GetOrCreateSystem<BuildPhysicsWorld>();
        DistanceHits = new NativeList<DistanceHit>(Allocator.Persistent);

    }
    unsafe protected override void OnUpdate()
    {
        DistanceHits.Clear();
        Entities.ForEach((Entity entity,
                     ref FollowNear followNear,
                     ref CircleCollision collision,
                     ref Translation translation,
                     ref Rotation rotation                  
                     )
                     =>
      {
          pointDistanceInput = new PointDistanceInput
          {
              Position = translation.Value,
              MaxDistance = 10,
              Filter = GameSettings._instance.filter((1 << 1), 1 << 0, 0)
          };
          bool isTargetInDistance = phyWorld.PhysicsWorld.CalculateDistance(pointDistanceInput, out DistanceHit distHit);  

          raycastInput = new RaycastInput
          {
              Ray = new Ray(translation.Value, -distHit.SurfaceNormal),

              Filter = GameSettings._instance.filter(GameSettings._instance.layer_enemy,
                                                     GameSettings._instance.layer_player | GameSettings._instance.layer_structure,
                                                     0)
          };
          bool isTargetInSight = phyWorld.PhysicsWorld.CastRay(raycastInput, out RaycastHit sightHit);
          Entity e_sight = phyWorld.PhysicsWorld.Bodies[sightHit.RigidBodyIndex].Entity;

      bool isPlayer =
          phyWorld.PhysicsWorld.GetCollisionFilter(sightHit.RigidBodyIndex).MaskBits == GameSettings._instance.layer_player ? true : false;

          if (isTargetInDistance)
          {
              DistanceHits.Add(distHit);

              if (isPlayer)
              {
                  Entity e_dist = phyWorld.PhysicsWorld.Bodies[distHit.RigidBodyIndex].Entity;
                  translation = new Translation { Value = translation.Value - (distHit.SurfaceNormal * 0.5f * UnityEngine.Time.deltaTime) };               

              }
          }

      });
    }
    protected override void OnDestroy()
    {

        if (DistanceHits.IsCreated)
        {
            DistanceHits.Dispose();
        }
    }

}

You can pass CollisionWorld to the job and use it instead of the PhysicsWorld

var handle = new Job() {
   CollisionWorld = phyWorld.PhysicsWorld.CollisionWorld,
}

and use CollisionWorld.CalculateDistance, CollisionWorld.CastRay and so on.

First, it worked thx.
But only 8fps in parallel job.
Do you have any idea of distance detection with unity.physics?
Should i make my own DistanceCheck?

Don’t measure the performance in fps, use ms. FPS doesn’t really give any meaningful info as it’s result depends on so many unrelated systems. Profiler is the right way to examine how well your specific code runs.

I also checked ms too.
I think i expect too much about ecs physics.
after all, i change the logic to checking distance by player.

Why do you think PhysicsWorld can not be used in a job, did you actually mean BuildPhysicsWorld? Take a look at UnityPhysicsExamples/Assets/Demos/Use Cases/CharacterController/Scripts/CharacterControllerComponent.cs if you scroll down to CharacterControllerSystem the very first job CharacterControllerJob : IJobChunk you can clearly see PhysicsWorld being used in the job. Since your doing a RayCast you should look at RayBlasterSystem.cs in the UnityPhysicsExamples project.

Yeah, you are right. The problem was not PhysicsWorld. I should to get PhysicsWorld in OnUpdate. Not OnCreateManager. thx.
But Rayblaster is for Raytracing, i think. So I read QueryTester.