Новичок
- Статус
- Не в сети
- Рег
- 7 Окт 2026
- Посты
- 3
- Реакции
- 0
Как перестать греть процессор при выводе 100 000 элементов
Многие новички при написании внутренних инструментов или читов на C++ с использованием Dear ImGui совершают классическую ошибку: пытаются отрисовать огромные массивы данных в обычном циклеfor. Если у вас в векторе 50-100 элементов — разницы нет. Но как только счет идет на тысячи, FPS проседает до значений слайд-шоу, потому что CPU тратит кучу циклов на генерацию вершин для объектов, которые даже не помещаются на экран.Решение этой проблемы — фризлинг (culling) на стороне библиотеки. Для этого в API есть встроенный классВажно понимать: ImGui — это Immediate Mode GUI. Каждый кадр всё дерево виджетов перестраивается заново. Если элемент не виден, его не нужно обрабатывать.
ImGuiListClipper. Он высчитывает, какие именно строки попадают во вьюпорт, и выдает нам только нужный диапазон индексов.Рабочая схема выглядит так:
- Создаем экземпляр клиппера.
- Вызываем метод
Begin, передавая общее количество элементов и высоту строки. - В цикле
Stepполучаем актуальный диапазон DisplayStart и DisplayEnd.
Код:
ImGuiListClipper clipper;
clipper.Begin(data_vector.size());
while (clipper.Step()) {
for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) {
ImGui::Text("Item %d: %s", i, data_vector[i].c_str());
}
}
Гости не видят ссылку
Войти или зарегистрироваться
внутреннего устройства буферов ImDrawList.- Плюсы: мгновенный скроллинг, отсутствие лагов интерфейса.
- Минусы: нужно заранее знать (или фиксировать) высоту строки.
clipper.ForceDisplayRangeByIndices. В большинстве случаев стандартного поведения хватает за глаза. Не пренебрегайте этим, даже если сейчас ваш список кажется маленьким — данные имеют свойство разрастаться.