Коллега из соседнего проекта попросил у меня помощи.
Проект, говорит, не собирается — компилирует бесконечно долго, уже и кофе пил, и на ночь оставлял.
Давай, говорю, проект, хоть посмотрю что как.
Посмотрел.
Version 7.3 (7D175), Apple LLVM version 7.3.0 (clang-703.0.29), проект под iOS.
В самом деле, без оптимизации проект собирается, с -Os (штатный для сборки релиза для заливки в аппстор) — не собирается. Висит бесконечно на этапе компиляции, ещё до линковки. Прождал 10 минут (перекурил), cancel.
Нашёл файл, который не хочет компиляться.
C++98, никакого Objective-C++ (игра). Никакого boost или ещё какой шаблонной магии. Конкретно в этом файле даже STL нет.
Вообще файл назван main.cpp, содержит 7 глобальных переменных числовых типов (uint, DWORD и float; одна из глобальных переменных gMsPerFrame (вполне self-explaining) типа float) и несколько функций без классов общего вида, типа
void Init()
{
gSomeObject.Init();
gSomeOtherObject.Init();
...
}
Все эти gObject определены в других файлах.
Начал комментировать последовательно, нашёл участок кода, который приводит к эффекту.
в функции Update(), которая, как я предполагаю, вызывается каждый кадр игры, есть определение FPS. Ну, там, получить время, понять сколько времени прошло с предыдущего запроса. Что от этого зависит — не разбирался.
Но добавлен нижний "фильтр" на FPS вот такого совершенно невинного вида:
if (gMsPerFrame > 66)
gMsPerFrame = 66;
Закомментарил — всё компилируется.
Заменил на такой же невинный фрагмент:
float newMsPerFrame = gMsPerFrame > 66? 66: gMsPerFrame;
gMsPerFrame = newMsPerFrame;
Компилируется.
Интересно как оптимизация сработала. Точнее, кмк, не сработала.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Dair, Вы писали:
D>Но добавлен нижний "фильтр" на FPS вот такого совершенно невинного вида:
D>D>if (gMsPerFrame > 66)
D> gMsPerFrame = 66;
D>
D>Закомментарил — всё компилируется.
D>Заменил на такой же невинный фрагмент:
D>D> float newMsPerFrame = gMsPerFrame > 66? 66: gMsPerFrame;
D> gMsPerFrame = newMsPerFrame;
D>
D>Компилируется.
D>Интересно как оптимизация сработала. Точнее, кмк, не сработала.
Т.к. это значения типа float, я бы написал так:
if (gMsPerFrame > 66.0)
gMsPerFrame = 66.0;
Ну или вот так:
float newMsPerFrame = gMsPerFrame > 66.0 ? 66.0 : gMsPerFrame;
gMsPerFrame = newMsPerFrame;
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте