Open GoogleCodeExporter opened 9 years ago
Вероятно проблема с большим потреблением
GDI объектов.
Если переходим за лимит 10 тыс - GUI флая
умирает.
В аттаче снимки для различных клиентов для
сравнения.
Решения
1. Создавать GUI кнопки только когда фрейм
становится активным.
2. Вообще MessagePanel создавать в одном
экземпляре и подключать ее к активному
фрейму хаба динамически.
3. Найти другие места потребления GDI
4. Убрать отрисовку говно-закладок в GDI+ и
вернуть код из r4xx или AirDC++
- ужасно медленно перерисовывается на слабых ноутах.
Original comment by Pavel.Pimenov@gmail.com
on 26 Aug 2013 at 4:51
Attachments:
Реализован вариант 1 ("Создавать GUI кнопки
только когда фрейм становится активным.")
- В заголовок вывел кол-во GDI объектов
используемых программой
- Сократил потребление GDI c 9400 до 3100
- Создаются два экземпляра кнопок MessagePanel
для фрейма хаба и приватных мессаг
TODO - оставить один экземпляр
При активации фрейм - создаем кнопочки, предыдущий удаляем
TODO - убрать в onBeforeActiveTab цикл обхода всех фреймов а помнить предыдущий
в переменной.
- Во время запуска фреймов лочим void
HubFrame::UpdateLayout через флажек
BaseChatFrame::g_isStartupProcess
(на ноуте заметно быстрее запустилось)
- Унести в динамику другие общие GUI объекты
BaseChatFrame
* CStatusBarCtrl m_ctrlStatus
* CEdit ctrlMessage;
* CFlyToolTipCtrl m_ctrlLastLines;
- В HIconWrapper создаем объекты с флагом LR_SHARED и
не зовем для них DestroyIcon
(хотя и если позвать тоже работает :)
- Удалил ошметки OnFinalMessage
- TODO в CAnimatedButton::onClose пока в отладке падаем
ReleaseDC вертает ошибку т.к. m_hWnd == NULL
Original comment by Pavel.Pimenov@gmail.com
on 26 Aug 2013 at 4:32
Attachments:
Лучше было бы конечно реализовать второй
вариант :)
2. Вообще MessagePanel создавать в одном
экземпляре и подключать ее к активному
фрейму хаба динамически.
А то сейчас какие то уж слишком стрёмные
действия происходят при переключении окон
:)
Original comment by a.rain...@gmail.com
on 26 Aug 2013 at 5:09
r15083
Original comment by a.rain...@gmail.com
on 26 Aug 2013 at 5:10
Ну т.е. отложенная инициализация кнопок это
конечно хорошо, но странно, ибо можно было
отложенно инитить целиком всю панель, и код
получился бы проще.
Original comment by a.rain...@gmail.com
on 26 Aug 2013 at 5:12
Я пока исследую проблему - хотел оценить
сколько ресурсов пропадает.
Сейчас прога уже терпимо стартует на 150
хабах.
А почему стремные?
раньше было лучше - у меня прога иногда
добегала до 10 тыс лимита и сдыхала.
Original comment by Pavel.Pimenov@gmail.com
on 26 Aug 2013 at 5:24
При разрушение кнопок - иногда падаем.
https://crash-server.com/Problem.aspx?ClientID=ppa&ProblemID=35839
https://crash-server.com/Problem.aspx?ClientID=ppa&ProblemID=35840
http://www.flickr.com/photos/96019675@N02/9602501592/
Original comment by Pavel.Pimenov@gmail.com
on 26 Aug 2013 at 6:52
Вчера вечером запустил клиент на ночь
Параметры были
Память - 464
GDI - 3171
Утром
Память - 677
GDI - 3821
http://www.flickr.com/photos/96019675@N02/9601910073/
Оставляю до вечера.
Клиент или подтекает, или помнит много
лишнего.
Original comment by Pavel.Pimenov@gmail.com
on 27 Aug 2013 at 2:19
Посмотрел на флай через GDIView
(http://www.nirsoft.net/utils/gdi_handles.html)
Зачем открыто 170 шрифтов?
http://www.flickr.com/photos/96019675@N02/9605226954/
Original comment by Pavel.Pimenov@gmail.com
on 27 Aug 2013 at 2:32
Мелкие фиксы r15091
>>А почему стремные?
Панель пересоздавать не хорошо. Её надо
создать при изменении (загрузке) настроек,
и не удалять до следующего изменения
(загрузки) настроек, а к фреймам цеплять при
необходимости, хотя я не уверен что ATL (WTL)
вообще так позволяет делать.
>>Клиент или подтекает, или помнит много
лишнего.
По памяти там есть логические утечки, это
100%.
Увеличение количества GDI объектов это,
вероятнее всего, смайлы.
>>Зачем открыто 170 шрифтов?
Незачем, просто где то ещё код кривой :(
Original comment by a.rain...@gmail.com
on 27 Aug 2013 at 10:54
Original comment by a.rain...@gmail.com
on 27 Aug 2013 at 10:55
Original comment by a.rain...@gmail.com
on 27 Aug 2013 at 10:55
Тут ещё какой момент - мне очень не нравится
как реализован g_isStartupProcess. Вроде я даже
рассказывал как наиболее правильно
сделать такой механизм через добавление
глобального счётчика где нибудь в WinUtil -
собрались создавать окно, или при старте
программы - увеличили счётчик, и там же
глобально запретили перерисовку, потом, в
процессе создания окон, уменьшаем счётчик
и когда он доходит до 0, разрешаем
перерисовку. А текущий подход к примеру не
оптимизирует открытие 20-30 хабов из окна
"Интернет хабы".
Original comment by a.rain...@gmail.com
on 27 Aug 2013 at 11:11
Вынести панель из фрейма BaseChatFrame - пока
слишном геморно.
Сделал создание всех объектов в динамике.
вроде пашет.
Я не понял, что плохого когда GUI создается и
когда не нужен - разрушается?
Original comment by Pavel.Pimenov@gmail.com
on 27 Aug 2013 at 11:24
Когда я все тут доделаю чтобы работало
лучше чем сейчас - можешь причесать как
нравится :)
Original comment by Pavel.Pimenov@gmail.com
on 27 Aug 2013 at 11:28
>>Вынести панель из фрейма BaseChatFrame - пока
слишном геморно.
А выносить и не надо :)
>>Сделал создание всех объектов в динамике.
вроде пашет.
Агу, и кушать заметно меньше стал.
>>Я не понял, что плохого когда GUI создается
и когда не нужен - разрушается?
Да в принципе ничего, просто код довольно
стрёмный получается :) Хотя если создавать
и разрушать более глобально, то и опасных
мест меньше будет. В принципе можно даже
при сворачивании проги часть гуя разрушать.
p.s: ок, ок, больше трогать не буду те места,
всё равно у меня на днях отъезд в Белорусь
на несколько дней намечается.
Original comment by a.rain...@gmail.com
on 27 Aug 2013 at 12:37
Вечером
http://www.flickr.com/photos/96019675@N02/9605415457/
Память - 821
GDI - 4528
Original comment by Pavel.Pimenov@gmail.com
on 27 Aug 2013 at 2:20
В результате изменений в r15101
на тестовой конфигурации сократил расход GDI и памяти
GDI - 1854
Memory - 279
Скорость старта так-же немного возросла, но
остается неприятное дерганье
текста в окне статуса (пока не понял почему
- теперь окно статуса должно создаваться в
одном экземпляре)
Никак не могу придумать и найти способ
определить программно
момент когда все в проге конструировалось
и она стала отзываться.
с помощью этого флажка можно много место
отключить в переходном периоде.
Original comment by Pavel.Pimenov@gmail.com
on 27 Aug 2013 at 3:19
Attachments:
>>Никак не могу придумать и найти способ
определить программно
момент когда все в проге конструировалось
и она стала отзываться.
с помощью этого флажка можно много место
отключить в переходном периоде.
Это я потом сделаю, ибо более менее
представляю как, в общем забей пока.
Original comment by a.rain...@gmail.com
on 27 Aug 2013 at 3:41
>>При разрушение кнопок - иногда падаем.
туда же
https://www.crash-server.com/Problem.aspx?ClientID=ppa&Login=Guest&ProblemID=359
41 , ну т.е. надо бы их кучей закрыть.
Original comment by a.rain...@gmail.com
on 27 Aug 2013 at 4:48
Я пробовал - эта что-то не закрывается
Original comment by Pavel.Pimenov@gmail.com
on 27 Aug 2013 at 4:51
r15125
- Убрал из фрейма хабов меню OMenu tabMenu и OMenu
userMenu
теперь создаю не 150 экземпляров а только два для того фрейма, который активируется.
- Добавлен метод virtual void onInvalidateAfterActiveTab(HWND aWnd) {}
для перерисовки активированного фрейма - пока не пашет
и при переключение закладок мерцает.
- Обращение к getFavoriteHubEntry делаем так-же динамически по мере активации фрейма а не для всех сразу.
Original comment by Pavel.Pimenov@gmail.com
on 28 Aug 2013 at 4:47
Поймал падение с повреждением кучи в
момент закрытие приложения.
даже краш сервер не сработал...
http://www.flickr.com/photos/96019675@N02/9613885333/
Пока не знаю точно причину
Слежу за дампами на краш сервере.
Original comment by Pavel.Pimenov@gmail.com
on 28 Aug 2013 at 5:01
В новой бетке на тестовом ноуте замер после
старта
GDI - 1807
Memory - 294
Original comment by Pavel.Pimenov@gmail.com
on 28 Aug 2013 at 5:32
Attachments:
r15135
- В закладках в режиме GDI+ создавалась лишняя кисть CPen и никогда не
использовалась порождая 150 лишних GDI
объектов
TODO
- Если выключить IRAINMAN_USE_GDI_PLUS_TAB вообще не собирается - позже
поправить
- Выкинуть созданеи в конструкторе 300 иконок
HIconWrapper* m_hIcon;
HIconWrapper* m_hStateIcon;
Original comment by Pavel.Pimenov@gmail.com
on 29 Aug 2013 at 4:35
r15138
- Исправлен баг CDC dc(::GetDC(hWnd)); нужно CDCHandle dc(::GetDC(hWnd));
т.к. ~CDC() зовет DeleteDC
- Убрал ZION_TABS
- Убрал using namespace Gdiplus; из хедера - опасно.
- Выкинул созданеи в конструкторе 300 иконок
HIconWrapper* m_hIcon;
HIconWrapper* m_hStateIcon;
теперь они создаются динамически - потетсить частоту и может быть
придумать кеширование.
TODO
- Убрать копипаст
TabInfo* t = *i;
if (row == t->m_row &&
pt.x >= t->m_xpos &&
pt.x < t->m_xpos + t->getWidth())
- long p_icon, long p_stateIcon сократить тип с long (зачем такое длинное
число для иконки)
Original comment by Pavel.Pimenov@gmail.com
on 29 Aug 2013 at 4:36
>> Если выключить IRAINMAN_USE_GDI_PLUS_TAB вообще не
собирается - позже
поправить
Агу, там не полностью бекпартировано, ибо я
пытался портировать с переносом нового
функционала - кнопочки закрытия и т.п,
которого в той версии вкладок небыло, но
это оказалось слишком, а потому отложил
ввиду наличия более актуальных задач.
Original comment by a.rain...@gmail.com
on 29 Aug 2013 at 4:37
После исправлений r15135 и r15138
GDI объектов стало после старта 1655
RAM правда куда-то делась... и стало кушать 300м
Завтра посмотрю внимательней
Original comment by Pavel.Pimenov@gmail.com
on 29 Aug 2013 at 6:53
Attachments:
r15216
Отключив стартовое заполнение ListItem-ов
сэкономил еще 20 метров памяти
и ускорил запуск. юзера в фоновые хабы
добавляются теперь только в контейнер
и не пишутся в визуальный GUI объект
До исправления 472 м памяти после старта (x 64
версии)
http://www.flickr.com/photos/96019675@N02/9671616243/
После 449 м
http://www.flickr.com/photos/96019675@N02/9674845888/
Original comment by Pavel.Pimenov@gmail.com
on 4 Sep 2013 at 6:05
После r15218
Потребление при тестовом запуске
сократилось еще на 2 м до 447м на x64 версии
http://www.flickr.com/photos/96019675@N02/9675162070/
Original comment by Pavel.Pimenov@gmail.com
on 4 Sep 2013 at 6:54
Original issue reported on code.google.com by
Pavel.Pimenov@gmail.com
on 25 Aug 2013 at 4:27Attachments: