Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.
Закрыт 1 год назад.
Я новичок в c++
Есть вот такой метод
void FrameManager::LoadFrameData(char const *filename, const uint i_subIndex) {
std::array<float, 3> IGNORE{};
high_resolution_clock::time_point t1 = high_resolution_clock::now();
util::ReadFileMTR(i_subIndex, filename, IGNORE, m_vertices, m_textures, m_indices);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
long long int duration = duration_cast<microseconds>(t2 - t1).count();
__android_log_print(ANDROID_LOG_ERROR, "LOAD FRAME INTERNAL METHOD", "LOAD FRAME INTERNAL METHOD ::: %s", std::to_string(duration).c_str());
std::vector<GLfloat> newVert;
newVert.resize(m_indices.size() * 3);
int count = 0;
for (unsigned int index : m_indices) {
for (int k = 0; k < 3; ++k) {
newVert[count] = m_vertices[index * 3 + k];
count++;
}
}
for (int i = 0; i < m_indices.size(); i++) {
m_indices[i] = static_cast<unsigned int>(i);
}
m_vertices = newVert;
}
Как можно сделать метод еще быстрее?
Я имею ввиду, что мне не нравятся эти 2 цикла внизу... Как из можно заменить, чтоб ускорить это
Ваш первый цикл (двойной) использует диапазонную (range) версию с итерируемой переменной по значению. Т.е. даже изменяя index
, вы не измените значения внутри массива m_indices
:
for (unsigned int index : m_indices) {
for (int k = 0; k < 3; ++k) {
newVert[count] = m_vertices[index * 3 + k];
count++;
}
}
Во втором же вы как раз меняете значения в этом массиве:
for (int i = 0; i < m_indices.size(); i++) {
m_indices[i] = static_cast<unsigned int>(i);
}
Т.к. обработка идёт вполне себе линейно (нет каких-либо перескоков), то эти циклы вполне себе можно объединить в один. Учитывая, что (во втором случае) нужен именно индекс элемента массива, общий цикл лучше сделать как раз на базе второго.
for (int i = 0; i < m_indices.size(); i++) {
auto& index = m_indices[i];
for (int k = 0; k < 3; ++k) {
newVert[count++] = m_vertices[index * 3 + k];
}
index = static_cast<unsigned int>(i);
}
Ещё можно попробовать вариант разворачивания внутреннего цикла, хотя, оптимизатор может и сам что-то подобное сделать, я думаю.
for (int i = 0; i < m_indices.size(); i++) {
auto& index = m_indices[i];
newVert[count++] = m_vertices[index * 3 + 0];
newVert[count++] = m_vertices[index * 3 + 1];
newVert[count++] = m_vertices[index * 3 + 2];
index = static_cast<unsigned int>(i);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Вылазит MSB6006 " read access violation**IsRegistered** was nullptr VS 2019
Учусь делать адаптивную верстку с помощью сетки gridУ меня получилось то что я хотел, но в итоге происходит смещение кнопки внутри блока