Здравствуйте! Пишу обработчик для WM_MOUSEMOVE
для своего элемента UI. Есть массив этих элементов UI Сol *col[100000]={NULL}
, часть которого не NULL
. Так вот, если ниже приведённый код(обработчик) находиться непосредственно в case WM_MOUSEMOVE:
то с производительностью всё нормально. Но если обернуть обработчик в функцию находящуюся в хидере, и в MOUSEMOVE
просто вызывать её, то производительность значительно падает(лагает короче). Уже перепробовал и inline
и __forceinline inline
, ничего не помогает..
Тут можно что-то сделать?
Код
elem.h
__forceinline inline void MouseMove(HWND hwnd,LPARAM lp,RECT rr)
{
for (int i(0); i < col_count; i++)
if (col[i])
if (col[i]->Hover(LOWORD(lp), HIWORD(lp)) == 1 && !col[i]->bold)
{
col[i]->Bold();
rr.left = col[i]->x;
rr.top = col[i]->y;
rr.right = col[i]->x + col[i]->cx + 1;
rr.bottom = col[i]->y + col[i]->cy;
InvalidateRect(hwnd, &rr, 0);
UpdateWindow(hwnd);
}
else if (!col[i]->Hover(LOWORD(lp), HIWORD(lp)) && col[i]->bold)
{
col[i]->Bold();
rr.left = col[i]->x;
rr.top = col[i]->y;
rr.right = col[i]->x + col[i]->cx + 1;
rr.bottom = col[i]->y + col[i]->cy;
InvalidateRect(hwnd, &rr, 0);
UpdateWindow(hwnd);
}
}
main.cpp
#inlcude"elem.h"
...//где-то в WndProc
case WM_MOUSEMOVE:
MouseMove(hwnd,lp,rr);
break;
...
Сомнителен сам принцип хранения - массив из 100000 указателей, которые еще и обрабатываются при MOUSEMOVE
. Даже в этом варианте имеет смысл ненулевые собирать в начале, и прерывать цикл при обнаружении первого нулевого.
Если вы реально видите разницу между функцией и руками вставленным кодом - поработайте с профайлером, чтоб понять, где узкое место. Но самая большая оптимизация - это оптимизация алгоритмов и структур данных. Вот все же, сколько у вас реально ненулевых указателей в массиве? Может, тот же список был бы эффективнее?
И еще - ну зачем этот дубляж кода? Раз уж вы проверяете
col[i]->Hover(LOWORD(lp), HIWORD(lp)) == 1
то делаю вывод, что ваши флаги принимают значения 0 и 1 - а тогда проще сделать одну ветку как
if (col[i]->Hover(LOWORD(lp), HIWORD(lp)) + col[i]->bold == 1)
и не мучиться с дублированием кода.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Когда я получаю ошибку в бусте, я могу ее прочитать, вызвав метод error_code::message()Я бы хотел, чтобы она выводилась на английском (сейчас она выводится...
Помогите пожалуйстаФункция должна выводить слово(слова) минимальной длины
Почему strcat в цикле добавляет содержимое второго массива (аргумента) в первый несколько раз, как показано на картинке