Здравствуйте! Пишу обработчик для 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)
и не мучиться с дублированием кода.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости