лучше юзать функции игры(функции движка), да, но не те, что лежат на поверхности - они обычно для всяких апей(луа,джс и т.д. для кастомок кароче), а апи медленнее чем чистый с++. тебе на блюдце никто самую быструю функцию не будет класть таким вот образом))
https://yougame.biz/threads/139583/page-2#post-1745098 (старый немножко анскилл код. кучу локальных переменных не надо объявлять как я делал. они инлайнятся от них нет смысла)
для макс фпса делай цикл с небольшим анроллом(уродско будет выглядеть правда)
в общем должно выглядеть максимально по-уебищному(человеку трудно прочитать зато компьютер хорошо понимает), тогда будет норм фпс. ну и да, лучше итерировать сущностей в FrameStageNotify а не в ранфрейме ибо они все равно не апдейтятся так часто. героев можно занести в какую-нибудь собственную таблицу - они никуда не денутся в течении игры, также можно хукнуть OnCreateEntity/OnDestroyEntity или как их там(функции из CGameEntitySystem) чтобы удалять из своих таблиц уже несуществующих ентитей, и добавлять новых по мере их добавления в игру а не сидеть итерировать по кд.