Назначение внутри цикла может быть проблемой, хотя я не знаком с библиотекой.Может помочь перемещение его за пределы цикла for и выполнение назначений полей вручную.Поможет и перемещение преобразований за пределы цикла.
Редактировать:
Это больше похоже на то, о чем я думал.
// Apply Matrix
glm::vec4 transformed;
glm::mat4 translation = m_rotation * m_translation;
for ( int i=0; i<6; i++ )
{
transformed.x = vertices[i].x;
transformed.y = vertices[i].y;
transformed.z = vertices[i].z;
transformed.w = 1.f; // ?
/* I can't find docs, but assume they have an in-place multiply
transformed.mult(translation);
// */
vertices[i].x = transformed.x;
vertices[i].y = transformed.y;
}
Может быть, просто возможно, присваивание не позволяет компилятору что-либо вставлять или разворачивать.Я отчасти предполагаю, что умножение достаточно велико, чтобы вытолкнуть это из кеша команд.И действительно, если вы начнете говорить о размерах кэшей, вы не будете устойчивы на многих платформах.
Вы можете попробовать продублировать несколько стеков и сделать больше, меньших циклов.
glm::vec4 transformed[6];
for (size_t i = 0; i < 6; i++) {
transformed[i].x = vertices[i].x;
transformed[i].y = vertices[i].y;
transformed[i].z = vertices[i].z;
transformed.w = 1.f; // ?
}
glm::mat4 translation = m_rotation * m_translation;
for (size_t i = 0; i < 6; i++) {
/* I can't find docs, but assume they have an in-place multiply
transformed.mult(translation);
// */
}
for (size_t i = 0; i < 6; i++) {
vertices[i].x = transformed[i].x;
vertices[i].y = transformed[i].y;
}
Как упоминал Джейсон, развертывание этих циклов вручную может быть интересным.
Я действительно не понимаюНе думаю, что вы заметите улучшение на порядок при любом из этих изменений.
Я подозреваю, что вызов этой функции менее важен, чем ускорение этой функции.Тот факт, что у вас есть эта проверка needsTransform внутри этой функции, заставляет меня думать, что это, вероятно, уместно.
Когда в вашем низкоуровневом коде возникают подобные проблемы высокого уровня, вы просто слепо вызываете этот метод поверхи думать, что это бесплатно.Независимо от того, верно ли ваше предположение о том, как часто needsTransform имеет значение true, оно может быть совершенно неверным.
Реальность такова, что вы должны просто вызывать этот метод один раз.Вы должны применить Transform, когда вы хотите применить Transform.Вы не должны вызывать applyTransform, когда вы можете захотеть применить applyTransform.Интерфейсы должны быть контрактными, относиться к ним как к таковым.