Ваша игра Mac, вероятно, делает размытие – случайные мысли

Проблема

Я представил вопрос, описанный в этом посте в Apple как FB13375033. Этот вопрос был открыт с сентября 2023 года.

Если вы играете на дисплее MacBook – ваша игра вероятно рендеринг неправильный, если вы не настраивали свои настройки. Если вы разработчик, создающий полноэкранную игру в Appkit (или Catalyst) – Appis у Apple есть некоторые проблемы, о которых вам нужно знать.

Когда большинство игр начинается – они спрашивают систему, какие разрешения доступны для текущего дисплея, и выбирают лучший. Приложение Mac может получить список предлагаемых выходных разрешений через Cgdisplaycopyalldisplaymodes функция Это хорошо сработало в течение десятилетий на Mac с регулярными дисплеями.

Проблема с Apple Naptops заключается в том, что у них есть ступенька в верхней части дисплея. Полная область экрана, в которой работает ваша игра, – это не то же разрешение, что и экран. Большинство игр не учитывают эту проблему. Они выводят рамки размером для всего экрана вместо области, которую они могут привлечь. Этот выход высот сжат и размыт.

Давайте начнем с того, как работает макет на загроможденном дисплее. Наденькие дисплеи Mac имеют три разных региона, о которых можно знать.

  • Полные границы дисплея. Это не явно обозначено на диаграмме выше. Но это вся область демонстрации, включая меню и области вокруг выемки.
  • Безопасная область дисплея. Это включает в себя область дисплея непосредственно под выемкой. Appkit раскрывает это свойство через NSScreen’s Safeareainsets свойство.
  • Полная область экрана, доступная для Appkit. Это отличается от безопасной областиПолем Полная область экрана простирается из -под строки меню, в то время как безопасная область простирается ниже выемки.

Если вы разработчик iOS – вы, вероятно, уже знакомы с идеей безопасной области. Но Mac добавляет третью концепцию – область приложения с полным экраном. Безопасная область – это область ниже выемки. Но полная область экрана для окна – это область под панером меню.

Read more:  эта реклама, транслируемая на Суперкубке, стоила бы больше, чем последняя игра по лицензии

Для какого региона CgdisplayCopyAlldisplayModes возвращает разрешения? Это фактически возвращает резолюции для двух регионов:

  • Резолюции для полной площади дисплея (которые недоступны для современных приложений Appkit с полным экраном.)
  • Резолюции для области под строкой меню, которые имеют отношение к полноэкранному приложениям Appkit. На моем MacBook Pro все эти решения – все 16:10.

Проблема заключается в том, что эти решения смешиваются в одном списке без встроенного способа фильтрации.

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

Вот скриншот из Shadow of the Tomb Raider. Верхний срез от разрешения, который он по умолчанию на моем Macbook Pro – 3456 x 2234. Это разрешение включает в себя выемку. Но тени на рейдере гробниц могут рисовать только ниже выемки – в области 3456 x 2160. Эта разница 74 пикселей в высоте вида создает раздавленное изображение. Нижний ломтик связан с игрой, работающей на соответствующем RES 3456 x 2160. Круг выглядит намного чище, в то время как растянутый круг вверху размыт и разбит.

NSScreen раскрывает а Safeareainsets Собственность – что кажется, что здесь должно быть полезно. Но – как мы видели на диаграмме – безопасная область все еще не такая же, как доступная область полного экрана. Таким образом, мы не можем использовать безопасную область, как есть.

Решение

Если вы играете в полном экране игры на срезанном дисплее – убедитесь, что вы выбираете разрешение 16:10. Игры, в которые вы играете, вероятно, не будут по умолчанию в правильном разрешении.

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

extension NSScreen
{
    func safeAreaResolutions() -> Array {
        let screenResolution = frame
        let safeAreaInset = safeAreaInsets
        let safeScreenResolution = CGSize(
            width: screenResolution.size.width - (safeAreaInset.left + safeAreaInset.right),
            height: screenResolution.size.height - (safeAreaInset.top + safeAreaInset.bottom)
        )
        let safeAreaAspectRadio = safeScreenResolution.width / safeScreenResolution.height
        
        let screenNumber = deviceDescription[NSDeviceDescriptionKey.init("NSScreenNumber")] as! CGDirectDisplayID
        
        guard let resolutions = CGDisplayCopyAllDisplayModes(screenNumber, nil) as? Array else
        {
            // We should never get here, the display should be valid
            fatalError()
        }
        
        return resolutions.filter { resolution in
            (CGFloat(resolution.width)/CGFloat(resolution.height)) > safeAreaAspectRadio
        }
    }
}

Этот подход имеет побочный эффект агрессивного в его фильтрации. Это теряет некоторые решения, такие как 4: 3.

Read more:  Майк Тайсон против Флойда Мэйуэзер оставляет легенду UFC в полном недоверии

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

Затронутые игры

Я уже упоминал Shadow of the Tomb Raider, но вот некоторые другие недавние релизы.

На моем MacBook Pro – 3456 x 2234 – это разрешение моего дисплея. Но 3456 x 2160 – это разрешение под строкой меню, доступной для полной игры. Это означает, что мы ищем резолюции 16:10, такие как 3456 x 2160.

Контроль Ultimate Edition

Контроль обоходит проблему, просто применив свои собственные решения. В списке есть несколько резолюций 16:10 – но ни один из них не является фактическим местным разрешением моего MacBook Pro.

Нет неба мужчины

Ни один человек не подвешивает по умолчанию раздавленное разрешение без 16:10. Выбор резолюции перечисляет как безопасную зону, так и не безопасные разрешения зоны.

РИВЕН

Ривен по умолчанию к раздаренному разрешению.

Бродить

Берег по умолчанию до 1728 x 1117 – который не 16:10 и раздавлена.

Правильные игры

Киберпанк 2077

Киберпанк по умолчанию до 1728 × 1080 – это 16:10! Не ясно, как они фильтруют список разрешений. Но максимальное разрешение составляет 3456 x 2160, что является правильным максимальным разрешением для полноэкранного приложения.

Почетное упоминание: World of Warcraft

World of Warcraft сначала выглядит неправильно. Но World of Warcraft – более старая игра, использующая полноэкранные API API Display Services Legacy CoreGraphics. Этот API на самом деле позволяет World of Warcraft втягивать на выемку. Таким образом, в этом случае разрешение 3456 × 2234 является правильным.

Что могло бы сделать Apple

Обновите HIG

Apple поддерживает Хиг для игр Включает раздел по созданию полноэкранных игр. Но эта проблема нигде не упоминается. HIG должен быть обновлен, чтобы описать проблемы вокруг выемки и как получить список разрешений.

Read more:  Советник Regina просит город рассмотреть возможность назначенного места лагеря

Обновить образцы инструментария для порта игры

Образцы Apple предоставляет о том, как переносить игру, не включают никаких примеров выбора выходных разрешений. Лучшие практики для этого должны быть включены в образцы.

Обновите CgdisplayMode

Приложения какао должны иметь возможность отфильтровать список. Я хотел бы иметь возможность увидеть только разрешения, которые имеют отношение к полноэкранному приложению какао.

Создайте новый API, ориентированный на игры

Для Apple может прийти время создать игровой центр API, который может обрабатывать шаблон, например, получение списка разрешений.

Посоветуйте разработчиков игр не запросить режимы отображения

Мне не нравится, как управление обрабатывает разрешения. Разработчик, похоже, имеет жесткий кодирование списка, который одинаков для любого Mac. И я действительно хочу иметь список резолюций, которые имеют отношение к моему дисплею.

Но они могут быть чем -то. Там нет никакого требования отображать игру в каком -либо конкретном разрешении. Приложения могут составить свой собственный список разрешений. Вы можете рассчитать список разрешений на границах вашего взгляда. Это масштабируется на любые режимы дисплея или даже оконных или полноэкранных режимов. В некоторых играх внедрили аналогичные настройки «шкалы рендеринга», которые даже не имеют списка разрешений – просто масштаб.

Если это хороший путь вперед – Apple должна обновить свой HIG и пример кода.

2025-08-14 22:11:00


1755251730
#Ваша #игра #Mac #вероятно #делает #размытие #случайные #мысли

Ещё по этой теме

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.