C++ Calculate Text Center (ImGui)

When every god dead, I can live a normal life...
Забаненный
Статус
Оффлайн
Регистрация
9 Авг 2020
Сообщения
328
Реакции[?]
48
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сделал простенькую функу которая расчитывает середину текста для имгуи

Для начала в нашем заголовочном файле прописываем дефайн
C++:
#define IMGUI_DEFINE_MATH_OPERATORS
C++:
ImVec2 ImGuiCustomMath::CalculateTextCenter(const ImVec2& ElementSize, std::string szText) {

    return (ElementSize - ImGui::CalcTextSize(szText.c_str())) / 2.0f;

} // !ImGuiCustomMath::CalculateCenterText
C++:
ImVec2 CalculateTextCenter(const ImVec2& ElementSize = { 0.0f, 0.0f }, std::string szText = "Text")

Как использовать (Пример):
C++:
// Наш размер окна или элемена
const ImVec2& SizeArg = { 150.0f, 100.0f };

// Наш текст
std::string szText = "Some text";

// Вместо DrawList(Window) вы используете ImGui::GetWindowDrawList() или другую DrawList функцию
DrawList(Window)->AddText(ImVec2{ 50.0f, CalculateTextCenter(SizeArg, szText.c_str()).y }, ImColor(255, 255, 255), szText.c_str(), NULL);

// Наш текст получается по центру y
Можно было и по-другому сделать xd
 
When every god dead, I can live a normal life...
Забаненный
Статус
Оффлайн
Регистрация
9 Авг 2020
Сообщения
328
Реакции[?]
48
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,996
Реакции[?]
1,275
Поинты[?]
5K
Участник
Статус
Оффлайн
Регистрация
6 Сен 2020
Сообщения
749
Реакции[?]
364
Поинты[?]
8K
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Ну типа каждый раз прописывать
imgui отрисовывается каждый кадр, ты кладешь функцию в cpp файле, т.е. она в отдельном юните, т.е. будет вызов, а это медленее чем просто написать руками деление на два.
Если хочешь чтобы хоть какой то профит был в использовании твоей функи пиши не / 2.0f а * 0.5f, умножение в матсопроцессоре быстрее.
 
Олдфаг
Статус
Оффлайн
Регистрация
4 Янв 2020
Сообщения
2,996
Реакции[?]
1,275
Поинты[?]
5K
imgui отрисовывается каждый кадр, ты кладешь функцию в cpp файле, т.е. она в отдельном юните, т.е. будет вызов, а это медленее чем просто написать руками деление на два.
Если хочешь чтобы хоть какой то профит был в использовании твоей функи пиши не / 2.0f а * 0.5f, умножение в матсопроцессоре быстрее.
Ты оптимизируешь функцию заменяя простое деление на умножение? Гениально, блять, просто гениально. Выигрываем пол сотой секунды, делая бестолковое действие
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Ты оптимизируешь функцию заменяя простое деление на умножение? Гениально, блять, просто гениально. Выигрываем пол сотой секунды, делая бестолковое действие
Нет блять, гениальна только твоя математика, "пол сотой секунды" это 5ms т.е. по твоей логике ты за 1 секунду можешь сделать 200 умножений на современном проце, интересно на чем ты сидишь, на авм из 90х?
Если бы трюк с умножением экономил 5 миллисекунд за каждый вызов, то это было бы ОХУЕТЬ как много и его бы использовали абсолютно все, а не только знающие люди.
Я понимаю что ты пастер и тебе хочется повыебываться, но прежде чем лезть ко мне учи матчасть
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
Умножение быстрее всегда без исключений, код становится менее очевидным, но компилятор в обычной ситуации не посмеет поставить умножение сам, т.к. там теряется небольшая доля точности и этот трюк используется дохера, твоему говнокоду это не поможет, но для нормальных людей это серьезная оптимизация если использовать ее многократно.
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
imgui отрисовывается каждый кадр, ты кладешь функцию в cpp файле, т.е. она в отдельном юните, т.е. будет вызов, а это медленее чем просто написать руками деление на два.
Если хочешь чтобы хоть какой то профит был в использовании твоей функи пиши не / 2.0f а * 0.5f, умножение в матсопроцессоре быстрее.
Оптимизация компилятора вышла из чата просто, половина из того что ты написал будет сделано автоматически, даже его функция скорее всего будет заинлайнена
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Слишком много факторов.
Тогда может не стоит выпендриваться на меня и надеяться на компилятор, а форсировать все эти события и быть уверенными что оно будет работать быстро в любых ситуациях?
Заменить на * 0.5f и всегда получать быстрое деление на два, даже в дебаге.
Описать функу в заголовочном файле с префиксом inline (который не гарантирует, но дает рекомендацию) и в релизе получать инлайн в 100% случаев.
 
