Как данные попадают в оверлей
Откуда берутся данные в оверлее и по каким правилам они устроены. Прочитав это один раз, вы будете понимать любое поле API.
Путь данных
Оверлей никогда не общается с игрой напрямую. С играми работает Racelink и отдаёт оверлеям одинаковые данные, какая бы игра ни была запущена. Поэтому один и тот же оверлей работает и в iRacing, и в Assetto Corsa без отдельного кода под каждую игру.
Всё это происходит на компьютере игрока: данные никуда не отправляются, промежуточного сервера нет. Оверлей может обращаться только к Racelink, если игрок не разрешил ему большего (Безопасность).
Блоки данных
Данные разделены на блоки — группы связанных значений, которые приходят вместе. Например, car — педали, скорость и передача, timing — времена кругов, drivers — все машины сессии. В коде и API блок называется topic. Все блоки и их поля есть в справочнике полей.
Каждый блок приходит так часто, как обычно меняются его данные:
car- около 60 раз в секунду
vehicle- около 20 раз в секунду; радар так же
controls- около 10 раз в секунду; список машин так же
session- около 4 раз в секунду; времена кругов и топливо так же
weather- раз в секунду; карта трассы так же
Подписываться на блоки вручную не нужно. Когда ваш код впервые обращается к блоку, SDK сам просит Racelink его присылать. Блок, к которому код не обращается, не приходит. Поэтому читайте только то, что показываете.
overlay.on('telemetry', ({ car, timing }) => {
// Код читает car и timing, поэтому приходят только эти два блока.
render(car.speedKph, timing.lap.lastSeconds);
});const { telemetry } = useOverlay();
// Код читает car и timing, поэтому приходят только эти два блока.
const { car, timing } = telemetry;Всегда последнее значение
Каждое сообщение содержит весь блок целиком в его текущем состоянии. Новое сообщение заменяет старое, а SDK хранит самое свежее в overlay.telemetry. Оверлей, открытый позже других, сразу получает текущее состояние всех блоков.
Единицы измерения
Во всех играх значения приходят в одних и тех же единицах, и единица указана в имени поля: car.speedKph — км/ч, fuel.levelLiters — литры, weather.trackTemperatureC — градусы Цельсия. Педали — от 0 до 1, руль — от −1 до 1, углы — в радианах, время — в секундах, расстояния — в метрах.
Если игрок привык к милям или галлонам, это видно в отдельных полях, например session.displayUnits. Переводите значения в его единицы только при выводе на экран.
Нет значения — null
Поле существует всегда, поэтому обращение к telemetry.car.rpm не вызовет ошибку. Если игра значение не даёт, в поле null, а списки пустые. В таком случае покажите прочерк или спрячьте элемент:
const rating = driver.ext.iracing?.iRating ?? null;
cell.textContent = rating === null ? '—' : String(rating);Пока блок ни разу не пришёл, его поля тоже пустые. А пока Racelink не прислал оверлею его настройки, overlay.ready равно false: до этого момента ничего не рисуйте.
Общие поля и поля одной игры
Если значение есть в гоночных играх вообще (газ, времена кругов, температура шин), у него одно имя для всех игр. То, что есть только в одной игре, лежит в ext.<игра>. Например, iRating есть только в iRacing, поэтому он в drivers[i].ext.iracing?.iRating. Подробнее — Один оверлей для всех игр.
Демо-данные
Если игра не запущена, оверлей может работать на демо-данных: это выдуманная гонка с машинами, кругами, погодой и картой. Откройте страницу dev-сервера с ?demo в адресе, а для конкретной игры — например, с ?demo=le-mans-ultimate.
Если Racelink запущен, демо-данные даёт он; если нет, SDK создаёт такие же прямо в странице. Демо-данные устроены так же, как настоящие, поэтому то, что работает на них, работает и в гонке. Проверить оверлей на настоящей гонке без игры помогут записи сессий.