Почему мое приложение / игра Windows ограничено 30FPS при работе на Intel GPU? - PullRequest
0 голосов
/ 23 октября 2018

Я работаю над полноэкранным настольным приложением Windows, которое требует умеренной графики, использует OpenGL, но отображает только 2D-контент.Ничего особенного, в основном вывод пикселей на экран (до 4К, один монитор) и загрузка текстур.Мы используем VSync для управления частотой кадров рендеринга, т.е.вызов SwapBuffers () в конце рендеринга для блокировки до следующего VBlank.

Основное требование, которое у нас есть, заключается в том, чтобы приложение работало со скоростью 60FPS, поскольку оно используется с сенсорным экраном, и взаимодействие должно быть максимально плавным.

Поскольку приложение довольно простое, приложениеотлично работает на процессоре Intel i7 8-го поколения со встроенным графическим процессором Intel HD Graphics 630.Ни CPU, ни GPU не достигают пиковой нагрузки, и мы видим, что мы показываем комфортные 60FPS через наш индикатор FPS в приложении.Он также работает с аналогичными результатами на моей Surface Book 2 с Intel i7 и интегрированным графическим процессором Intel UHD Graphics 620.

Однако недавно я заметил, что приложение иногда начинает падать до 30FPS, а затемпребывание там или в течение длительных периодов времени или иногда даже навсегда.С помощью нашего счетчика FPS я могу сказать, что на самом деле мы не тратим время на рендеринг, а просто наш вызов SwapBuffers (), который произвольно блокируется на 2 кадра, ограничивая нас 30FPS.Единственный способ вернуться к 60FPS - это нажать alt-tab с другим приложением и вернуться к нашему, или просто открыть меню Windows, а затем вернуться в приложение.

Из-за того, что приложение впоследствии возвращается к 60FPSЯ уверен, что это намеренное поведение драйвера Intel, вероятно, предназначенное для игр (геймеры предпочитают стабильные 30FPS, а не нерегулярные / случайные пропущенные кадры, которые делают игру нестабильной).

Однако в нашемВ этом случае исключение случайного кадра не имеет большого значения, однако ограничение 30 кадров в секунду делает наш пользовательский интерфейс и взаимодействие гораздо менее приятным для глаз, особенно когда вместо этого он может легко рендериться со скоростью 60 кадров в секунду.

Есть лиМожно ли как-то изменить поведение водителя, предпочитая толкать 60FPS со случайными падениями, а не ограничивать скорость 30FPS?

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Вот ответ на основе реестра, если ваш драйвер не предоставляет панель управления Intel HD (например, драйвер, используемый в Surface Book и, возможно, других ноутбуках Surface), или если вы хотите сделать это исправление программно через regedit.exe или Win32 API:

Профили приложений, созданные панелью управления Intel HD, сохраняются в реестре в HKCU\Software\Intel\Display\igfxcui\3D с использованием ключа с именем файла процесса (например, my_game.exe) и значением REG_BINARY.с 536-байтовым блоком данных, разделенным так:

  • Байт 0-3: Анизотропная фильтрация (0 = использовать приложение по умолчанию, 2-10 = настройка множителя)
  • Байт 47: вертикальная синхронизация (0 = использовать приложение по умолчанию, 1 = использовать драйвер)
  • Байт 8-11: MSAA (0 = использовать приложение по умолчанию, 1 = отключить)
  • Байт 12-15: CMAA (0 = использовать приложение по умолчанию, 1 = переопределить, 2 = улучшить)
  • Байт 16-535: отображаемое имя приложения (широкие символы, для использования в списке приложений панели управления)

Примечание: все значения хранятся в младшем порядке

Кроме того, вам нужно убедиться, что значение Global в том же ключе имеет первый байт, установленный в 1, что является своего рода глобальным переключением (панель управления устанавливает его в 1, когда одна или несколько записейдобавляются в список приложений, а затем обнуляются при удалении последней записи из списка).

Формат значения также является значением REG_BINARY с 8 байтами, закодированными следующим образом:

  • Байт 0-3: глобальный переключатель для записей приложения (0 = нет записей, 1 = записи)
  • Байт 4-7: оптимальный для приложения режим (0 = включен, 1 = отключен)

Например:

enter image description here

0 голосов
/ 23 октября 2018

Хорошо, так что я смог разобраться с этим, немного подправив и перепроектировав: Ответ таков: да, это намеренное, но неудачное поведение по умолчанию для драйвера Intel, и его можно исправить с помощью Intel HD.Приложение панели управления графикой, если оно доступно, или непосредственно в реестре (в противном случае это единственный способ устранить проблему на Surface Book и других устройствах Surface, где пользовательский драйвер Intel больше не представляет приложение Intel HD Graphics Control Panel).

Начиная с простого решения: в приложении Intel HD Graphics Control Panel перейдите в «3D», затем «Настройки приложения».Сначала вам нужно будет создать профиль приложения, выбрав файл на диске для процесса, который создает окно OpenGL.Как только это будет сделано, настройкой, которую вы хотите настроить, будет «Вертикальная синхронизация».По умолчанию выбрано «Использовать настройки приложения по умолчанию».Это настройка, которая вызывает ограничение на 30FPS.Выберите «Использовать настройки драйвера» вместо этого, чтобы отключить это поведение и всегда нацеливаться на 60FPS:

Intel HD Graphics Control Panel screenshot

Это должно было быть довольно очевидно, если бы не былоза ужасный выбор Intel терминов и непонятной документации.Мне кажется, что выбор настроек инвертирован: я ожидаю, что ограничение будет происходить, когда я выберу «Использовать настройки драйвера», что подразумевает, что драйвер свободен регулировать замену буфера по своему усмотрению.Точно так же «Использовать настройки приложения по умолчанию» подразумевает, что приложение решает, когда нажимать кадры, что в точности противоположно тому, что делает настройка.Даже маленькие всплывающие подсказки в приложении, кажется, противоречат тому, что делают эти настройки ...

ps: я опубликую решение на основе реестра в отдельном ответе, чтобы оно было коротким

...