std::X$$V::Z::_Func_impl_no_alloc
Пользователь
Статус
Оффлайн
Регистрация
30 Мар 2019
Сообщения
389
Реакции[?]
103
Поинты[?]
1K
Тогда может не стоит выпендриваться на меня и надеяться на компилятор, а форсировать все эти события и быть уверенными что оно будет работать быстро в любых ситуациях?
Заменить на * 0.5f и всегда получать быстрое деление на два, даже в дебаге.
Описать функу в заголовочном файле с префиксом inline (который не гарантирует, но дает рекомендацию) и в релизе получать инлайн в 100% случаев.
1) Не в 100%. Если тебе нужно в 100%, используй __forceinline или ставь параметр компилятору.
2) * 0.5f кончено быстрее, но наш мозг так устроен, что обычное деление на 2 легче читать. Тут уже вкусовщина, кто-то экономит пару тиков, а кто-то пишет читаемый код. И то и то хорошо.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
1) Не в 100%. Если тебе нужно в 100%, используй __forceinline или ставь параметр компилятору.
2) * 0.5f кончено быстрее, но наш мозг так устроен, что обычное деление на 2 легче читать. Тут уже вкусовщина, кто-то экономит пару тиков, а кто-то пишет читаемый код. И то и то хорошо.
Я не понимаю, зачем вы все как один пытаетесь со мной спорить, не зная наверняка?
1) Где мной написано что inline будет давать 100%, написано же в релизе и с такой функцией как у него (однострочной), и потом __forceinline так же не инлайнит в 100% случаев, это просто более сильная директива компилятору.
2) Причем здесь тики вообще? Тик это дискретный интервал в ксго, определяет частоту синхронизации между сервером и клиентом, он стабилен и ты никак на него не можешь повлиять (экономить в том числе). То о чем мы говорим при выполнении функций на процессоре это фпс.
 
f3mb0y
Участник
Статус
Оффлайн
Регистрация
14 Фев 2017
Сообщения
625
Реакции[?]
291
Поинты[?]
1K
Я не понимаю, зачем вы все как один пытаетесь со мной спорить, не зная наверняка?
1) Где мной написано что inline будет давать 100%, написано же в релизе и с такой функцией как у него (однострочной), и потом __forceinline так же не инлайнит в 100% случаев, это просто более сильная директива компилятору.
2) Причем здесь тики вообще? Тик это дискретный интервал в ксго, определяет частоту синхронизации между сервером и клиентом, он стабилен и ты никак на него не можешь повлиять (экономить в том числе). То о чем мы говорим при выполнении функций на процессоре это фпс.
Даа... ФПС на проце...
Тик - "дискретный" интервал циклов CPU
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Даа... ФПС на проце...
Тик - "дискретный" интервал циклов CPU
Представь себе, фпс зависит от процессора в том числе, сколько раз за секунду цпу сможет сгенерировать кадр, это особенно актуально для imgui о котором мы тут говорим, т.к. imgui перерисовывается каждый кадр.
Интервал процессора называется тактом, а не тиком. Тики используются только для измерения системного времени, но это относится к контексту ОС, а не процессора.
 
ставь чайник, зажигай плиту
Эксперт
Статус
Оффлайн
Регистрация
22 Май 2020
Сообщения
1,444
Реакции[?]
1,092
Поинты[?]
10K
f3mb0y
Участник
Статус
Оффлайн
Регистрация
14 Фев 2017
Сообщения
625
Реакции[?]
291
Поинты[?]
1K
Представь себе, фпс зависит от процессора в том числе, сколько раз за секунду цпу сможет сгенерировать кадр, это особенно актуально для imgui о котором мы тут говорим, т.к. imgui перерисовывается каждый кадр.
Интервал процессора называется тактом, а не тиком. Тики используются только для измерения системного времени, но это относится к контексту ОС, а не процессора.
Такт в ДАННОМ контексте по смыслу тоже самое что и тик)

Сравнивать, что быстрее, * 0.5 или / 2 СЕЙЧАС тоже самое что сравнивать скорость i++ или ++i
 
ставь чайник, зажигай плиту
Эксперт
Статус
Оффлайн
Регистрация
22 Май 2020
Сообщения
1,444
Реакции[?]
1,092
Поинты[?]
10K
Похожие темы
Сверху Снизу