UE4 计时器的简单使用(FTimerManager)

这篇具有很好参考价值的文章主要介绍了UE4 计时器的简单使用(FTimerManager)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我在UE中开发视频播放插件时,需要实现UE的媒体框架。
当引擎Tick到MediaModule时,会从我自己实现的Player中取视频帧数据,然后用其初始化成纹理并输送到渲染管线中。

然而我使用的SDK没有视频取帧的回调函数,只能自己在外部控制取帧速率,即帧号的递增时机:
要么每次跟随引擎的Tick取帧,但这样视频播放受帧率影响太大;
要么自己实现一个时间线来控制,但是会比较麻烦。

直到我发现了UE自己封装的计时器类 FTimerManager,可以直接拿来使用。
现在我只需要设置Timer间隔,然后在每次Timer中断时调用的代理函数里增加帧号。
不过这种中断是假中断,实际也依靠引擎Tick,所以不会像专门的时间轴那么精准,但好在它帮你做了大量时间间隔相关的计算,你只需要专注于实现中断函数。

一、使用方法

1. 引用头文件(.h)

#include "TimerManager.h"

源码位置:Engine - Source - Runtime - Engine
UE4 计时器的简单使用(FTimerManager)

2. 声明相关变量和函数(.h)

FTimerHandle(必要) :mTimerDelagate, 你的Timer句柄,代表了你申请到Timer,之后的任何Timer操作都要用到它
FTimerDelegate(可选):mTimerDelagate,Timer代理,用它绑定你的中断执行函数。当然如果你的执行函数在UObject中,就不需要这个代理。

3. 代理绑定(.cpp)

mTimerDelagate.BindRaw(this, &FPXMediaTracks::OnTimerReached);

4. 中断函数实现(.cpp)

我的中断函数(OnTimerReached)实现如下,每次Timer间隔都会来执行:

void FPXMediaTracks::OnTimerReached()
{
	++m_llVideoTimeplinePos;
	// Do whatever you want when Timer reached.
	// ...
}

5. 申请计时器(.cpp)

如果在游戏线程中申请计时器,可以直接:

float TimerInterval = 0.5f; // 每0.5秒触发一次中断
FTimerManager& TimerManager = GWorld->GetTimerManager();
TimerManager.SetTimer(mTimerHandle, mTimerDelagate, TimerInterval, true);

如果在其它地方申请计时器,需要用 ASync 封装,将其送到主线程执行:

float TimerInterval = 0.5f; // 每0.5秒触发一次中断
Async(EAsyncExecution::TaskGraphMainThread, [this, TimerInterval]() {
	FTimerManager& TimerManager = GWorld->GetTimerManager();
	TimerManager.SetTimer(mTimerHandle, mTimerDelagate, TimerInterval, true);
});

这是因为FTimerManager的内部实现会去主动check:
UE4 计时器的简单使用(FTimerManager)
至此 ,计时器开始计时。

6. 控制计时器(.cpp)

  • 暂停计时
FTimerManager& TimerManager = GWorld->GetTimerManager();
TimerManager.PauseTimer(mTimerHandle);
  • 继续计时
FTimerManager& TimerManager = GWorld->GetTimerManager();
TimerManager.UnPauseTimer(mTimerHandle);

7. 清除计时器(.cpp)

当不再继续使用该计时器,销毁计时器句柄。
在析构或者反初始化函数中执行(同样会有**IsInGameThread()**检测):文章来源地址https://www.toymoban.com/news/detail-402806.html

FTimerManager& TimerManager = GWorld->GetTimerManager();
TimerManager.ClearTimer(mTimerHandle);

二、其它

  • UE官方文档:https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/FTimerManager/

到了这里,关于UE4 计时器的简单使用(FTimerManager)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java 多线程6——计时器Timer的使用 + 详细代码模拟实现 + 代码优化

    Java 多线程6——计时器Timer的使用 + 详细代码模拟实现 + 代码优化

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 本篇文章为大家带来的仍然是多线程编程,计时器是许多场景都会应用到的一个非常方便快捷实用的类。 🦉定时器,顾

    2024年02月04日
    浏览(12)
  • Android 计时器Chronometer 使用及源码分析(1),android音视频框架

    Android 计时器Chronometer 使用及源码分析(1),android音视频框架

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_textview_chronometer);//加载布局文件 initView(); } private void initView() { btn_start = findViewById(R.id.btn_start); btn_stop = findViewById(R.id.btn_stop); btn_reset = findViewById(R.id.btn_reset); chronome

    2024年04月14日
    浏览(17)
  • 14、计时器、定时器设计与应用

    14、计时器、定时器设计与应用

    掌握同步四位二进制计数器 74LS161 的工作原理和设计方法 掌握时钟/定时器的工作原理与设计方法 任务 1:采用行为描述设计同步四位二进制计数器 74LS161 任务 2:基于 74LS161 设计时钟应用 1.创建工程并创建 Verilog 文件 建立 HDL 类型的工程 My74LS161,创建 Verilog 文件 My74LS161,

    2024年02月03日
    浏览(8)
  • 51单片机通过计时器实现倒计时

    51单片机通过计时器实现倒计时

    软件 : Keil5+Proteus7 元件 : AT89C51 * 1,7SEG-MPX2-CA * 1

    2024年02月16日
    浏览(54)
  • RIP四大计时器

    RIP四大计时器

    RIP 计时器(以下均以华为 ensp 中信息为参考) 希望有需要的小伙伴可以参考参考,如有误解、请指正! 一、实验原理 1. 更新计时器( Update Timer ) Update time(更新时间):指运行RIP协议的路由器向其连接口广播自己的路由信息的时间间隔(用于更新RIP路由表信息),控制

    2024年02月03日
    浏览(15)
  • Qt实现计时器

    Qt实现计时器

    一、样图 二、代码 mainwidow.h mainwindow.cpp main.cpp ui_mainwindow.h

    2024年02月07日
    浏览(11)
  • 555计时器原理

    555计时器原理

    以Multisim上的555计时器为例: 图0.0 555计时器包含八个引脚 分别为: RST - Reset 复位引脚(低电平有效) DIS - Discharge 三极管集电极Collector输入引脚 THR - Threshold 上阈值电压引脚 TRI - Trigger 触发引脚 CON - Control voltage 1 电压控制引脚 OUT - Output 信号输出引脚 VCC GND 555定时器内部功能图

    2024年02月05日
    浏览(11)
  • WPF计时器功能

    WPF计时器功能

    本文实现WPF的计时器功能是通过system.timers.timer这个组件实现的。现在网上相关的资料有很多,我只是在自己的工作中刚好遇到要实现这个功能,中间也走了很多的弯路,不停的参考网上现有的资源,终于实现了基本的定时功能。希望本文可以帮助到您,让您花更少的时间来完

    2024年02月05日
    浏览(13)
  • java计时器

    java计时器

      在 Java中,我们有一个重要的概念:同步和异步。同步就是 Java中的线程安全,异步就是 Java中的线程非安全。 在使用 JVM时,我们一般都是用 start ()方法启动一个线程,然后设置时间,比如定时器,定时器是在某个指定的时间执行相应的任务。但是,在实际应用中,我们

    2023年04月18日
    浏览(12)
  • 24秒计时器

    24秒计时器

    方案一:采用计数器(74LS192)作为核心部分。同时选择(74LS47)作为BCD码译码器来对7段数码显示管进行译码驱动,两个七段共阳数码显示管进行显示。采用计时器(NE555)制成的多谐振荡器,进行秒脉冲的输入。因为我们需要对其进行暂停、清零、报警和自动清零等控制,所

    2024年02月06日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包