Я хотел бы начать учиться и понимать какие а также когда оптимизировать в коде, предназначенном для в реальном времени симуляции (особенно для игр). Существуют различные фрагменты кода, большинство из которых сравнивают стандартные функции trig или sqrt с их оптимизированными версиями. Некоторые требуют сборки, другие полагаются на специфические для архитектуры стратегии, а некоторые используют чисто математические приемы (такие как справочные таблицы или функции аппроксимации). Каждая версия утверждает, что она быстрее, с минимальными затратами.
Насколько мне известно, нет скомпилированного материала (например, книги), объясняющего, что можно сделать, включая основы (никто не знает ассемблер, SSE, SIMD, MMX, FPU и т. Д.). Однако существует множество книг, нацеленных на то, как реализовать некоторые числовые методы (такие книги хороши, но они не подчеркивают важность быстрых битов, потому что подавляющее большинство из этих книг даже не включают специфический для архитектуры код или обсуждения с плавающей точкой с точки зрения разработчика).
Итак, кто-нибудь может поделиться очень коротким списком книг или других ресурсов, которые лучше всего подходят для этих сценариев?
П.С .: У меня сложилось впечатление, что «Числовые рецепты на C ++ ..» или «C ++ для ученых и инженеров ..» или «C ++ для научных вычислений ..» не содержат много (если таковые имеются) информации по этому вопросу.
«Симулятор» — это, как правило, сложная программа, выполняющая некоторый структурированный анализ заданных исходных данных, производительность которой больше зависит от выбора алгоритма и параметризации проблемы, чем от скорости sqrt
, Читатели числовых методов или научных вычислительных книг больше заинтересованы в том, чтобы сходиться быстрее, чем квадратные корни быстрее. И жертвование точностью обычно представляет собой опасную игру.
Играм обычно требуется проецировать набор данных, представляющих динамическое состояние игры, из одного кадра в другой. Понятия сходимости нет, применяются уравнения «замкнутой формы» для продвижения состояния по мере необходимости.
В качестве руководства используйте книгу по программированию игр, а не научную компьютерную книгу. Оба будут ссылаться на «числовые рецепты», но игры, как правило, будут использовать меньше.
Не оптимизируйте, пока не возникнет проблема с производительностью. Маленькие функции всегда можно сделать быстрее и менее точными после Вы обнаружите, что есть проблема с производительностью. Профилировщик может легко определить проблемы с производительностью, но автоматически ничего не найдет проблемы с точностью! Использование библиотеки не должно препятствовать применению микрооптимизации после определения горячих точек.
Я использовал библиотеку C ++ Eigen algebra и нашел ее невероятно дружественной и быстрой для геометрии. Я занимаюсь наукой, но она отлично подходит и для игр. Все это плоский массив, которым вы можете манипулировать с C или C ++ (или сборкой, но настоящие программисты просто заставляют компилятор выводить сборку, которую они хотят), когда встроенные операторы неудовлетворительны.
Других решений пока нет …