This page has been translated automatically.
Основы UNIGINE
1. Введение
2. Виртуальные миры и работа с ними
3. Подготовка 3D моделей
4. Материалы
5. Камеры и освещение
7. Создание кат-сцен и запись видео
8. Подготовка проекта к релизу
9. Физика
10. Основы оптимизации
11. ПРОЕКТ2: Шутер от первого лица
12. ПРОЕКТ3: Аркадная гонка по пересеченной местности от 3-го лица
13. ПРОЕКТ4: VR приложение с простым взаимодействием

Работа со временем (IFps)

Brief overview of the frame duration and separating the application logic from FPS. Making the fan rotation created via the Fan component smooth.Кратко про время кадра и отвязывание логики приложения от FPS. Делаем вращение вентилятора в компоненте Fan плавным.

The application frame rate may vary (i.e. the update() method will be called more or less frequently) depending on the hardware. If we want a specific action to be performed at a certain frequency regardless of the frame rate (e.g. an indicator blinks once per second, etc.), then we must untie the application logic from the FPS. To do this, we can use the scaling multiplier (time in seconds taken to process the last frame) returned by the following methods:Частота кадров при работе приложения может варьироваться (т.е. метод Update() будет вызываться чаще или реже) в зависимости от аппаратного обеспечения. Если мы хотим, чтобы какое-то действие выполнялось с определенной периодичностью независимо от частоты кадров (например, мигание индикатора один раз в секунду и т.п.), то мы должны отвязать логику приложение от FPS. Для этого можно использовать множитель масштабирования (время в секундах, затраченное на обработку последнего кадра), возвращаемый следующими методами:

  • Engine::getIFps() returns the inverse of the FPS value for your application.Engine.IFps возвращает обратное значение FPS для вашего приложения.
  • Game::getIFps() returns the scaled inverse FPS value. This class is to be used when you want to speed up, slow down, or pause rendering, physics, or game logic.Game.IFps возвращает масштабированное обратное значение FPS. Этот класс предназначен для использования, когда вы хотите ускорить, замедлить или приостановить рендеринг, физику или игровую логику.

To adjust the transformations, you can use the following code:Чтобы изменить преобразования, вы можете использовать следующий код:

Исходный код (C#)
private void Update()
{

	// получаем обратное значение FPS (время в секундах, затраченное на обработку предыдущего кадра)
	float ifps = Game.IFps;

	// перемещаем ноду на 0.3 единицы в секунду, вместо перемещения на эту же величину каждый кадр
	node.WorldTranslate(new Vec3(0.0f, 0.0f, 0.3f * ifps));
}

To perform some changes once in a certain period of time you can use the following code:Чтобы выполнять какие-то действия однократно в определенный промежуток времени, можно использовать следующий код:

Исходный код (C#)
const float INTERVAL_DURATION = 5;
float elapsed_time = INTERVAL_DURATION;

private void Update()
{

	// получаем обратное значение FPS (время в секундах, затраченное на обработку предыдущего кадра)
	float ifps = Game.IFps;

	// проверяем не настало ли время выполнить действие
	if (elapsed_time < 0.0f)
	{

		/* .. DO SOME CHANGES .. */

		// устанавливаем таймер обратного отсчета
		elapsed_time = INTERVAL_DURATION;
	}

	// уменьшаем значение таймера на продолжительность предыдущего кадра
	elapsed_time -= ifps;
}

Practice
Практика#

In our project the fan is still rotating at an indeterminate speed (by 10 degrees per frame, and frame time is an unstable value). Let's assume that we want to set the rotation speed in revolutions per second. This can be easily achieved by adding a multiplier into the existing code:В нашем проекте вентилятор пока вращается с непонятной скоростью (на 10 градусов за кадр, а время кадра – величина непостоянная), предположим, что мы хотим задавать скорость вращения в оборотах в секунду. Достаточно просто изменить имеющийся код, добавив множитель:

Fan.cpp
#include "Fan.h"
${#HL}$ #include <UnigineGame.h>${HL#}$
// Регистрация компонента Fan
REGISTER_COMPONENT(Fan);

// включаем нужные пространства имен
using namespace Unigine;
using namespace Math;

// метод update компонента, вызываемый каждый кадр 
void Fan::update()
{
	// если не назначена нода лопастей, ничего не делаем
	if (!fan_node)
		return;
	// поворачиваем ноду с заданной скоростью
	fan_node->rotate(0, speed ${#HL}$ * Game::getIFps() ${HL#}$ , 0);
}

Now the blades rotate precisely at the specified speed regardless of the frame rate.Теперь вне зависимости от частоты кадров – лопасти вращаются строго с заданной скоростью.

Последнее обновление: 13.12.2024
Build: ()