Я полностью переработал решение, используя два вектора, один для юнитов спереди и один для других юнитов, и изменил все алгоритмы таким образом, чтобы юнит с измененным статусом немедленно перемещался из одного вектора в другой.Таким образом, я исключил подсчет в операторе [], который был основным узким местом.
Перед использованием профилировщика я получал время вычислений от 5500 до 7000 мс.Посмотрев здесь ответы, 1) я изменил переменные цикла с ushort на int или uint, что уменьшило продолжительность на ~ 10%, 2) я сделал еще одну модификацию вторичного алгоритма, чтобы уменьшить продолжительность еще на 30%3) Я реализовал два вектора, как описано выше.Это помогло сократить время вычислений с ~ 3300 мс до ~ 700 мс, то есть еще на 40%!
В целом это сокращение на 85 - 90%!Спасибо SO и профилировщику.
Далее я собираюсь реализовать шаблон-посредник и вызывать функцию обновления только при необходимости, возможно, вытягивая еще несколько мс.:)
Новый код, который соответствует старому фрагменту (функциональность теперь совершенно другая):
UnitBase* Formation::operator[](ushort offset)
{
if (offset < numFightingUnits)
return unitFormation[offset]->getUnit();
else
return NULL;
}
Намного короче и ближе к делу.Конечно, было много других тяжелых модификаций, наиболее важным из которых было то, что unitFormation теперь std::vector<UnitFormationElement*>
, а не просто UnitBase**
.UnitFormationElement*
содержит UnitBase*
вместе с некоторыми другими важными данными, которые раньше были в классе Formation
.