观察HoudiniEngine是怎么得到Cook时信息的

目标

官方HoudiniEngine在对HDA进行Cook的时候会有提示框显示Cook信息:
在这里插入图片描述
(此测试用HDA见附录)

本篇目标是了解这个信息(正在Cook哪个节点)是如何得到的。
思路是先断点断到得到信息的位置,然后顺藤摸瓜看信息的来源。

0. 提示框

提示框是使用FNotificationInfo触发的。比如:

FNotificationInfo Info(FText::FromString("YakSue Test"));
Info.bFireAndForget = true;
Info.FadeOutDuration = 1.0f;
Info.ExpireDuration = 2.0f;
FSlateNotificationManager::Get().AddNotification(Info);

就会出现:
在这里插入图片描述
(需要include:)

#include "Slate/Public/Widgets/Notifications/SNotificationList.h"
#include "Slate/Public/Framework/Notifications/NotificationManager.h"

1. FHoudiniEngine::UpdatePersistentNotification

所以Cook信息提示框相关的代码一定有FNotificationInfo,那么可以在HoudiniEngine插件代码中搜索,只有三处:
在这里插入图片描述
虽然在三处下断点可以判断具体是哪里给出Cook信息提示的,但是,由于提示框的参数是FText,这在VS中是看不到可读的内容的。
所以为了确认Cook时信息,我在这三处加上log打印传入的提示信息。

经过实验,FHoudiniEngine::UpdatePersistentNotification 是得到Cook信息的位置:
在这里插入图片描述
堆栈如下:
在这里插入图片描述


而再往上看会发现,这一内容来源于OutTaskInfo.StatusText。同样可以log确认:
在这里插入图片描述
在这里插入图片描述

OutTaskInfo是从FHoudiniEngine单例中得到的,FHoudiniEngine会维护一个TaskInfo的Map:
在这里插入图片描述
所以接下来需要观察,TaskInfos这个Map是如何更新内容的

2. FHoudiniEngineScheduler::TaskDescription

对于TaskInfo,其实最关注的就是其StatusText成员的值是如何得到的,所以可以尝试直接搜索:
在这里插入图片描述
这里直接搜索到了,下断点后也可以确认是在 FHoudiniEngineScheduler::TaskDescription 中更新的内容。
在这里插入图片描述
顺着堆栈往上看,可以看到是在TaskCookAsset中调用完CookNode后,循环中不断地用 FHoudiniEngineUtils::GetCookState 获得信息。
在这里插入图片描述

3. FHoudiniApi::GetStatusString

继续进入 FHoudiniEngineUtils::GetCookState。终于找到了最底层的接口:FHoudiniApi::GetStatusString。
在这里插入图片描述

总结

总结,Cook时信息是如何得到并传递的:

  1. FHoudiniEngineScheduler::TaskCookAsset中,Cook时会先调用FHoudiniApi::CookNode。随后在一个循环中不断调用FHoudiniApi::GetStatusString获得Cook时信息。
  2. 随后,Cook时信息会被存入FHoudiniEngine单例的一个Map中。
  3. 然后,FHoudiniEngine::UpdatePersistentNotification会从FHoudiniEngine单例中得到Cook信息触发提示框。

附录:测试用HDA

为了模拟“花费时间执行一些计算”,这里使用Python让他等待两秒。这样的Python节点重复放了三个:testA、testB、testC。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55461.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全设备及部署

什么是等保定级? 之前了解了下等保定级,接下里做更加深入的探讨 文章目录 一、网路安全大事件1.1 震网病毒1.2 海康威视弱口令1.3 物联网Mirai病毒1.4 专网 黑天安 事件1.5 乌克兰停电1.6 委内瑞拉电网1.7 棱镜门事件1.8 熊猫烧香 二、法律法规解读三、安…

【推荐系统】wss课程-特征交叉

总结: 工业界推荐的精排模型全都是pointwise。 特征交叉01-FM 线性模型对输入的特征取加权和,作为对目标的预估。如果先做特征交叉,再用线性模型,通常可以取得更好的效果。如果做二阶特征交叉,那么参数量为O(特征数…

ios_base::out和ios::out、ios_base::in和ios::in、ios_base::app和ios::app等之间有什么区别吗?

2023年8月2日,周三晚上 今天我看到了这样的两行代码: std::ofstream file("example.txt", std::ios_base::out);std::ofstream file("example.txt", std::ios::out);这让我产生了几个疑问: 为什么有时候用ios_base::o…

HarmonyOS应用开发者基础与高级认证题库——中级篇

系列文章目录 HarmonyOS应用开发者基础与高级认证题库——基础篇 HarmonyOS应用开发者基础与高级认证题库——中级篇 文章目录 系列文章目录前言一、判断二、单选三、多选 前言 今天刚换了台果子手机就收到了华子鸿蒙开发认证邀请(认证链接)&#xff0…

从零开始,探索Python变量的奥秘!

在Python这个充满魔力的编程世界中,变量是一门必须深入了解的基础知识。无论你是初学者还是有经验的开发者,掌握变量的基本语法对于编写优雅、高效的代码至关重要。本篇博客将带你从零开始,深入探索Python变量的奥秘,让你在编程之…

LeetCode150道面试经典题-合并两个有序数组(简单)

合并两个有序数组 题目: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意&a…

UEditorPlus v3.3.0 图片上传压缩重构,UI优化,升级基础组件

UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符…

【小沐学C++】C++ 基于CMake构建工程项目(Windows、Linux)

文章目录 1、简介2、下载cmake3、安装cmake4、测试cmake4.1 单个源文件4.2 同一目录下多个源文件4.3 不同目录下多个源文件4.4 标准组织结构4.5 动态库和静态库的编译4.6 对库进行链接4.7 添加编译选项4.8 添加控制选项 5、构建最小项目5.1 新建代码文件5.2 新建CMakeLists.txt…

DataGrip 配置 HiveServer2 远程连接访问

文章目录 集群配置 HiveServer2 服务DataGrip 配置 HiveServer2 访问 Hive 集群配置 HiveServer2 服务 1.在 Hive 的配置文件 hive-site.xml 中添加如下参数&#xff1a; <!-- 指定 HiveServer2 运行端口&#xff0c;默认为&#xff1a;10000 --><property><na…

3理解图像本质-AI-python

下载Jupyter Lab 代码如下&#xff1a; import numpy as np //导入包 import matplotlib.pyplot as plt //为了显示图片要导入另一个图 %matplotlib inline //显示图片防止出错&#xff0c;在行内显示 from PIL import Image //读取图片 img Image.open(E:/ANCONDA/AI_Pyth…

Gitlab CI/CD笔记-第二天-GitOps的流水线常用关键词(1)

一、常用关键词 在Gitlab项目的根目录需要创建一个 .gitlab-ci.yaml的文件。 这个文件就是定义的流水线。Call :"Pipeline as code" 二、这条流水线怎么写&#xff1f; 一、掌握常用的关键词即可。 1.关键词分类 1.全局关键词 Global Keywards 2.任务关键词…

如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片

如何剪裁操作系统源码 本文面向的需求场景是&#xff0c;为缺乏标准库实现的处理器IP移植内存管理模块&#xff0c;即为裸片部署C标准库中的 malloc() 和 free() 函数。 具体做法是——从操作系统的内存管理组件中剪裁出必要的源码&#xff0c;适配到目标处理器的开发环境&am…