Производительность игры снизилась вдвое из-за зеркального отображения экрана на macOS

Когда я запускаю Portal на своем MBP без подключенного внешнего экрана, я получаю стабильные 60 кадров в секунду. Когда я подключаюсь и зеркалирую другой экран (с таким же разрешением и настройками игры), частота кадров падает до 30, иногда до 20, что очень заметно влияет на игровой процесс.

Это то же самое, независимо от того, какой порт видеовыхода я использую. Энергосбережение графики отключено.

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

  • Как реализовано зеркалирование/почему оно так сильно влияет на производительность?
  • Единственный способ получить достойную производительность в игре - это купить внешнюю клавиатуру и закрыть крышку/приклеить магнит к экрану/использовать взлом терминала?

MBP 15 дюймов, середина 2014 г.

Обновление по вертикальной синхронизации

Как правильно предположил Фонг, это связано с vsync. Без него получаю какие-то смешные 150+ фпс и хорошую отзывчивость, хотя отключать неохота из-за разрывов.

Однако до сих пор остается загадкой, как зеркалирование экрана взаимодействует с vsync и влияет на него.

Экран MBP 60 Гц, на внешний экран также поступает сигнал 60 Гц. Изменение разрешения игры не влияет на видеосигнал (всегда 1080p), но соответствие выходного разрешения и разрешения игры (например, 720p@60) по-прежнему дает аналогичные симптомы.

Ответы (2)

Мне кажется, у вас включена вертикальная синхронизация . Эта функция ограничивает частоту кадров до доли частоты обновления экрана (1, ½, ⅓…), чтобы предотвратить визуальные артефакты (в частности, «разрывы») и неуправляемую частоту кадров (которая может повредить графический процессор). Довольно хорошим показателем этого является частота кадров, которая прыгает с 30 до 60 кадров в секунду и обратно, без каких-либо промежуточных значений.

Зеркальное отображение влияет на производительность ровно настолько, чтобы частота кадров упала ниже 60 кадров в секунду. Даже если в противном случае вы получите 59 кадров в секунду, вертикальная синхронизация снизит частоту кадров до 30 кадров в секунду.

Это также может привести к задержке ввода. Поскольку ваш экран/курсор теперь перерисовывается вдвое (или втрое) реже, задержка между перемещением мыши и просмотром результата на экране будет вдвое или втрое больше.

Зайдите в настройки видео портала и отключите вертикальную синхронизацию . Я не играю в Portal, но почти в каждой игре есть такая опция. Он может называться V-Sync .

Возможно, вам придется переключиться с оконного режима на полноэкранный . Поскольку macOS принудительно использует V-Sync для основного рабочего стола, V-Sync может по-прежнему применяться при воспроизведении в окне.

Чтобы свести к минимуму неблагоприятные последствия отключения V-Sync , многие игры предлагают возможность ограничения частоты кадров. Если эта опция доступна, попробуйте установить максимум, например. 90 FPS или даже 60 FPS . Это часто предлагает лучшее из обоих миров.

Посмотрите, решит ли ваша проблема сочетание этих решений.

Если вы предпочитаете оставить V-Sync включенной, во многих играх есть возможность включить тройную буферизацию . Это поможет сгладить частоту кадров (таким образом сводя к минимуму внезапные падения частоты кадров). Его включение также может привести к увеличению задержки ввода, хотя обычно не такой серьезной, как при падении 30 кадров в секунду.

Последнее предложение — попытаться расширить рабочий стол на внешний дисплей как отдельное пространство (я полагаю, что это возможно с Yosemite и выше). Требуется ли для вашего варианта использования зеркалирование ? Я не очень знаком с этим на Mac, но я не понимаю, почему это невозможно.

Объяснение с высоты птичьего полета того, что вызывает падение частоты кадров при зеркалировании:
при зеркалировании ваш Mac должен отображать один и тот же кадр на внутреннем и внешнем дисплеях. В дополнение к тому, что ваши дисплеи будут ждать друг друга, это требует дополнительной «работы», включая дополнительное вычислительное время и управление буфером (чтобы убедиться, что они отображают одно и то же в одно и то же время), а также задержку туда и обратно. по внешнему кабелю или, что еще хуже, по Wi-Fi/Bluetooth.

Пока это происходит, ваш GPU рендерит следующий кадр в своем внутреннем буфере, но не отправляет его на ваш дисплей, пока не получит OK (из-за V-Sync ). В течение этого периода ожидания ваш графический процессор фактически приостанавливается, не отображая дополнительные кадры (если не доступна тройная или N-буферизация), что еще больше снижает частоту кадров. Затем, в зависимости от того, где в цикле обновления находится самый медленный дисплей, отображение следующего кадра может быть снова отложено до следующей доли.

