Há duas coisas distintas a serem consideradas ao medir e otimizar o desempenho de um sistema de entidades em grande escala.
No nível baixo, você tem a representação física de suas entidades, que tende a se resumir ao uso de layouts de armazenamento eficientes como SoA (estruturas de matrizes) para reduzir o custo de iterar e atualizar todas as entidades ativas.
No nível superior, você tem lógica de tomada de decisão, lógica geral de jogo, IA e busca de caminhos. Essas são todas as tarefas que têm em comum que elas não precisam ser executadas na mesma taxa de atualização que a sua renderização.
Como você obteria um tempo de quadro desigual se adotar a abordagem ingênua de executar essas tarefas a cada N quadros, tende a ser benéfico amortizar o custo em vários quadros.
Se a tarefa for de natureza incremental, você poderá executar parte do algoritmo a cada quadro e usar resultados parciais em suas atualizações.
Se a tarefa for amplamente monolítica, mas separável por entidade, você poderá executá-la para um subconjunto de suas entidades de jogo por quadro, alternando entre elas de maneira alternada. Isso tem o benefício de reduzir a complexidade de coisas como busca de caminhos e IA, pois você não tem todo mundo tentando agir ao mesmo tempo.
No RTS tático em grande escala em que trabalhei, nos concentramos em ter estruturas de dados robustas para consultar a representação de baixo nível nos algoritmos de alto nível, para encontrar os vizinhos das entidades do jogo. O processo de atualização de baixo nível agiu de acordo com as intenções fornecidas pela simulação de alto nível de atualização lenta e, no final, resumiu-se a uma simulação de partículas barata, chegando a milhares.