AI login (state,state Machine, behaviors...) and thread in RTS game

Started by
4 comments, last by gamer08 10 years, 11 months ago

I everyone i have a little question about AI logic, state and thread in game in general

first of all some usefull infos,

i'm working on a rts game

langage c#

framework XNA

each type of unit have their own states and for the moment each state of each type is a singleton

each unit have a steering behavior and a state machine

for the moment everything is on the main thread

example :

two units of the type A are on the same state

when i update the logic i pass the owner of the state machine as a parameter to the state but the logic is updated on a unit after another (yes i know it's not great, the reason why i'm here)

What is the best way to ensure that every unit update their ai logic at the same time / almost same time ?

1. i think a thread per unit ?

2. threadpool ?

If it's not clear , i can give futher explanations

Any suggestions, ideas or anything is welcome !

thanks to help

Advertisement

I'm not entirely sure if I am getting your problem, but from what I think I understand, here's something to think about:

You need to think about how a game loop works and how you handle your units. There is not really any other way than to go over each unit and update the needed variables to do what they have to do.

Multithreading will not help you in the way you expect it to help. As you're never sure when a thread is done, you will need to lock and wait for every thread to finish before continuing. On top of that, you will still need to go through an X amount of threads over and over again until all your units are updated, and as you will most likely have more units in your game than most PC can make threads, you're effectively eliminating what you're trying to fix. (but you will have better speed for you game ;))

If you are having issues with units not behaving properly, rethink your game logic for your units. It's perfectly fine to handle each unit individually. Something along the lines of the following is fine as a basic way of handling:


for(int i = 0; i < AmountOfUnits; i++)
{
   CalculatePath();
   DecideWetherToAttackOrNot();
   Attack();
   MoveUnit();
}

This is just a simple example with imaginary functions, but you should get the an idea of where I'm going.

Multi-threading is usually used as a performance optimization; it doesn't solve any of your problems here, and would only complicate things. Despite what you think, you actually want a predictable update sequence.

I don't understand why your different types of state are singletons. Instead, just make a new instance of the state data for each unit instance.

What is the best way to ensure that every unit update their ai logic at the same time / almost same time ?

You can't, not even threads can accomplish this. You still need to update the AI behavior, one unit at a time, because computers can only run one line of code at a time.

What about those RTS games, you ask? They still update their units one at a time, all within one frame (one iteration of your main loop). Once all units AI are updated, then they are presented to the screen all at once so they appear independent.

You can't, not even threads can accomplish this. You still need to update the AI behavior, one unit at a time, because computers can only run one line of code at a time.

Hmm... in times of multi-core systems running multiple AIs concurrently isn't a bad idea.

I'm currently refactoring my AI system and the biggest show-stopper of multi-threaded AI is the interaction with the other entities. E.g. if unit A shots at unit B which shots at unit C while walking etc. , updating this concurrently without using standard synchronization tools (e.g. OS mutex which are often avoided in real-time games) can get messy really quickly.

To break AI a little bit up, you can divide it into decision making and action execution. The latter manipulates the world and/or other entities and is therefor more critical. The former is much easier to handle, because it often only scans the world, or better only a (partly) copy of the world (read-only access), or manipulates the according entity.

Well, a basic idea would be, to use multithreading for decision making and a single stable world on a single thread for action execution. There are really several ways to implement it, e.g. use a threadpool and a dispatcher for the AI decision making, add the actions to a lock-less array(queue) and execute the actions afterwards on a single thread.

But,mutlithreading is one of the fastest way to kill of your game, if you aren't really familiar with MT programming, AI etc., so think carefully about using it.

You can't, not even threads can accomplish this. You still need to update the AI behavior, one unit at a time, because computers can only run one line of code at a time.

Hmm... in times of multi-core systems running multiple AIs concurrently isn't a bad idea.

I'm currently refactoring my AI system and the biggest show-stopper of multi-threaded AI is the interaction with the other entities. E.g. if unit A shots at unit B which shots at unit C while walking etc. , updating this concurrently without using standard synchronization tools (e.g. OS mutex which are often avoided in real-time games) can get messy really quickly.

To break AI a little bit up, you can divide it into decision making and action execution. The latter manipulates the world and/or other entities and is therefor more critical. The former is much easier to handle, because it often only scans the world, or better only a (partly) copy of the world (read-only access), or manipulates the according entity.

Well, a basic idea would be, to use multithreading for decision making and a single stable world on a single thread for action execution. There are really several ways to implement it, e.g. use a threadpool and a dispatcher for the AI decision making, add the actions to a lock-less array(queue) and execute the actions afterwards on a single thread.

But,mutlithreading is one of the fastest way to kill of your game, if you aren't really familiar with MT programming, AI etc., so think carefully about using it.

Yes i've alreday check for parallel threadings via threadpool or something else, but to be honest i'm not an expert in multithreads. I already used it but not in a game development. Parallel AI is something i'd like acheive

My problem is that i use a message system to communicate between different type and the handling is in the state and sometimes a unit instance doesn't receive the message because " it's not is turn " to evaluate the logic so i need a way to parallelize some stuff

so any ideas is welcome

Multi-threading is usually used as a performance optimization; it doesn't solve any of your problems here, and would only complicate things. Despite what you think, you actually want a predictable update sequence.

I don't understand why your different types of state are singletons. Instead, just make a new instance of the state data for each unit instance.

Each different state instance is singleton because i just want to save a bit of memory. But to be honest i don't check the impact or the difference if each state machine have their own state instance

This topic is closed to new replies.

Advertisement