CHUNGYUN / flylinkdc

Automatically exported from code.google.com/p/flylinkdc
0 stars 0 forks source link

r502-beta106 Недопустимо большое кол-во GDI дескрипторов! #1242

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
http://www.flickr.com/photos/96019675@N02/9592773324/

Original issue reported on code.google.com by Pavel.Pimenov@gmail.com on 25 Aug 2013 at 4:27

Attachments:

GoogleCodeExporter commented 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:

GoogleCodeExporter commented 9 years ago
Реализован вариант 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:

GoogleCodeExporter commented 9 years ago
Лучше было бы конечно реализовать второй 
вариант :)
2. Вообще MessagePanel создавать в одном 
экземпляре и подключать ее к активному 
фрейму хаба динамически.

А то сейчас какие то уж слишком стрёмные 
действия происходят при переключении окон 
:)

Original comment by a.rain...@gmail.com on 26 Aug 2013 at 5:09

GoogleCodeExporter commented 9 years ago
r15083

Original comment by a.rain...@gmail.com on 26 Aug 2013 at 5:10

GoogleCodeExporter commented 9 years ago
Ну т.е. отложенная инициализация кнопок это 
конечно хорошо, но странно, ибо можно было 
отложенно инитить целиком всю панель, и код 
получился бы проще.

Original comment by a.rain...@gmail.com on 26 Aug 2013 at 5:12

GoogleCodeExporter commented 9 years ago
Я пока исследую проблему - хотел оценить 
сколько ресурсов пропадает.
Сейчас прога уже терпимо стартует на 150 
хабах.

А почему стремные?
раньше было лучше - у меня прога иногда 
добегала до 10 тыс лимита и сдыхала.

Original comment by Pavel.Pimenov@gmail.com on 26 Aug 2013 at 5:24

GoogleCodeExporter commented 9 years ago
При разрушение кнопок - иногда падаем.
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

GoogleCodeExporter commented 9 years ago
Вчера вечером запустил клиент на ночь
Параметры были 
Память - 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

GoogleCodeExporter commented 9 years ago
Посмотрел на флай через 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

GoogleCodeExporter commented 9 years ago
Мелкие фиксы r15091

>>А почему стремные?
Панель пересоздавать не хорошо. Её надо 
создать при изменении (загрузке) настроек, 
и не удалять до следующего изменения 
(загрузки) настроек, а к фреймам цеплять при 
необходимости, хотя я не уверен что ATL (WTL) 
вообще так позволяет делать.

>>Клиент или подтекает, или помнит много 
лишнего.
По памяти там есть логические утечки, это 
100%.
Увеличение количества GDI объектов это, 
вероятнее всего, смайлы.

>>Зачем открыто 170 шрифтов?
Незачем, просто где то ещё код кривой :(

Original comment by a.rain...@gmail.com on 27 Aug 2013 at 10:54

GoogleCodeExporter commented 9 years ago

Original comment by a.rain...@gmail.com on 27 Aug 2013 at 10:55

GoogleCodeExporter commented 9 years ago

Original comment by a.rain...@gmail.com on 27 Aug 2013 at 10:55

GoogleCodeExporter commented 9 years ago
Тут ещё какой момент - мне очень не нравится 
как реализован g_isStartupProcess. Вроде я даже 
рассказывал как наиболее правильно 
сделать такой механизм через добавление 
глобального счётчика где нибудь в WinUtil - 
собрались создавать окно, или при старте 
программы - увеличили счётчик, и там же 
глобально запретили перерисовку, потом, в 
процессе создания окон, уменьшаем счётчик 
и когда он доходит до 0, разрешаем 
перерисовку. А текущий подход к примеру не 
оптимизирует открытие 20-30 хабов из окна 
"Интернет хабы".

Original comment by a.rain...@gmail.com on 27 Aug 2013 at 11:11

GoogleCodeExporter commented 9 years ago
Вынести панель из фрейма BaseChatFrame - пока 
слишном геморно.
Сделал создание всех объектов в динамике. 
вроде пашет.

Я не понял, что плохого когда GUI создается и 
когда не нужен - разрушается?

Original comment by Pavel.Pimenov@gmail.com on 27 Aug 2013 at 11:24

GoogleCodeExporter commented 9 years ago
Когда я все тут доделаю чтобы работало 
лучше чем сейчас - можешь причесать как 
нравится :)

Original comment by Pavel.Pimenov@gmail.com on 27 Aug 2013 at 11:28

GoogleCodeExporter commented 9 years ago
>>Вынести панель из фрейма BaseChatFrame - пока 
слишном геморно.
А выносить и не надо :)
>>Сделал создание всех объектов в динамике. 
вроде пашет.
Агу, и кушать заметно меньше стал.
>>Я не понял, что плохого когда GUI создается 
и когда не нужен - разрушается?
Да в принципе ничего, просто код довольно 
стрёмный получается :) Хотя если создавать 
и разрушать более глобально, то и опасных 
мест меньше будет. В принципе можно даже 
при сворачивании проги часть гуя разрушать.

p.s: ок, ок, больше трогать не буду те места, 
всё равно у меня на днях отъезд в Белорусь 
на несколько дней намечается.

Original comment by a.rain...@gmail.com on 27 Aug 2013 at 12:37

GoogleCodeExporter commented 9 years ago
Вечером 
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

GoogleCodeExporter commented 9 years ago
В результате изменений в r15101
 на тестовой конфигурации сократил расход GDI и памяти
 GDI - 1854
 Memory - 279
Скорость старта так-же немного возросла, но 
остается неприятное дерганье
текста в окне статуса (пока не понял почему 
- теперь окно статуса должно создаваться в 
одном экземпляре)

Никак не могу придумать и найти способ 
определить программно 
момент когда все в проге конструировалось 
и она стала отзываться.
с помощью этого флажка можно много место 
отключить в переходном периоде.

Original comment by Pavel.Pimenov@gmail.com on 27 Aug 2013 at 3:19

Attachments:

GoogleCodeExporter commented 9 years ago
>>Никак не могу придумать и найти способ 
определить программно 
момент когда все в проге конструировалось 
и она стала отзываться.
с помощью этого флажка можно много место 
отключить в переходном периоде.

Это я потом сделаю, ибо более менее 
представляю как, в общем забей пока.

Original comment by a.rain...@gmail.com on 27 Aug 2013 at 3:41

GoogleCodeExporter commented 9 years ago
>>При разрушение кнопок - иногда падаем.
туда же 
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

GoogleCodeExporter commented 9 years ago
Я пробовал - эта что-то не закрывается

Original comment by Pavel.Pimenov@gmail.com on 27 Aug 2013 at 4:51

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
Поймал падение с повреждением кучи в 
момент закрытие приложения.
даже краш сервер не сработал...

http://www.flickr.com/photos/96019675@N02/9613885333/

Пока не знаю точно причину
Слежу за дампами на краш сервере.

Original comment by Pavel.Pimenov@gmail.com on 28 Aug 2013 at 5:01

GoogleCodeExporter commented 9 years ago
В новой бетке на тестовом ноуте замер после 
старта

GDI - 1807
Memory - 294

Original comment by Pavel.Pimenov@gmail.com on 28 Aug 2013 at 5:32

Attachments:

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
>> Если выключить IRAINMAN_USE_GDI_PLUS_TAB вообще не 
собирается - позже
поправить
Агу, там не полностью бекпартировано, ибо я 
пытался портировать с переносом нового 
функционала - кнопочки закрытия и т.п, 
которого в той версии вкладок небыло, но 
это оказалось слишком, а потому отложил 
ввиду наличия более актуальных задач.

Original comment by a.rain...@gmail.com on 29 Aug 2013 at 4:37

GoogleCodeExporter commented 9 years ago
После исправлений r15135 и r15138
GDI объектов стало после старта 1655
RAM правда куда-то делась... и стало кушать 300м
Завтра посмотрю внимательней

Original comment by Pavel.Pimenov@gmail.com on 29 Aug 2013 at 6:53

Attachments:

GoogleCodeExporter commented 9 years ago
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

GoogleCodeExporter commented 9 years ago
После 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