Я работаю над простой игрой в OpenGL, использую SDL для инициализации и ввода дисплея, и, судя по всему, у меня есть две опции. Номер один просто спит для оптимального времени-кадра - theTimeTakenToRender, когда оптимальное время-кадра в секундах = 1 / theFramerateCap. (Я не совсем уверен, если это необходимо, поскольку это эквивалентно использованию vsync, что может быть более точным. Если мое предположение верно, скажите, пожалуйста, SDL + OpenGL имеет vsync по умолчанию, и если нет, то как чтобы включить его.) Другой - измерить время с момента рендеринга последнего кадра и просто соответствующим образом отрегулировать движение. (Чем меньше времени требуется для рендеринга кадра, тем меньше объектов перемещаются в этом кадре). Каковы преимущества и недостатки этих двух методов с точки зрения производительности, уменьшения мерцания и т. Д.?
источник
SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
В конечном итоге вы будете использовать гораздо меньше ресурсов ЦП (спасибо многопользовательским), и люди на мобильных устройствах тоже это оценят.
источник
Вы никогда, никогда, никогда, никогда не должны использовать Sleep для управления частотой кадров .
Это уже прошло, и я перейду к другому вопросу для обсуждения причин. Одна вещь, не упомянутая здесь, заключается в том, что при типичной современной частоте обновления 60 Гц и с типичной гранулярностью спящих вызовов в 1 миллисекунду фактически невозможно спать в течение правильного промежутка времени между кадрами.
Я не говорю, что уступать ЦП, если вам нечего делать, это плохо; отнюдь не. Но это не то же самое, что управление частотой кадров, и Sleep - это решение, которое подходит для первых, но не для последних.
Вместо этого проверьте, сколько времени прошло, и если пришло время запустить кадр, то сделайте это, в противном случае - и если вы хотите сэкономить некоторое количество ЦП - спите в течение минимального времени - 1 миллисекунда. Также убедитесь, что таймер сна настроен в соответствии с вашей платформой, чтобы дать вам хорошее разрешение; то есть, когда вы произносите этот вызов «Sleep (1)», у вас действительно есть шанс действительно спать в течение 1 миллисекунды, а не что-то вроде 15, 20 или 30 (что было бы иначе). Я верю, что SDL сделает это автоматически для вас.
Вы также можете внести в него некоторую слабость, чтобы, если приближается время для запуска кадра, вы останавливаете режим «Сон» и начинаете работать ровно, пока кадр не сработает, что может помочь вам точнее достичь желаемого интервала кадра.
То, как это выглядит в конечном итоге, представляет собой целую кучу вызовов Sleep (1), чередующихся со случайным кадром, и это нормально. Вы по-прежнему отказываетесь от процессора, когда он вам не нужен, но ваши кадры все равно смогут работать вовремя.
источник
Вероятно, наиболее важным преимуществом ограничения частоты кадров является то, что он может помочь предотвратить буквальное физическое повреждение машины. Они забыли сделать это на Starcraft II, что оказалось очень проблематичным (и дорогим) для некоторых пользователей, пока они не исправили его.
источник
Как упоминалось ранее, это снижает загрузку процессора. С другой стороны, и все более важно, что также истощает срок службы батареи. В качестве хорошего примера, FTL работает почти на 100% CPU на моем MBA. В результате он разряжает батарею за> 2 часа и сильно нагревается. (Как более прямой результат, я удалил и больше не играю это ...). Крышка рамы предотвратила бы это.
Другим не упомянутым преимуществом является то, что если это многопользовательская игра, вы также выравниваете игровое поле, предоставляя всем одинаковый опыт.
источник