1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Патч Windows 7 для включения графического ускорения в классической теме

Тема в разделе "WASM.SOFTWARE", создана пользователем rk2019, 11 фев 2019.

  1. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    == Патч Windows 7 для включения GPU ускорения в классической теме ==

    Пролог:
    Посвящено всем, кто привык работать в системе с классическим оформлением окон. Остальные, кто пользуются Windows 10 и спокойно работают в планшетозаточенном, вырвиглазном интерфейсе, упрощенном до уровня домохозяйки - вам эти проблемы не интересны, эта тема не для вас. Уйдите сразу и не провоцируйте меня на оскорбления.

    Описание проблемы:
    Графическое ускорение в Windows 7 используется только в аэро-темах и выключено в базовых темах, в том числе классической. Поэтому в все элементы интерфейса в аэро теме - прорисовываются с помощью видеокарты, а в классической теме - центральным процессором. При наличии нормальной видеокарты (новее 2010 года) аэро темы работают гораздо производительнее базовых тем (в том числе классической), что вызывает удивление, поскольку графически сложные темы отрисовываются быстрее примитивно простых. Классическая тема только в Windows 98/2000/XP работала быстро, а в Windows 7 - это угрюмый тормоз. Для устанения этой проблемы существует аналог классической темы (по виду), но в виде аэро-темы (по свойствам) - она использует ресурсы видеокарты и работает в разы быстрее встроенной классики.

    Усугубляет проблему, что некоторые разработчики драйверов, например AMD, наплевательски относятся к реализации 2D GDI функций в Radeon драйверах новее 2014 года, что ещё более замедляет работу классической темы. Читаем здесь - Низкая 2D GDI производительность новых АМД видеокарт

    Но в других производителей (NVidia, Intel) дела хоть и лучше, но не намного... Приведённые глюки в Видеодемонстрация сравнения тем. 1-я часть видео на примере отрисовки интерфейса в программах:
    - Performance Test 8.0 (перемигивание при перемещении по результатам)
    - NetMonitor - https://2ip.ru/download/NetMonitor.exe (мигание окном 2 раза в секунду)
    - Диспетчер задач (глюки отрисовки столбика загрузки ЦП)
    есть на всех видеокартах у всех пользователей и причина этому - установленный драйвер на видеокарту. После удаления драйвера, то есть на "Стандартном адаптере VGA" - этих проблем нет. Абсурд! Но так и есть, проверьте сами.

    Варианты решения:
    1) Использовать Классическая тема в аэро-исполнении "Classic AE mod 2019_1" от 08.02.2019 г. Насколько эта тема более производительна продемонстрировано в - Видеодемонстрация сравнения тем
    2) Найти и пропатчить Винду, чтобы включить ускорение (например использовать какие-то файлы с Windows 8)
    3) Написать фоновую программу, которая переводит работу ОС в режим, когда графика ускоряется
    4) Написать драйвер "двойной буферизации" видеовывода

    Осуществлимо ли это?
    Я думаю да. Я видел, много раз, как после запуска чего-то видеовывод в классической теме ускорялся. Я не могу понять причину этого феномена, но в реальности так происходит... Мне не важно, через какую баг/фичу это реализуется, я вижу факт - в определённых условиях классика становится более производительной и это нужно использовать.

    Реальные примеры ускорения видеовывода в классической теме:

    Примеры 1, 2, 3, 6 - для видеокарт любого производителя (NVidia, Intel, AMD).
    Примеры 4, 5 - только для видеокарт AMD.

    1) Запускаем NetMonitor - https://2ip.ru/download/NetMonitor.exe (окно 2 раза в секунду мигует). Берем за заголовок окна и начинаем его медленно возить по экрану. Происходит чудо, мигания убираются. То есть Винда может отрисовывать окно без багов, но почему на неподвижном окне она этого не делает. Давайте сделаем какую то прогу, которая работает в фоне и дрючит размер окна на 1 пиксель. Главное чтобы это ускоряло видеовывод и не было незаметным для пользователя.

    2) Запускаем встроенный "Диспетчер задач" - столбик загрузки ЦП передергивается, когда нет нет нагрузки, либо она постоянна - то есть когда графика не перерисовывается - она начинает лагать.

    3) Запускаем Performance Test 8.0 ( наблюдаем перемигивание при перемещении по результатам). Удаляем драйвер на видеокарту - перемигивание убирается. Видимо "Стандартный адаптер VGA" использует двойную буфферизацию, которую не используют драйвера от вендоров. Но почему система с драйвером должна работать медленнее, чем без драйвера. Нафиг такие дрова...

    4) Увеличение 2D производительности из ничего. Оказалось, если под окном спектра расположить окно "Radeon Settings", чтобы хоть 1мм окна выступал за пределы окна спектра - то отрисовка спектра ускоряется в десятки раз и FPS в simpleGLUT повышается с 40-60 до 1100-1300. Видеодемонстрация -
    Видимо отрисовка окна "Radeon Settings" задействует какие-то функции видеокарты, которые параллельно заставляют работать быстро весь интерфейс.

    5) При масштабировании размеров окна. Вообще не понятно, масштабируемое окно должно тормозить, а оно наоборот ускоряется. Глюки, которые видны на экране - их нет при завате экрана программой bandicam. Видеозаписи смотреть нужно обе, по-очереди.
    С фотоаппарата -
    С bandicam -

    6) Есть рецепты, когда картинка ускоряется после запуска в фоне аудио или видеопроигрывателя, который просто переводит мультимедиа таймер в определенный режим, что тоже ускоряет видеовывод

    Постановка задачи
    Вообщем нужны любые мысли (патче файлов ОС, создании фоновой программы, драйвере двойной буферизации) - не важно что это будет и как реализовано, важно чтобы это заставляло ОС работать быстрее в классическом оформлении.
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.113
    Адрес:
    Russia
    Здравствуйте.
    Во первых я бы убрал агрессивный настрой в начале вашей повести. Это лишнее
    Во вторых - ускорение при масштабировании - это не ускорение. Спешу вас огорчить - это просто дроп кадров.

    2д режим придуман, чтоб работать на видеокартах без поддержки 3д. С точки зрения архитектуры винды - это два сильно различающихся режима. А с точки зрения АМД драйверов - тем более. В 2д режиме, амд драйвера получают только команды нарисовать что-то, уже срендеренное на CPU в буфер. Все .

    Мысли - вы можете сделать некий миррор драйвер который будет принимать GDI колы и транслировать их в DXGK вызовы. Но я не уверен, что вам одному это под силу. Но можете попробовать . Начните с изучения WDDM. Забудьте про патчи.
     
  3. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    TermoSINteZ,

    Спасибо за ответ. Разработчики Майкрософта думали так:
    - слабая видеокарта и слабый ПК - используешь классическое оформление
    - мощная видеокарта и мощный комп - используешь аэро-оформление

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

    К сожалению, интерфейс в 2D отрисовывется гораздо медленнее чем в аэро. Вот сегодня сделал сравнение - показываются глюки встроенной классической темы. Но на Classic AE mod 2019_1 - никаких проблем. Глюки будут видны на всех видеокартах (а не только АМД), можете перепроверить у себя.
     
  4. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    И вот этот день настал! 23 февраля 2019 года - просто прорыв в исследовании глюков на классической теме Windows 7.

    Запоминаем ник прекрасного специалиста rmn и молимся за его здоровье!!! Именно он подтвердил мои предположения, к которым я шел 2 долгих года - глюки классической темы Windows 7 и 2D глюки АМД драйверов - это отсутствие двойной буферизации видеовывода.

    Именно rmn предложил способ засылать в открытое окно стиль WS_EX_COMPOSITED делается это функциями
    Код (Text):
    1.   DWORD style;
    2.   style = (DWORD)GetWindowLong (hwnd, GWL_EXSTYLE);
    3.   SetWindowLong (hwnd, GWL_EXSTYLE, style | WS_EX_COMPOSITED);
    после чего данное окно приобретает некое "свойство", что на нем принудительно включается двойная буферизация - и оно отрисовывается в классической теме также быстро, как и аэро-теме.

    Я уже проверил это спектре foobar2000 - и впервые за 2 года увидел нелагающий спектр. Программа "2D Test" моего помощника Михалыча, тоже начала отрисовываться гораздо быстрее (время отрисовки сетки уменьшилось с 50-70 мс до 3-4 мс) и пропали остановки при совместной отрисовке с фубаром.

    Прослявляем имя гениального специалиста rmn. Его идея сработала. Остальное - нужно реализовать программу, которая будет циклически опрашивать все открытые окна и выдавать им магическое свойство WS_EX_COMPOSITED.
     
  5. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    4.608
    rk2019, с точки зрения мокрых, ты еретик и они уже принимают меры, дабы така скверна не омрачала сий прекрасный Мир :) кстати, а чем тебе не зашла вынь 10 лтсб == вполне себе классика без кортавой да прочих гадостей + отключаешь её от прямого доступа к сети и совсем хорошо :)
     
  6. sty

    sty Member

    Публикаций:
    0
    Регистрация:
    2 фев 2019
    Сообщения:
    105
    Так он же, вроде, на exelab'е? Или у нас он тоже есть? rmn, вы где? Форум должен знать своих героев. :)
     
  7. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    Да. Оттуда.

    ========

    Метод с WS_EX_COMPOSITED делает главное - показывает, что ускорить видеовывод в классической теме реально.

    Стали лучше работать:

    1) foobar2000 - спектр полностью перестал мигать
    2) Total Commander - перестали мигать текстовые метки
    3) PerformanceTest - перестали мигать поля
    4) Перестал мигать столбик загрузки ЦП в "Диспетчере задач", но появилась другая проблема (читай ниже)
    5) 2D Test - отрисовка ускоряется в 15 раз, пропадают глюки при одновременной отрисовке с фубаром

    Но и вызывает проблемы, например:
    1) Появляются глюки при переключении по закладкам "Диспетчера задач"
    2) TCPMonitor начинает глючить, картинка в окне бесконечно накладывается при перемещении окна и не обновляется
    3) NetMonitor - вообще перестает работать, показывая белое поле
    4) Глючат почти все виндовские окна - например "Службы", "Мой компьютер", "Корзина"

    Вообщем, нужно ещё думать почему так происходит. Каким образом одни окна отличаются от других и засылать команду WS_EX_COMPOSITED не всем окнам, а избранным.

    Как понять какими свойствами одни окна отличаются от других, почему такая разная реакция?
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.113
    Адрес:
    Russia
    Скорее всего дело в способе и частоте обновлений. Попробуйте написать экспериментальное приложение с разными контролами и с изменением по таймеру перерисовки. И посмотрите зависимость.
    Не все же время пользоваться трудами rmn, надо и самим что-то делать, а не только наблюдать.

    Но это если это вам надо. Лично я бы не стал на это тратить свое время .
     
  9. cmdprompt

    cmdprompt New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2009
    Сообщения:
    7
    Предлагаю покопать в сторону GetClassLong(hWnd, GCL_STYLE) и посмотреть каковы атрибуты у классов глючащих окон. Вангую что-то связанно с CS_SAVEBITS
     
    Последнее редактирование: 24 фев 2019
  10. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    Мой советник Михалыч, кинул ссылку на такую статью - https://blogs.msdn.microsoft.com/oldnewthing/20171018-00/?p=97245

    Вообщем свойство WS_EX_COMPOSITED нужно включать только для "избранных" окон.
    Можно ли каким-то софтом посмотреть свойства окон в разных запущенных приложениях, чтобы найти признак, чем одни отличаются от других?

    Если есть какие решения - то пожалуйста высказывайте их куском кода - будем проверять.
    В данное время использовался такой код.
    Код (C):
    1. // Патч глюков классической темы Windows 7
    2.  
    3. #include <windows.h>
    4. #define WS_EX_COMPOSITED 0x02000000L
    5.  
    6. static BOOL WINAPI EnumProc (HWND hwnd, LPARAM param)
    7. {
    8.          DWORD style;
    9.  
    10.          style = (DWORD)GetWindowLong (hwnd, GWL_EXSTYLE);
    11.          SetWindowLong (hwnd, GWL_EXSTYLE, style | WS_EX_COMPOSITED);
    12.  
    13.          return TRUE;
    14. }
    15.  
    16. void BoostWindows (void)
    17. {
    18.        EnumWindows (EnumProc, 0l);
    19. }
    20.  
    21. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nShowCmd)
    22. {
    23.          BoostWindows ();
    24.          return 0;
    25. }
     
  11. Aiks

    Aiks Member

    Публикаций:
    0
    Регистрация:
    16 апр 2017
    Сообщения:
    35
    Адрес:
    Украина
    Тебе уже вчера на exelab скинули название утилиты, которой можно смотреть информацию по окнам. AutoIt Window Info.
     
  12. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    Уже установил.
    На какие свойства нужно обращать внимание?? Куда смотреть то?
     
  13. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    1
    Регистрация:
    11 июн 2004
    Сообщения:
    3.113
    Адрес:
    Russia
    rk2019, вопрос к вам встречный. Вы программист?
     
  14. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    TermoSINteZ,

    Нет. Я не программист.

    ======

    1) Окно спектра Foobar2000
    >>>> Window <<<<
    Title: Спектр
    Class: {483DF8E3-09E3-40d2-BEB8-67284CE3559F}
    Position: 0, 34
    Size: 1070, 817
    Style: 0x96CC0000
    ExStyle: 0x00010101
    Handle: 0x00030244

    Результат - после применения патча вывод спектра ускоряется, побочных проблем - не выявлено

    2) Программа Neutron
    >>>> Window <<<<
    Title: Neutron 1.07 http://keir.net
    Class: Neutron
    Position: 432, 39
    Size: 285, 173
    Style: 0x94CA08C4
    ExStyle: 0x00010101
    Handle: 0x00030168

    Результат - после применения патча текстовая метка более не подмигивает, побочных проблем - не выявлено

    3) Диспетчер задач
    >>>> Window <<<<
    Title: Диспетчер задач Windows
    Class: #32770
    Position: 370, 124
    Size: 734, 764
    Style: 0x96CF004C
    ExStyle: 0x00010100
    Handle: 0x0004026E

    Результат - после применения патча "Столбик загрузки ЦП" уже не дергается, но появляются проблемы с глючной отрисовкой окна, которых не было до патча

    Вопрос:
    Ну и как быть, например с Диспетчером задач, когда решается одна проблема, но появляется другая.

    Может нужно стиль WS_EX_COMPOSITED засылать на в само окно, а на какой-то элемент окна, например столбик или кнопку? Или использовать другой стиль, который тоже принудительно включает двойную буферизацию, но не имеет проблем, которые вызывает WS_EX_COMPOSITED ???
    --- Сообщение объединено, 24 фев 2019 ---
    Я не понял как решать проблему дальше... Ну например, есть "Диспетчер задач" и он глючит столбиком загрузки ЦП и текстовыми метками. Его окно имеет стиль Style: 0x96CF004C и ExStyle: 0x00010100. Мы засылаем этому окну вдобавок WS_EX_COMPOSITED и проблемы подмигивания решаются, но появляются другие проблемы, которых вначале и не было!!!

    Выходит мы ему не должны засылать WS_EX_COMPOSITED.... Но тогда же не решится проблема с мигающим столбиком ЦП.... Зашли в тупик. Как быть??
     
  15. cmdprompt

    cmdprompt New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2009
    Сообщения:
    7
    Сейчас компа нет под рукой, но я пользовался прогой Spy&Capture, она умеет показывать не только имя класса и стиль окна, а так же стиль класса окна, что может помочь при отсеивании "неправильных" окон.
    В ссылке с екселаба увидел в одном из постов, что всему виной стиль класса CS_OWNDC. Попробуйте переписать код, что бы он проверял присутствие этого стиля в классе окна при помощи GetClassLong и пропускал такие окна или снимал этот атрибут при помощи SetClassLong.
    Код (C):
    1. static BOOL WINAPI EnumProc (HWND hwnd, LPARAM param)
    2. {
    3.        DWORD style;
    4.  
    5.        If (!(DWORD)GetClassLong(hwnd, GCL_STYLE) | CS_OWNDC)
    6.        {
    7.               style = (DWORD)GetWindowLong (hwnd, GWL_EXSTYLE);
    8.               SetWindowLong (hwnd, GWL_EXSTYLE, style | WS_EX_COMPOSITED);
    9.        }
    10.        return TRUE;
    11. }
    Ошибся, давно на си не кодил)
    If (!(DWORD)GetClassLong(hwnd, GCL_STYLE) & CS_OWNDC)
     
  16. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    cmdprompt,

    Спасибо, обязательно вашу мысль проверю!
    Если будут ещё - подбрасывайте!
     
  17. Minzdrav

    Minzdrav Well-Known Member

    Публикаций:
    0
    Регистрация:
    21 мар 2017
    Сообщения:
    1.098
    Нифига крутой пацан в семёрке работает...
    А xp слабо запилить!!??
     
  18. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    Minzdrav,

    С превеликим удовольствием использовал бы ХП и дальше, вот только нет драйверов под новые чипсеты. А без дров не работает USB. На всё остальное драйвера в принципе нашлись.


    cmdprompt,
    Проверьте ещё раз код, что-то стиль вообще ни в одно окно не засылается.
    Всё ли так я сделал?
    Код (C):
    1. // Патч глюков классической темы Windows 7
    2.  
    3. #include <windows.h>
    4. #define WS_EX_COMPOSITED 0x02000000L
    5.  
    6. static BOOL WINAPI EnumProc (HWND hwnd, LPARAM param)
    7. {
    8.          DWORD style;
    9.           if (!(DWORD)GetClassLong(hwnd, GCL_STYLE) & CS_OWNDC)
    10.           {
    11.                 style = (DWORD)GetWindowLong (hwnd, GWL_EXSTYLE);
    12.                 SetWindowLong (hwnd, GWL_EXSTYLE, style | WS_EX_COMPOSITED);
    13.           }
    14.          return TRUE;
    15. }
    16. void BoostWindows (void)
    17. {
    18.          EnumWindows (EnumProc, 0l);
    19. }
    20. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nShowCmd)
    21. {
    22.          BoostWindows ();
    23.          return 0;
    24. }
     
  19. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    4.608
    хрюнь сейчас ток на легаси тачках пашет иль под виртой, да и 7ке недолго осталось.
    rk2019, вообще, для начала глянь сюды http://windows7themes.net/en-us/top-30-windows-7-themes-clean-visual-styles/ иль у тебя хобби такое?:) довольно любопытно, что из всех трабл 7ки тебя задели лишь окошки :)
    --- Сообщение объединено, 25 фев 2019 ---
    это что у тебя за тачка, если там хрюню даже поставить можно???:crazy::scratch_one-s_head:
     
  20. rk2019

    rk2019 Member

    Публикаций:
    0
    Регистрация:
    11 фев 2019
    Сообщения:
    41
    Темы мне не надо - спустя 1,5 года классическую тему в аэро исполнении я слепил... ни разу не будучи темоделом - вот она https://exelab.ru/f/index.php?action=vthread&forum=3&topic=25595

    Сейчас интересует решение возврата нормальной производительности на встроенной классике. ХР можно поставить на любой новый ПК, но 100 % не будет работать USB.

    У меня матенинка на чипсете Н110М, память DDR4, процессор i5-6500. ХР встала после отката BIOS|UEFI на старую версию, а также после интеграции AHCI драйверов в дистрибутив ХР. На реалтековскую сеть и звук найти дрова не проблема. Одна проблема на 100, 200, 300-серии интеловских чипсетов нет дров на USB.