Как ограничить частоту кадров?

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

Я сделал:

window.SetFramerateLimit(0);
window.UseVerticalSync(false);

Документация SFML говорит, что это должно установить частоту кадров в «бесконечность», но я все еще думаю, что она застряла на 60-ти.

Кто-нибудь знает, как я могу получить больше производительности от этого?

Также после того, как неограниченный, мне нужно иметь возможность сделать эквивалент этого в SFML, из SDL:

SDL.Delay (1000);

Есть ли способ сделать это? Задержка SDL хороша тем, что освобождает процессорное время для других процессов.

2

Решение

Хотя вы можете деактивировать / активировать VSync с помощью SFML, но не гарантируется, что он действительно активируется, потому что сам драйвер имеет последнее слово, и они часто предоставляют возможность включить или выключить VSync. Поэтому я бы сказал, что вы должны взглянуть на настройки вашего графического драйвера.

С другой стороны, мне интересно, чего вы на самом деле хотите достичь с «неограниченной» частотой кадров, потому что в большинстве случаев она будет максимально использовать одно ядро ​​вашего ЦП, хотя приложение на самом деле ничего не делает. Если вам просто нужно больше процессорного времени для расчета, тогда оба метода (VSync & setFramerateLimit()) не должен ничего блокировать.

Я настоятельно советую вам использовать SFML 2, поскольку SFML 1.6 не поддерживается более 2,5 лет, содержит довольно много ужасных ошибок и не имеет некоторых очень полезных функций (например, RenderTexture, VertexArray, …).

3

Другие решения

Я не уверен в проблеме частоты кадров. Согласно документации, это будет работать. Одна вещь, которую я бы попробовал, — это удалять (или комментировать) по одному утверждению за раз, посмотреть, помогает ли это, ИЛИ оба: вертикальный, так как предполагается, что он по умолчанию выключен, и я чувствую, что частота кадров будет по умолчанию равной бесконечности, но я могу неправильно. Кроме того, может случиться так, что частота кадров бесконечна, но вычисления просто требуют достаточно времени, чтобы сделать это ~ 60 кадров в секунду. Наконец, возможно, это предел монитора, как предложено выше.

Что касается задержки, я полагаю, вы думаете о функции сна — заставьте текущий поток сделать паузу на определенное время. Я знаю, что в SFML 2 это sf :: sleep (sf :: Time), где время может быть получено, например: sf :: seconds (float t), sf :: миллисекунды и т. Д. Они возвращают Time объект. В SFML 1.6 это sf :: Sleep (с плавающей запятой).

Кроме того, я не знаю, исправит ли это это, но я думаю, что у SFML были некоторые проблемы на стороне Apple, поэтому, возможно, если вы используете версию 1.6 или меньше, версия 2 устранила проблему. Версия 2 теперь вышла как … ну, вам не нужно ее компилировать самостоятельно. Я думаю, что это исправило другие вещи, возможно, это было проблемой раньше.

1

Не устанавливая ограничение частоты кадров или устанавливая его на ноль (по умолчанию), окно sfml должно отображать кадры настолько быстро, насколько это возможно. К сожалению, проблема, похоже, связана с драйверами, которые заставляют vsync быть включенным. Поскольку это Macbook Pro с графикой HD3000 и драйвером Intel, я не знаю, как отключить vsync.

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

Что касается функции задержки SDL, SFML предоставляет sf::Sleep() функция. Эта функция вызывается с аргументом sf::Time объект, для которого пользователь может задать количество микросекунд, миллисекунд и секунд для задержки.

Однако обратите внимание, что эта функция не «спит» и не «задерживается» в течение этого точного промежутка времени — операционная система возвращается в «некоторое время спустя, по крайней мере, после запрошенного времени ожидания». Я не совсем понимаю, как это работает, или какого «временного разрешения» вы можете ожидать достичь с помощью sf::Sleep() или же SDL_Delay(),

-2
По вопросам рекламы [email protected]