IPB

Добро пожаловать, гость ( Вход | Регистрация )

> Display default refresh rate (Windows XP), частота обновления монитора под разрешение
-=CHE@TER=-
Jan 2 2015, 17:57
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Расскажу я вам грустную историю, но со счастливым концом.

Лет 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 будет нерабочая).
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 24th April 2024 - 11:39