Project Immersive

game engine development journal

  • v0.26 ‐ Crouch mechanic
  • v0.25 ‐ BSP areas and portals
  • v0.24 ‐ Health and fall damage
  • v0.23 ‐ Surface based footsteps
  • v0.22 ‐ Transparent materials
  • v0.21 ‐ Inventory system
  • v0.20 ‐ Interactable doors
  • v0.19 ‐ Dialogue system
  • v0.18 ‐ Occlusion culling
  • v0.17 ‐ Mantle mechanic
  • v0.16 ‐ Frustum culling
  • v0.15 ‐ Sounds
  • v0.14 ‐ Movement physics
  • v0.13 ‐ Collisions
  • v0.12 ‐ Scene loading
  • v0.11 ‐ Normal shading
  • v0.10 ‐ Per-vertex lighting
  • v0.9 ‐ Font rendering
  • v0.8 ‐ Skeletal animations
  • v0.7 ‐ Texture filtering
  • v0.6 ‐ Cubemap reflections, Skybox
  • v0.5 ‐ Texture mapping
  • v0.4 ‐ Tick system / interpolation
  • v0.3 ‐ Vertex colors and depth buffer
  • v0.2 ‐ Models and colored triangles
  • v0.1 ‐ Wireframe cube

What's in Version v0.4?

2024-06-30
  • Implemented smooth frame interpolation between fixed game logic updates
  • Added screen scale setting
  • Added mouse sensitivity settings
  • Implemented vertical camera movement using 'Z' and 'X' keys

Download

project-immersive-demo-v4.zip (25.4 KB)

message.txt


В предыдущих версиях я заметил, что картинка не такая уж плавная для >1000 FPS, поэтому на уровне движка добавил интерполяцию рендеринга.

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

Объекты хранят информацию о том, где они были в предыдущем цикле обновления и где находятся в текущий момент.

Перед рендерингом текущего кадра я вычисляю интерполятор - дробное число от 0 до 1, которое показывает сколько времени осталось до следующего цикла обновления, когда вновь обновится предыдущая и текущая позиция объекта:

При рендеринге я просто линейно сглаживаю позицию между предыдущей и текущей координатой:

На игровую логику это никак не влияет, только на картинку.

Это стандартный подход для AAA-индустрии. Вот хорошее видео, которое показывает как такая система работает в движке Source, наследуя её ещё со времен Quake: