Я пытаюсь полностью ограничить частоту кадров SFML, чтобы отображалось как можно больше кадров. Причина этого в том, что я хочу пройтись по одной части кода, которая вычисляет позиции объектов в симуляции физики, и обновить экран после, возможно, 100 итераций.
Я сделал:
window.SetFramerateLimit(0);
window.UseVerticalSync(false);
Документация SFML говорит, что это должно установить частоту кадров в «бесконечность», но я все еще думаю, что она застряла на 60-ти.
Кто-нибудь знает, как я могу получить больше производительности от этого?
Также после того, как неограниченный, мне нужно иметь возможность сделать эквивалент этого в SFML, из SDL:
SDL.Delay (1000);
Есть ли способ сделать это? Задержка SDL хороша тем, что освобождает процессорное время для других процессов.
Хотя вы можете деактивировать / активировать VSync с помощью SFML, но не гарантируется, что он действительно активируется, потому что сам драйвер имеет последнее слово, и они часто предоставляют возможность включить или выключить VSync. Поэтому я бы сказал, что вы должны взглянуть на настройки вашего графического драйвера.
С другой стороны, мне интересно, чего вы на самом деле хотите достичь с «неограниченной» частотой кадров, потому что в большинстве случаев она будет максимально использовать одно ядро вашего ЦП, хотя приложение на самом деле ничего не делает. Если вам просто нужно больше процессорного времени для расчета, тогда оба метода (VSync & setFramerateLimit()
) не должен ничего блокировать.
Я настоятельно советую вам использовать SFML 2, поскольку SFML 1.6 не поддерживается более 2,5 лет, содержит довольно много ужасных ошибок и не имеет некоторых очень полезных функций (например, RenderTexture, VertexArray, …).
Я не уверен в проблеме частоты кадров. Согласно документации, это будет работать. Одна вещь, которую я бы попробовал, — это удалять (или комментировать) по одному утверждению за раз, посмотреть, помогает ли это, ИЛИ оба: вертикальный, так как предполагается, что он по умолчанию выключен, и я чувствую, что частота кадров будет по умолчанию равной бесконечности, но я могу неправильно. Кроме того, может случиться так, что частота кадров бесконечна, но вычисления просто требуют достаточно времени, чтобы сделать это ~ 60 кадров в секунду. Наконец, возможно, это предел монитора, как предложено выше.
Что касается задержки, я полагаю, вы думаете о функции сна — заставьте текущий поток сделать паузу на определенное время. Я знаю, что в SFML 2 это sf :: sleep (sf :: Time), где время может быть получено, например: sf :: seconds (float t), sf :: миллисекунды и т. Д. Они возвращают Time объект. В SFML 1.6 это sf :: Sleep (с плавающей запятой).
Кроме того, я не знаю, исправит ли это это, но я думаю, что у SFML были некоторые проблемы на стороне Apple, поэтому, возможно, если вы используете версию 1.6 или меньше, версия 2 устранила проблему. Версия 2 теперь вышла как … ну, вам не нужно ее компилировать самостоятельно. Я думаю, что это исправило другие вещи, возможно, это было проблемой раньше.
Не устанавливая ограничение частоты кадров или устанавливая его на ноль (по умолчанию), окно sfml должно отображать кадры настолько быстро, насколько это возможно. К сожалению, проблема, похоже, связана с драйверами, которые заставляют vsync быть включенным. Поскольку это Macbook Pro с графикой HD3000 и драйвером Intel, я не знаю, как отключить vsync.
Существуют и другие способы решения этой проблемы, например, использование оператора if, чтобы решить, обновлять ли экран каждый цикл. Это то, что я сделал, хотя это не идеальное решение.
Что касается функции задержки SDL, SFML предоставляет sf::Sleep()
функция. Эта функция вызывается с аргументом sf::Time
объект, для которого пользователь может задать количество микросекунд, миллисекунд и секунд для задержки.
Однако обратите внимание, что эта функция не «спит» и не «задерживается» в течение этого точного промежутка времени — операционная система возвращается в «некоторое время спустя, по крайней мере, после запрошенного времени ожидания». Я не совсем понимаю, как это работает, или какого «временного разрешения» вы можете ожидать достичь с помощью sf::Sleep()
или же SDL_Delay()
,