Display default refresh rate (Windows XP), частота обновления монитора под разрешение |
Добро пожаловать, гость ( Вход | Регистрация )
Display default refresh rate (Windows XP), частота обновления монитора под разрешение |
-=CHE@TER=- |
Jan 2 2015, 17:57
Сообщение
#1
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Расскажу я вам грустную историю, но со счастливым концом.
Лет 5 назад купил я Samsung SyncMaster 931c (это LCD-монитор) вместо своего старого CRT-монитора CTX'99 (точную модель не помню), который вдруг начинал показывать фиолетовые полосы на экране. Всё было отлично с SyncMaster 931c, но в разрешениях 320x200 и 640x400 монитор отключался и выдавал табличку, что выбранное разрешение и/или частота не поддерживаются. И если, скажем, для D3D игры это можно было как-то забодать через настройки nVIDIA (там можно задать произвольную частоту обновления экрана), то для приложений использующих ChangeDisplaySettings() это была труба (практически все приложения использующие SDL - например, DOSBox). Т.е. выходов было три: - менять разрешение программы (если можно было); - работать в оконном режиме (если программа поддерживала оконный режим); - ломать программу, чтобы выставлялось другое разрешение (например 640x480). Эти два разрешения требовались нечасто, так что головняка особого с ними не было, но сегодня я понял, что меня это уже бесит. Тогда я решил таки забороть эту проблему и разбил её на две подзадачи: 1) Разобраться есть ли хоть какая-то частота развёртки с которой монитор работает в указанных разрешениях. 2) Разобраться можно ли как-то указать в системе какую частоту развёртки использовать, если приложение не указало свою. Для решения первой подзадачи написал я небольшую программку, где при помощи уже упомянутой ChangeDisplaySettings() и флага DM_DISPLAYFREQUENCY (там было ещё три - ширина, высота и BPP) начал перебирать все частоты от 60 до 100 при разрешении 640x400 и 32 битах (битность, на самом деле, не так уж и важна). На удивление оказалось что монитор работает в этих режимах (320x200 и 640x400) при 70 Hz, в то время как в остальных - и на 60 Hz без проблем (которое, к слову, по умолчанию и выставлялось). Отлично! Переходим ко второй подзадаче. Тут мне пришлось изрядно нагуглиться, т.к. что именно мне нужно я толком не знал - сделал только предположение, что это какая-то настройка в реестре. И, на удивление, таки нашлось это и это. Приведу пошаговую инструкцию с примерами для тех, кто решился повторить подвиг. Внимание! Здесь и далее параметры выделенные жирным будут специфичны для каждого отдельного компьютера, а тут они приведены для примера! 1) Лезем в ветку: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY Далее находим там свой монитор - у меня это был "SAMSUNG" - раскрываем ветку и там будет несколько параметров. У меня их было 4 штуки, так что я выбрал последний и щёлкнул на нём. 2) Внутри нас интересует строчка "Driver" равная некоему GUID'у. У меня там было: "Driver"="{01234567-89AB-CDEF-0123-456789ABCDEF}\0003" Записываем куда-нибудь эту строчку. 3) Далее лезем сюда: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class После чего находим значение из "Driver" п.2 и раскрываем его, затем создаём там подраздел "MODES", а внутри него ещё один подраздел "640,400". В итоге должно получиться что-то типа: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{01234567-89AB-CDEF-0123-456789ABCDEF}\0003\MODES\640,400 Создаём там текстовый параметр "Mode1", куда вписываем диапазоны разрешённых частот обновления (т.к. нам известна только нижняя - 70, то ей и ограничиваем): "Mode1"="70-70,70-70,+,+" 4) Проделываем тоже самое для 320x200 в том же подразделе "MODES". 5) Готово - всё будет работать, даже перегружаться не нужно. Если не сработало - значит в п.1 был выбран не тот монитор (ветка GUID в п.3 будет нерабочая). |
Упрощённая версия | Сейчас: 15th November 2024 - 07:59 |