No description
Find a file
Vantha 0a3bd16cb5
Optimise GetEntityState
GetEntityState is a performance-critical function in the GUI when a
large number of units are selected. The goal of this patch is to
increase the efficiency of it without modifying the returned states
visible to rest of the GUI in any way (it renames a few properties of
entities states or moves them around, but the information they contain
and the way to access it remain the complete same)

As explained the comments, certain parts (the template data) of an
entity state are "predictable" and can be reused between entities with
the same template.
What one has to account for, however, is that values of the template
data can be modified. This happens on two different levels:
Firstly, player-wide modifications, which apply to all entities owned
by that player. This includes stuff like bonuses from researched techs,
civs bonuses, team bonuses. And secondly, entity-local modifications,
which apply to individual entities. This includes buffs or debuffs from
status effects or auras (of other entities).

So we can construct a whole entity state by first just computing the
dynamic state (stuff like current hitpoints, which differs from entity
to entity) and then adding the (potentially already cached) template
data to it, which can be reused between entities with the same template
and owning player. And then overwrite the values affected by
entity-local modifications, which are usually just a few and even they
can be cached and reused for entities with the same owning player,
template, and entity-local modifications (identified by the
"modifications ID").

This saves the effort of retrieving/computing a ton of data each turn
and also saves the time it takes the engine to clone the data from the
simulation to the GUI (as the return value of the GUI interface call),
which previously took just as long as retrieving the entity states
themselves.

Since only the dynamic state is read from the components, a number of
small getter methods have become unused; they are kept (for now at
least) since they might be useful again in the future or for mods.
2026-08-14 12:47:04 +02:00
.gitea Update the actions used by the lint workflow 2026-08-04 10:09:22 +02:00
binaries Optimise GetEntityState 2026-08-14 12:47:04 +02:00
build Rebuild SPIRV shaders on all shader changes 2026-07-28 16:26:16 +02:00
docs Fix trailing whitespace and add pre-commit hook 2025-06-15 20:08:48 +02:00
libraries Delete .already-built file prior to new build 2026-08-03 20:54:04 +02:00
source Add macOS hint for game mode. 2026-08-07 14:09:25 +02:00
.editorconfig Update the pre-commit hooks 2025-08-22 13:04:38 +02:00
.gitattributes Move maps XML files out of LFS 2025-06-11 10:33:57 +02:00
.gitignore Add clang-tidy linting script 2026-07-21 17:15:07 +02:00
.groovylintrc.json Add a Jenkinsfile linter 2025-05-08 19:50:21 +02:00
.lfsconfig Update lfsconfig comment 2025-06-29 08:31:50 +02:00
.markdownlint.yaml Add a markdownlint pre-commit hook 2024-08-27 10:06:31 +02:00
.pre-commit-config.yaml Update the pre-commit hooks 2026-08-01 16:19:18 +02:00
.shellcheckrc Add util.sh shell library 2025-03-30 18:05:56 +02:00
.yamllint.yaml Add yamllint to pre-commit 2024-09-08 13:08:11 +02:00
eslint.config.mjs Set indent value for switch statement 2026-02-16 14:19:19 +01:00
LICENSE.md Update LICENSE files for cpp-httplib 2026-02-15 19:47:30 +01:00
license_dbghelp.txt Convert license_dbghelp.txt to UTF-8 2024-08-31 17:04:05 +02:00
license_gpl-2.0.txt Initial attempt at describing licensing details 2009-06-20 17:45:51 +00:00
license_lgpl-2.1.txt Fix trailing whitespace and add pre-commit hook 2025-06-15 20:08:48 +02:00
license_mit.txt Adds globalscripts/BicubicInterpolation.js, the corresponding license_mit.txt and points to it for other files with the same license in LICENSE.txt - reviewed by Philip and Itms. Uses that to fix an interpolation issue in gaia.js and also fixes a "fail by one" there - reviewed by elexis. Fixes #4174 2016-09-06 21:49:57 +00:00
package.json Use @stylistic/brace-style for eslint 2026-01-12 21:33:52 +01:00
README.md Add more badges to the UI. 2025-03-22 14:11:24 +01:00
ruff.toml Update the pre-commit hooks 2026-08-01 16:19:18 +02:00

0 A.D. Introductory Information

FreeBSD Build Status Linux Build Status macOS Build Status Windows Build Status

Game References Checks Status Pre-commit Checks Status

Bi-Weekly Bundles Status Technical Docs Status Nightly Build Status

0 A.D. (pronounced "zero ey-dee") is a free, open-source, cross-platform real-time strategy game of ancient warfare.

This is currently an incomplete, under-development version of the game. We're always interested in getting more people involved, to help bring the game towards completion and to share the interesting experience of developing a project of this scope.

There are several ways to contact us and find more information:

Running precompiled binaries on Windows

A precompiled, ready-to-play development version of the game is available from a checkout of the nightly-build SVN repository. If you are using the git repository, you have to follow the steps below.

In a checkout of the nightly-build SVN repository, open the "binaries\system" folder.

  • To launch the game: Run pyrogenesis.exe
  • To launch the map editor: Run Atlas.bat or "pyrogenesis.exe -editor"

Compiling the game from source code

The instructions for compiling the game on Windows, Linux and OS X are at BuildInstructions.

Reporting problems

Bugs should be reported on Gitea. For information on reporting problems and finding logs, see ReportingErrors.

Contributing Code

If you want to help out programming for the game, have a look at GettingStartedProgrammers or contact us on #0ad-dev on irc.quakenet.org

Contributing Artwork

If you want to make artwork for the game, have a look at For Artists or visit the forums.

Translating

You can help translating the game at https://www.transifex.com/projects/p/0ad for more information, see Localization