This commit caches the last visited node in paint_arrange_structs and
in paint_arrange_structs_helper, which allows skipping iterating over
long linked lists that don't work well with modern CPU caches.
This is especially useful, if the list is walked just to be discarded in
the end.
This improves performance across the board, the busier the park, the
higher performance improvement.
I have verified this producing pixel-perfect results with ones before
this change by dumping giant screenshot on various parks in all zooms,
all rotations.
Results collected running before and after this change with `benchgfx`
command (https://github.com/OpenRCT2/OpenRCT2/pull/5655) on current
title sequence, YMMV.
**Park**|**Before**|**After**|**Delta**
:-----:|:-----:|:-----:|:-----:
Maian\_SOSDragon.sv6|2.80|2.43|-13.2%
Maian\_SOSFrosty.sv6|3.53|3.02|-14.4%
Maian\_SOSParabola.sv6|4.16|3.45|-17.1%
MrB.sv6|5.52|4.52|-18.1%
SpacekKing.sv6|8.53|6.52|-23.6%
SpacekMaple.sv6|7.18|5.75|-19.9%
SpacekMission.sv6|4.41|3.43|-22.2%
SpacekParadise.sv6|9.01|6.36|-29.4%
SpacekSwimmers.sv6|4.11|2.97|-27.7%
Stosky.sv6|3.34|2.36|-29.3%
| | |
**Average**|**5.26**|**4.08**|**-21.5%**
Increased SYNCHRONISED_VEHICLE_COUNT to 16 to permit duelling coasters with more coasters. Otherwise no changes to the game logic. Feature requested in the forums: https://openrct2.org/forums/topic/2544-synchronized-stations-dont-work-passed-8-stations/
This will impact network games which already have duelling coasters built with more than 8 adjacent stations, so a new network version is necessary.
To reproduce, run openrct2 on OSX, go to the options dialog, then to the bottom
of the misc tab, select an RCT1 location. Then, cancel that dialog. This would
trigger a null pointer dereference by returning std::string(nullptr).