Announcement

Collapse
No announcement yet.

Which will be the more efficent AI

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Which will be the more efficent AI

    My game has around 150 instances of an AI at a given time.

    The AI are very simple and roam around randomly and attack their target when it comes close.
    I don't want to store the player character in a variable and detect if the player is near the AI through a decorator.

    Instead I could use a cylinder like shape and detect the player through on-overlap delegates to detect when the player is in range. I assume the AI perception component does exactly the same. But as I AI is relatively simple, I didn't want to use the AI perception component.

    So I wanted to know which of the 3 will be more efficient to work with.

    1. Checked the distance between AI and player through a service.
    2. Using overlap through the overlap of a shape.
    3. Using AI perception component.

    #2
    Originally posted by envenger View Post
    I don't want to store the player character in a variable and detect if the player is near the AI through a decorator.
    Why not? Always go with the most obvious and straightforward solution until you have a particular reason for needing to change it. Or are you saying that this doesn't seem like the simplest method to you? To me it is.

    It's not clear to me if you're primarily concerned with performance (which you shouldn't be) or something else. But if it is performance, a distance check is just a handful of subtractions, multiplications and additions. It's way, way simpler than a 3D overlap test, even if the latter is optimized by PhysX.

    Comment


      #3
      +1 with Kamrann

      Storing the variable is definitely the fastest way to do it. Using an overlap will be really slow since you'll be querying the scene every frame for 150+ actors, which will all query each other etc... it's not scaleable since your queries become n^2.

      Comment


        #4
        AI perception sight sense will first do a angle check, then a distance check and then a ray trace. If you want simplicity just do the service or decorator approach.

        Comment


          #5
          Originally posted by kamrann View Post
          Why not? Always go with the most obvious and straightforward solution until you have a particular reason for needing to change it. Or are you saying that this doesn't seem like the simplest method to you? To me it is.

          It's not clear to me if you're primarily concerned with performance (which you shouldn't be) or something else. But if it is performance, a distance check is just a handful of subtractions, multiplications and additions. It's way, way simpler than a 3D overlap test, even if the latter is optimized by PhysX.
          Thanks for the reply.. I was not sure how much overlap tests costed for something as simple as a hexagon.

          There will be cases where the AI might have ~20+ enemies to detect and attack.
          I thought of something that might decrease the the cost.

          Suppose the distance between between the enemy and bot is really high in the first check, it perform the next with a greater delay.

          Comment


            #6
            Yep, there are lots of tricks you could potentially use to optimize it, but from the numbers you've posted so far, doing a distance check here isn't going to be anywhere close to being a performance bottleneck. I can't stress enough that you shouldn't even think about performance issues for something like this until you actually encounter them.

            Comment


              #7
              Also, try to use Distance Squared whenever doing those Distance checks, since it's faster to 'Square' the search distance, than it is to perform a SquareRoot on the length of the Distance Vector. For example:

              Code:
              const float DistanceSqr = FVector(MyLocation - ItsLocation).SizeSquared();
              if (DistanceSqr < SearchRadius * SearchRadius)
              {
                  // Do Stuff
              }
              It's probably worth caching the SearchRadius Squared Value as well, since that makes it even faster! Means it can't be a const though, since you'll probably want to do this in PostInitializeComponents() which will then Square whatever value you set for SearchRadius:

              Code:
              SearchRadiusSqr = SearchRadius * SearchRadius;

              Comment

              Working...
              X