Вы должны иметь в виду, что для рендеринга вашей игры со скоростью 60 FPS у вашей графической подсистемы есть только 33 мс для выполнения всей этой дополнительной работы (за вычетом времени, необходимого графическому процессору для рендеринга этих кадров в первую очередь). Обратный путь к вашему внешнему дисплею и обратно может занять пару миллисекунд. Работа по синхронизации сама по себе является дорогостоящей (с точки зрения времени). Не исключено, что синхронизация двух дисплеев занимает более 20 или 30 миллисекунд.

Теперь, в предыдущем абзаце я предполагал, что ваш графический процессор был готов к следующему кадру к тому времени, когда ваши дисплеи закончили отрисовку текущего. Представьте, что этого не было. Что ж, теперь дисплеи голодают, и в конечном итоге они ждут на GPU. Вы, вероятно, в конечном итоге перейдете к следующей части самой низкой частоты обновления. Что может означать, что падение V-Sync на 1-2 кадра в секунду при выключенном режиме превращается в 30 кадров в секунду при включенном .

Итак, вы пытаетесь синхронизировать два дисплея (через Mirroring ), а затем пытаетесь синхронизировать ТЕ с вашим GPU (через V-Sync ). Результатом является потенциально много-много-много ожиданий.

Нередко наблюдается некоторое снижение производительности при подключении подсистем с разными уровнями производительности. Вот почему были созданы буферы и асинхронные операции.

При синхронизации задержка в любом месте вызывает задержку везде.

Чтобы максимизировать производительность, лучше всего позволить каждому выполнять свою работу в свое время.

Спасибо за Ваш ответ. Что касается зеркалирования, я полагаю, вы говорите, что оно ограничивает частоту кадров частотой самого медленного видеосигнала? Это хорошее наблюдение. Но я все еще удивлен, что мышь кажется вялой и что она падает до <30 кадров в секунду в ситуациях, когда на одном мониторе было бы 60 кадров в секунду.
Каждое перерисовывание курсора может быть отложено до следующего обновления кадра, которое будет в два раза дольше, чем раньше (я не уверен в этом, но это объясняет медлительность ввода). Я бы посоветовал попробовать отключить V-Sync, а затем посмотреть, сохраняются ли какие-либо связанные с этим проблемы после восстановления частоты кадров. Обратите внимание, что при включенной V-Sync все, что снижает частоту кадров ниже 60 кадров в секунду, автоматически снизит ее до 30, даже если в противном случае частота кадров была бы 59.
Я проверил это и обновил вопрос. Я имел в виду mouselook (без реального курсора в игре). Мне все еще трудно понять, как зеркальное отображение экрана в сочетании с вертикальной синхронизацией снижает производительность с двумя сигналами 60 Гц, а не с одним.
Хорошая информация, спасибо. Что касается оконного режима, он не предотвращает разрыв экрана (что, я полагаю, ожидается, поскольку он, вероятно, будет работать очень медленно, если рендеринг пойдет в обход через оконный менеджер).
Верно, воспроизведение в полноэкранном режиме включало бы только V-Sync (если бы macOS не мешала этому). Что касается взгляда с помощью мыши, здесь та же самая идея: поскольку существует более длительная задержка при отрисовке следующего кадра, результат вашего действия с мышью также задерживается.
Ваша теория звучит разумно. Интересный предмет. Мой вариант использования не требует зеркалирования, это был самый близкий к минимуму расход ресурсов, который я мог получить. К сожалению, сделать расширенный рабочий стол не получилось, так как курсор застревает вне игры (до TBH не пробовал, потому что почти всегда возникают такие проблемы с фокусировкой).

Сокращение некоторой информации о том, что сработало в конце:

  • Вертикальная синхронизация включена
  • Отдельные рабочие столы на каждом мониторе
  • Переместите главный рабочий стол (строка меню в настройках экрана macOS) на экран, на котором вы хотите играть. Portal может выбрать монитор в игре, но macOS все равно испортит курсор, если вы не играете на главном экране, поэтому эта опция бесполезна.
  • Уменьшите яркость другого экрана.

То же самое и с Portal 2. В отличие от первой игры, она также поддерживает тройную буферизацию.

Использование таких приложений, как DisableMonitor, только усложняет ситуацию. Каким-то образом вы получаете систему координат отключенного монитора (и фон рабочего стола), наложенную на включенную, в результате чего курсоры появляются там, где их нет. Похоже, что разработчик принял меры предосторожности, судя по этой строке: CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID), но это, похоже, не работает — по крайней мере, не в macOS sierra.