Сейчас на форуме: (+4 невидимых) |
eXeL@B —› Программирование —› Странное поведение приложения GDI |
. 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 26 декабря 2019 10:26 · Поправил: [X-Ray] · Личное сообщение · #1 Всем привет. Решил я тут написать новые спецэффекты для своих кейгенов и столкнулся с такой проблемой: Если запустить кейген после запуска винды, то графика работает медленно, как бы с тормозами. Но! Стоит открыть какое-нибудь приложение (в частности, например Telegram Desktop), то графика в кейгене начинает работать, как задумано. Такое ощущение, что сам трэд, отвечающий за отрисовку, работает на низком приоритете (смена приоритета не помогает). Для обеспечения более-менее стабильного фпс использую связку QueryPerformanceCounter + WaitForSingleObject. Проведённые замеры показывают, что до запуска Telegram Desktop цикл отрисовки работает в 2.5 раза медленнее. Подскажите, пожалуйста, в какую сторону копать? UPDATE: Да, забыл, Win10, на Win7 всё ок |
|
Создано: 26 декабря 2019 12:42 · Личное сообщение · #2 |
|
Создано: 26 декабря 2019 13:42 · Личное сообщение · #3 |
|
Создано: 26 декабря 2019 14:27 · Личное сообщение · #4 Любопытная история, но инфы маловато. Мб что-то из специфики софта\настроек ОС, дров видеокарты, или просто напросто баги кода, тут гадать остается (хотя может пользователи 10-ки и навскидку скажут "по опыту"). Можно из этой же оперы попробовать Exploit Protection > CFG > Off by Default > reboot На некоторых десятках еще в WinForms GDI объекты текут, но опять же телега это "не залечит". |
|
Создано: 26 декабря 2019 14:37 · Поправил: user99 · Личное сообщение · #5 VOLKOFF пишет: просто напросто баги кода Навряд ли. Не помню о чем конкретно шла речь (возможно о какой-то игре), там люди также сообщали, что запущенное приложение (WinAmp или какой-то проигрыватель) ускорял работу независимой проги. Но почему так происходило никто не написал. Замечал за KMP непонятное поведение: если в фоне запущена какая-либо игра (или майнер), то в нем очень медленно отрисовываются менюшки (в других программах подобных тормозов не замечал), возможно, GDI по умолчанию задействует проц, но может работать и через видюху. Но это только мысли вслух сам подобным вопросом не занимался. | Сообщение посчитали полезным: [X-Ray] |
|
Создано: 26 декабря 2019 14:49 · Личное сообщение · #6 |
|
Создано: 26 декабря 2019 14:51 · Личное сообщение · #7 |
|
Создано: 26 декабря 2019 15:09 · Личное сообщение · #8 |
|
Создано: 26 декабря 2019 15:25 · Личное сообщение · #9 |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 26 декабря 2019 15:42 · Личное сообщение · #10 |
|
Создано: 26 декабря 2019 16:54 · Личное сообщение · #11 |
|
Создано: 26 декабря 2019 16:57 · Поправил: [X-Ray] · Личное сообщение · #12 |
|
Создано: 26 декабря 2019 17:02 · Личное сообщение · #13 телеграм как и другие приложения работающие с мультимедиа, например браузеры при проигрывании видео/аудио, изменяет частоту мультимедиа таймера, отсюда у тебя и ускорение. | Сообщение посчитали полезным: [X-Ray], RamMerlabs, mak |
|
Создано: 26 декабря 2019 17:10 · Личное сообщение · #14 |
|
Создано: 26 декабря 2019 20:23 · Личное сообщение · #15 |
|
Создано: 26 декабря 2019 21:10 · Личное сообщение · #16 Не знаю, применив timeBeginPeriod / timeEndPeriod я получил нужную производительность моего софта | Сообщение посчитали полезным: ==DJ==[ZLO] |
|
Создано: 26 декабря 2019 21:42 · Личное сообщение · #17 Я когда-то сталкивался с такими тормазами. Причем на мэйн диалоге если применял спецэффекты то норм. При выносе их в другое диалоговое окно получал тормоза. (я про З.Ы. Похвастайся эффектами | Сообщение посчитали полезным: BlackCode |
|
Создано: 26 декабря 2019 21:55 · Личное сообщение · #18 |
|
Создано: 26 декабря 2019 22:58 · Личное сообщение · #19 Не смотря что обьекты гуя разные, у них общая обработка и синхронизации в ядре, а иногда даже через ipc. Сюда и нужно смотреть. А начать нужно со снятия профайла по сервисам, где оно начинает тормозить. Или в более простом случае как отличается активность апп при запуске другого. Как это сделать по простому я хз. ----- vx |
|
Создано: 27 декабря 2019 01:02 · Личное сообщение · #20 |
|
Создано: 27 декабря 2019 01:16 · Поправил: difexacaw · Личное сообщение · #21 VOLKOFF По вашей первой ссылке ошибочная инфа от студента про дос. Планировщик нт изначально вызывался при завершении любого прерывания(обратный вызов хал, нотифи в кернел), для выравнивания тайминга планирования. Всё что там измеряется - выполняется на длительностях менее кванта, так что эти измерения не корректны. На таких длительностях нужен синхрон на многопотоке и замеры по прерываниям, сбросы SEG.RPL например. Впрочем как и такая простая нтапи как NtGetPerfCount далеко уже не простая, там пару десятков таймеров железных можно выбрать. ----- vx |
|
Создано: 27 декабря 2019 01:25 · Личное сообщение · #22 |
|
Создано: 27 декабря 2019 02:52 · Поправил: VOLKOFF · Личное сообщение · #23 difexacaw пишет: По вашей первой ссылке Что вообще никак не снижает ценность обсуждения по ссылке для изучения вопроса по сабжу Вообще, чтобы не заморачиваться этой возней с таймерами стоит учитывать несколько моментов: 1. Частота прерываний таймера зависит от HAL, а не от ядра и время выполнения потока определяется интервалами таймера, однако, система не пользуется подсчетом сигналов таймера для проверки продолжительности выполнения потока и истечения его кванта времени, учет времени выполнения потока основан на тактах процессора. Потоки на самом деле запускаются не на количество квантов времени, основанное на тактах системных часов, а на время, определенное квантовой целью, которая представляет собой приблизительный подсчет количества тактовых импульсов ЦП, потребленное потоком до того, как он уступит свою очередь другому потоку. В старых осях интервальный таймер использовался для истечения кванта времени, теперь у потоков тратятся не кванты, а тактовые циклы ЦП (и поправки уже нафег не нужны). 2. Когда окно выходит на первый план в клиентской системе, все потоки в процессе, содержащем тот поток, который владеет окном первого плана,получают утроенные кванты. 3. По умолчанию мультимедийные потоки получают 80% доступного времени ЦП (меняется в реестре) Поток планирования MMCSS выполняется с приоритетом 27, поскольку службе (опять же начиная с 4. Есть еще нюансы с IO и оптимизацией задержки для более чувствительных железок, новые фичи планировщика после Win8, особенности ARM, но это уже лирика... как и ностальгия по дос и "более зеленой траве". | Сообщение посчитали полезным: GroundHog |
|
Создано: 27 декабря 2019 08:58 · Поправил: [X-Ray] · Личное сообщение · #24 В общем, если я правильно понял работу всего этого, то вот примерно такое получилось. Наверняка, избыточно, но, тем не менее, работает BlackCode, ==DJ==[ZLO] | Сообщение посчитали полезным: ==DJ==[ZLO] |
|
Создано: 27 декабря 2019 09:21 · Поправил: VOLKOFF · Личное сообщение · #25 [X-Ray] пишет: но, тем не менее, работает Ужос timeBeginPeriod/timeEndPeriod это обертки для используемых сразу же перед ними функций. При восстановлении в NtSetTimerResolution по канонам проще передавать вторым параметром 0 (тогда первый игнорится и должно восстановиться значение до предыдущего успешного вызова NtSetTimerResolution, иначе вернет STATUS_TIMER_RESOLUTION_NOT_SET) Да и просто проверить не запросил ли кто-то уже частоту 1 или максимальную (<1) было бы логично, ведь тогда все ваши вызовы априори зафейлятся (система не даст увеличивать значения таймера, оно одно для всех, кто меньшее значение попросил, то и будет стоять, пока процесс сам не откажется, или не завершиться). И само значение в НТ функцию передается не верное, оно должно быть в 100нс интервалах, те нужно еще нолик добавить Это бы автоматически фиксилось, добавь вы очевидную проверку на выход запрашиваемого вами значения из диапазона минимального и максимального поддерживающегося в системе значения разрешения таймера (результат из NtQueryTimerResolution). Alchemistry пишет: например браузеры Кстати хром на ноутах уже не жестит с этим (попинали в свое время за батарейку) и даже на десктопе без необходимости не уменьшает разрешение МТ. Про остальных не знаю. |
|
Создано: 27 декабря 2019 21:48 · Поправил: difexacaw · Личное сообщение · #26 VOLKOFF w10: KiDispatchInterrupt -> KiQuantumEnd(). Большая сложная функция, использующая кучи всяких счётчиков. TSC, TickCount, разные ранее вычисленные частоты(PerfGetCurrentFrequency etc). Хотелось бы посмотреть на реверснутую, как оно что там вычисляет. Но одно можно сказать что эти вычисления не связаны с прерываниями и таймерами. А если в реактос поискать ? Видимо квантование основано на общей загрузке как системы, так и железа, но не на каких то абсолютных таймерах. Добавлено спустя 13 минут VOLKOFF > Частота прерываний таймера зависит от HAL Планировщик вызывается при обработке любого прерывания, я же говорил, какой есчо таймер. Так было всегда с w2k. ps: можно исследовать прерывания в юм. Есть способ. Оно не нравилось очень аверам, когда профайл измеряют таким путём. 6f46_27.12.2019_EXELAB.rU.tgz - vt_swapctx_model.7z ----- vx |
|
Создано: 27 декабря 2019 23:04 · Личное сообщение · #27 difexacaw пишет: какой есчо таймер The frequency of the clock interrupts is up to the HAL, not the kernel© Я приводил прямую цитату, поэтому все упреки в полном непонимании устройства Windows перенаправьте напрямую Руссиновичу difexacaw пишет: но не на каких то абсолютных таймерах Там же написано как оно устроено (внезапно). |
|
Создано: 27 декабря 2019 23:11 · Поправил: difexacaw · Личное сообщение · #28 VOLKOFF Я больше дизу доверяю, чем какому то руссиновичу Добавлено спустя 8 минут VOLKOFF Внезапно может для вас, эти два пиарщика марк и ионеску никаким образом не значатся в сурках нт. То что первый описывает как его научили, а второй наверно уже замучался отладочные символы ковырять не означает что они понимают и говорят правду. ----- vx |
|
Создано: 28 декабря 2019 09:47 · Личное сообщение · #29 |
|
Создано: 28 декабря 2019 23:25 · Личное сообщение · #30 cppasm APIC, кто же есчо. Вектора настраиваются. Какой вектор там весит я не помню, посмотри сам если нужно. В данном случае важно что все прерывания сходятся в одном вызове планировщика. А повышение точности таймеров врядле приведёт к повышению точности планирования, во первых не ясно как система распределяет время, а во вторых нт не реалтайм ос, там не важны часики и прочий желязячный синхрон. Задача ос распределить максимально эффективно время в зависимости от загрузки задач. ----- vx |
. 1 . 2 . 3 . >> |
eXeL@B —› Программирование —› Странное поведение приложения GDI |
Эта тема закрыта. Ответы больше не принимаются. |