View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0005459 | The Dark Mod | Coding | public | 25.12.2020 16:31 | 28.05.2023 23:51 |
Reporter | stgatilov | Assigned To | stgatilov | ||
Priority | normal | Severity | normal | Reproducibility | N/A |
Status | closed | Resolution | unable to reproduce | ||
Product Version | TDM 2.09 | ||||
Target Version | TDM 2.12 | ||||
Summary | 0005459: Optimize idRenderWorldLocal::CreateLightDefInteractions for ambient_world light | ||||
Description | The function idRenderWorldLocal::CreateLightDefInteractions searches for interactions of light like this: foreach area having light: foreach entity in area: if light is noshadows and entity not visible: continue ... # complicated code here Ambient world light is noshadows and covers the whole map. So all entities in the map are traversed every frame, just to see that they are not in the view and should be discarded. I tried to profile game on Painter's Wife FM. 6.7% of time is spent on this function, most of which wasted on entity visibility check. If I add this hack: volatile bool skipAmbientWorld = true; void idRenderWorldLocal::CreateLightDefInteractions( idRenderLightLocal *ldef ) { if (skipAmbientWorld && idStr::Icmp(gameLocal.entities[ldef->parms.entityNum]->spawnArgs.GetString("classname"), "atdm:ambient_world") == 0) { skipAmbientWorld = !!skipAmbientWorld; return; } Then only 1.4% is spent in this function. And all of it does into complicated logic of searching/adding interactions in the interaction table. The idea of optimization is to extract light/entity processing into a separate function, then write second traversal. The first traversal goes over all lights, then goes over their areas and entities. The second traversal should go over visible entities, then go over lights in their areas. The second approach should handle only specific class of lights, which are noshadows and large enough --- all the other lights should be handled with the first approach. | ||||
Additional Information | Originally reported here, noticed during 100K entities experiment: https://forums.thedarkmod.com/index.php?/topic/16837-when-youre-getting-close-to-the-entity-limit-inlining/&do=findComment&comment=454663 | ||||
Tags | No tags attached. | ||||
A different approach might be planned for this. Tentatively moving to 2.12 | |
This is no longer an issue after 0006296. Now CreateLightDefInteractions takes 1.15% of CPU time on Painter's Wife (according to profiler). Note that ambient light is noshadows. And for noshadows lights, we ignore areas which are not in the view. This optimization means that for ambient world light we traverse all areas + contents of areas in the view. And traversing areas is very fast, because number of areas is usually quite small. |
|
Date Modified | Username | Field | Change |
---|---|---|---|
25.12.2020 16:31 | stgatilov | New Issue | |
27.02.2021 08:57 | stgatilov | Assigned To | => stgatilov |
27.02.2021 08:57 | stgatilov | Status | new => assigned |
27.02.2021 08:57 | stgatilov | Target Version | TDM 2.10 => |
08.02.2022 14:54 | nbohr1more | Target Version | => TDM 2.11 |
15.11.2022 17:08 | nbohr1more | Note Added: 0015432 | |
15.11.2022 17:08 | nbohr1more | Target Version | TDM 2.11 => TDM 2.12 |
28.05.2023 23:50 | stgatilov | Note Added: 0016007 | |
28.05.2023 23:50 | stgatilov | Status | assigned => closed |
28.05.2023 23:50 | stgatilov | Resolution | open => unable to reproduce |
28.05.2023 23:51 | stgatilov | Relationship added | related to 0006296 |