Перейти к содержимому

Unity как ограничить fps

  • автор:

Очень высокий fps в UNITY 19.3.0

введите сюда описание изображения

Подскажите пожалуйста, скачал UNITY 2019.3.0 и при запуске проэкта в UNITY, fps очень высокий, а при запуске на телефоне все как обычно. Можно ли как то установить fps лимит в UNITY, или почему такой аномальный fps?

Отслеживать
задан 11 фев 2020 в 20:58
1 2 2 бронзовых знака

Ну например потому что сцена несложная и видеокарта хорошая? Не такой уж и аномальный fps, мой старенький ноутбук тоже несколько тысяч кадров выдаёт, если графику по минимуму выкрутить

11 фев 2020 в 21:24

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

11 фев 2020 в 21:48

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

– user302909
11 фев 2020 в 22:03

И окно Stats показывает примерный fps, это ни в коем случае не равносильно действительно «правильному» fps в билде.

– user302909
11 фев 2020 в 22:03

запустил более старую версию unity 2019.2.2 и fps в ней 70 и никак не за 1к. Просто при таком fps, объекты двигаются намного быстрее, а это проблема, так как при переносе на устройство все совсем не так и никаким fps в 1к и не пахнет

Ограничение fps для игры unity

Создаю игру на юнити, но после компеляции игры в exe игра запускается без ограничения фпс.
Так как ограничения нету видеокарту начинает выжимать игра и фпс может быть больше 1000 (у меня 3к фпс).
И поэтому видеокарта быстро греется, у меня и у друга, даже в главном меню и бо выдаёт большое кол-во фпс.

Нужен код для ограничения фпс желательно разборно его объяснив и куда его кидать.

На форумах нету никакой инфы, только говорят зачем ограничивать и т. д.

Надеюсь на помощь, и без бональных вопросов «зачем».

Голосование за лучший ответ

Application.targetFrameRate = 60;
QualitySettings.vSyncCount = 0;

Как ограничить фпс в игре?

GavriKos

Писать в ту точку кода, после выполнения которой вам нужно это значение FPS. Можно в Awake какого то god object, например.

Ответ написан более трёх лет назад

Комментировать

Нравится Комментировать

Ваш ответ на вопрос

Войдите, чтобы написать ответ

c#

  • C#
  • +1 ещё

Как проверять столкновение префаба и UI панели в Unity?

  • 1 подписчик
  • 4 часа назад
  • 20 просмотров

Как программно установить ограничение FPS как с включенным V-Sync в Nvidia Control Panel?

Встала в полный рост задача ограничить скорость выполнения программы привязав ее к «скорости монитора», то есть если монитор 60 герц — основной цикл должен выполнятся 60 раз в секунду, если монитор 144 герц — 144 раза в секунду.
Много гуглил примеры, использовал Sleep(), std::chrono::high_resolution_clock::now(), std::this_thread::sleep_for() — полноценного нужного эффекта нет, возникают лишние задержки (не из-за тяжести программы, без задержек основной цикл работает 300 раз в секунду).

Мне нужна достичь именно такого эффекта, который дает включенный V-Sync в Nvidia Control Panel.
Когда я использовал std::this_thread::sleep_for() для получения нужной задержки, моя программа сжирала 7-9% процессора, а когда ограничивал скорость с помощью V-Sync из Nvidia Control Panel — программа сжирает всего 1-2% процессора.

Существует ли в С++ какая-нибудь функция, которая говорит программе заснуть пока монитор на начал заново обновлять кадр? Или какие еще есть способы добиться нужного эффекта?

#1
6:49, 27 мар 2018

MikeNew
включи синхронизацию программно

#2
6:51, 27 мар 2018

Aroch
> включи синхронизацию программно
Знать бы еще как.

#3
6:57, 27 мар 2018

wglSwapIntervalEXT( 1);

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

#4
7:01, 27 мар 2018

Daniil Petrov
> В OpenGL это:
>
> wglSwapIntervalEXT(1);
Спасибо, у меня Вулкан, буду гуглить аналог.

#5
8:19, 27 мар 2018

Нашел, все оказалось предельно просто. Спасибо за наводку. Тему можно закрыть, если темы тут закрывают.

#6
8:30, 27 мар 2018

MikeNew
обычно в таких случаях принято писать, что за решение ты в итоге использовал, чтобы будущим поколениям была какая-то польза от твоего треда. судя по всему, это что-то вроде VK_PRESENT_MODE_FIFO_KHR, но всё равно.

#7
8:59, 27 мар 2018

Suslik
> обычно в таких случаях принято писать, что за решение ты в итоге использовал,
> чтобы будущим поколениям была какая-то польза от твоего треда. судя по всему,
> это что-то вроде VK_PRESENT_MODE_FIFO_KHR, но всё равно.
Я поэтому и не написал, потому что знаю, что всем все равно — все в юнити сидят, что-то делать сами ручками никто больше не хочет. 😀
И да, это именно VK_PRESENT_MODE_FIFO_KHR.

  • Имбирная Ведьмочка
  • Участник

#8
17:14, 27 мар 2018

MikeNew
> Я поэтому и не написал, потому что знаю, что всем все равно — все в юнити
> сидят, что-то делать сами ручками никто больше не хочет. 😀
Вот не надо, пожалуйста, вот так вот обобщать. : <
Ну и вообще, если ни у кого другого не возникнет твоей проблемы, от твоего ответа не будет ни холодно ни жарко. Если у кого-то возникнет — будет лучше оставить ему ответ, чтобы не пришлось по-новой создавать треды с тем же вопросом. Так что в общем случае, лучше оставить ответ, чем не оставить.

#9
21:59, 27 мар 2018

Как программно установить ограничение FPS как с включенным V-Sync в Nvidia Control Panel?

Цель VSync не ограничить FPS, а синхронизировать вывод кадра с монитором — что приводит и к ограничение количества кадров, но как следствие.
Приложение может управлять VSync самостоятельно, но пользователь всё равно может отключить его соответствующей настройкой в панели драйвера NVIDIA / AMD.
Так что если цель — добиться ограничения FPS сверх некоторой нормы, то необходимо всё-равно этим озадачится.

Впрочем, основная задача Sleep() в цикле рендерера вовсе не ограничение FPS, а освобождение CPU (чтобы он не шпарил на 100% без толку) и, как дополнительный эффект, ограничение FPS (точнее говоря Sleep становится инструментом целевой функции желаемого FPS).
Стоит учесть, что Sleep() имеет плохую точность по-умолчанию в Windows, которая повышается с помощью timeBeginPeriod (которая влияет на ВСЕ приложения в системе, а не только на то, в котором её позвали).

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

  • Имбирная Ведьмочка
  • Участник

#10
22:36, 27 мар 2018

gkv311
> Стоит учесть, что Sleep() имеет плохую точность по-умолчанию в Windows, которая
> повышается с помощью timeBeginPeriod (которая влияет на ВСЕ приложения в
> системе, а не только на то, в котором её позвали).
Ну как бы Sleep() — это скорее «моему потоку делать категорически нечего, и в ближайшем будущем (определённой степени близости) работы не предвидится», так что особая точность там и не нужна.

#11
6:13, 28 мар 2018

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

Ну как бы если время кадра ~16 ms (при 60 кадрах в секунду, при 144 будет уже меньше), а Sleep(1) проснётся через ~14 ms, то вашему движку останется всего 2 ms для обработки.
Не думаю, что нормальному 3D приложению хватит 2 ms — соответственно 60 FPS вы не получите.
Так было во времена старых Windows, на Win10 я не перепроверял (код написан давно), может Microsoft наконец-то исправила эту глупость (в Unix/Linux такого не было).

#12
7:21, 28 мар 2018

gkv311
> Цель VSync не ограничить FPS, а синхронизировать вывод кадра с монитором — что
> приводит и к ограничение количества кадров, но как следствие.
Просто у меня сложилось впечатление что именно этот способ оказался самым полноценным, несмотря на то что он всего лишь «следствие».
С другой стороны, конечно более универсальный способ действительно может понадобится, к примеру в случае тех же 144-герцовых мониторов. Значит буду дальше играться с std::this_thread::sleep_for() и с std::chrono::, они хоть дает возможность с микросекундами работать.

#13
7:58, 30 мар 2018

Кстати в DX вопрос Vsync не такой тривиальный. Точнее если надо синхронизировать по Preset(), то проблем нет (хотя есть специфика, скажем на LiquidVR), но если надо ловить Vsync дабы синхронизировать треды, то тогда приходится действовать через:
SwapChain->GetContainingOutput(&s_Monitor);
s_Monitor->WaitForVBlank();
Потенциально у вас может быть несколько карт и мониторов.

#14
9:20, 30 мар 2018

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *