В последнее время я сталкиваюсь с некоторыми проблемами, связанными с дрожанием кадров, и кажется, что лучшим решением было бы то, что было предложено Гленном Фидлером (Gaffer on Games) в классической программе Fix Your Timestep! статья.
Сейчас - я уже использую фиксированный временной шаг для своего обновления. Проблема в том, что я не делаю предложенную интерполяцию для рендеринга. В результате я получаю удвоенные или пропущенные кадры, если моя скорость рендеринга не соответствует моей частоте обновления. Это может быть визуально заметно.
Поэтому я хотел бы добавить интерполяцию в свою игру - и мне интересно узнать, как другие структурировали свои данные и код для поддержки этого.
Очевидно, мне нужно будет хранить (где? / Как?) Две копии информации о состоянии игры, относящейся к моему средству визуализации, чтобы она могла интерполироваться между ними.
Кроме того - это хорошее место для добавления потоков. Я предполагаю, что поток обновления может работать с третьей копией состояния игры, оставляя две другие копии только для чтения для потока рендеринга. (Это хорошая идея?)
Похоже, что наличие двух или трех версий состояния игры может привести к проблемам с производительностью и, что гораздо важнее, к проблемам надежности и производительности разработчиков по сравнению с наличием только одной версии. Поэтому я особенно заинтересован в методах смягчения этих проблем.
Я думаю, что особого внимания заслуживает проблема того, как обрабатывать добавление и удаление объектов из игрового состояния.
Наконец, кажется, что какое-то состояние либо не требуется напрямую для рендеринга, либо будет слишком сложно отследить различные версии (например, сторонний физический движок, который хранит одно состояние) - поэтому мне было бы интересно узнать, как люди обрабатывали такие данные в такой системе.