Настраиваем Xiaomi Mi Curved Gaming Monitor под macOS

В данной статье содержится решение проблемы с некорректно отображаемыми цветами и градиентами на Xiaomi Mi Curved Gaming Monitor при подключении его к компьютерам под управлением macOS на процессорах Intel.


UPD: Данный метод не сработает, если у вас устройство с Apple M1 и M2 (ARM) процессорами. Следите за комментариями к оригинальному скрипту: https://gist.github.com/adaugherity/7435890


Спустя год владения этим монитором я наконец-то понял - при подключении его к MacBook, с цветами на экране творится что-то невообразимое. Раньше я списывал это на калибровку и особенности работы с цветовыми профилями в macOS, но сегодня наконец-то разобрался, что проблема не совсем в этом.

Если вкратце, то по сравнению с экраном макбука, монитор выдает блеклые цвета, градиенты рисуются ступеньками, в темных сценах в кино видны отчетливые артефакты сжатия. При этом в Windows и Ubuntu 18.04 таких проблем нет.

Быстрый взгляд на градиентный тест монитора (banding), показал, что градиенты отличаются на встроенном экране и на внешнем. На встроенном это была ровная полоска, на Xiaomi - "ступеньки".

Гугл быстро показал, что иногда macOS по умолчанию передает цвета в некорректном формате - YCrCb вместо RGB (насколько я понял), и в отличие от утилит по управлению видеокартами в Windows, не дает возможности это поведение поменять в графическом интерфейсе.

Поэтому необходимо пропатчить файл с настройками для вашего монитора, указав в нем нужный формат вывода цвета и все будет отлично. Но увы, если пропатчить файл с настройками имеющимся скриптом, монитор перестает работать с частотой обновления (refresh rate) больше 50 Гц.

На решение проблемы с частотой обновления у меня ушло достаточно много времени, поэтому я решил это дело записать, чтобы потом проще было воспроизвести (а может даже кому-то еще пригодится).


Итак, начинаем.

Пререквизиты:

1) Монитор подключен через кабель Type-C–HDMI
2) Цвета на мониторе отличаются от тех, что выдает другой компьютер/встроенный экран Макбука
3) Тест на banding провален

Решение проблемы:

1) Начнем с патчинга настроек монитора в macOS, скачиваем ruby-скрипт, который выставит нужный режим работы: https://gist.github.com/adaugherity/7435890

2) Делаем его запускаемым и запускаем:

chmod +x patch-edid.rb
./patch-edid.rb

На выходе получаем папку с файлом внутри. Это уже рабочий EDID, который даст вам нормальные цвета на мониторе, но мне еще нужно увеличить частоту обновления экрана.  Если вам это не нужно - переходите к шагу 8

3) Теперь достаем из полученного файла base64-encoded строку с бинарными параметрами и раскодируем ее из base64 в бинарный вид:

3.1) Открываем EDID-файл из второго шага в любом редакторе и копируем строчку, находящуюся между тегами <data></data>:

Копируем строку между тегами <data></data>

3.2) Писать полноценный скрипт было очень лень (как и искать другой выход), поэтому держите что есть:
https://gist.github.com/aseevlx/827acade76467224c3a2226ecda1ceb2

Скачиваем этот gist, делаем его исполняемым (как в шаге 2)

3.3) Вставляем в скачанный скрипт вместо фразы paste_your_base64_encoded_string_here вашу строку из EDID, скрипт сохраняем:

Пример скрипта с уже вставленной base64-encoded строкой

3.4) Запускаем скрипт и сохраняем полученные данные сразу же в файл edid.bin:

./unpack_base64_edid.rb > edid.bin

4) Скачиваем бесплатную утилиту AW EDID Editor, устанавливаем и запускаем: https://www.analogway.com/americas/products/software-tools/aw-edid-editor/

5) Загружаем наш файл edid.bin из шага 3.4 в программу, открываем вкладку Detailed Data и в Block 3 добавляем новый параметр - Preferred Timing Block.

В этом блоке нажимаем на кнопку CVT Wizard, указываем нужное разрешение и Rate (частоту обновления).

Я ввел то разрешение и частоту, которыми пользуюсь каждый день:

H util: 3440
V util: 1440
Rate: 100.00
Создаем нужное разрешение

После этого нажимаем OK и сохраняем получившийся файл в любую удобную вам папку или перезаписываем edid.bin

6) Кодируем обратно получившийся бинарный файл в base64 и копируем строку в буфер обмена (вместо path/to/file.bin укажите путь к сохраненному на предыдущем шаге файлу):

base64 path/to/file.bin | pbcopy

7) Вставляем в наш EDID файл из шага номер 2 получившуюся строку, заменяя существующую строку в атрибуте <data></data>, файл после этого сохраняем:

Должно получиться примерно так

8) Копируем папку DisplayVendorID-XXXX с итоговым файлом внутри в папку /Library/Displays/Contents/Resources/Overrides/:

sudo cp -r DisplayVendorID-XXXX /Library/Displays/Contents/Resources/Overrides/

sudo нам нужен, так как это системная папка, и обычный пользователь там не имеет прав на создание файлов

9) Переподключаем монитор (или перезагружаем ноутбук/компьютер) - вуаля, цвета должны быть в норме!

Если нужно выставить повышенную частоту обновления экрана, заходим в Настройки - Мониторы, выбираем свой монитор и переключаем разрешение на Масштабированное - Частота обновления - выбранное вами значение (у меня это 100 Гц)

Настройки частоты обновления

Источники:

Fixing the External Monitor Color Problem with Your 2018 MacBook Pro
Connect a 2018 MacBook Pro to an unsupported monitor, and the YPbPr/YCbCr color mode can cause poor display performance. I found a way to fix it by overriding the EDID back to RGB mode.
Modifying macOS Display Resolutions
Some backstory: I have a Dell U2713HM 27″ monitor that has DisplayPort, DVI-D, VGA and HDMI input. I have a dock that only outputs HDMI, so to use my MacBook Pro with the Display I must connect with HDMI. However, the Dell U2713HM can’t support its full resolution and frame