英文原文:https://docs.omniverse.nvidia.com/kit/docs/kit-manual/latest/guide/kit_core_iapp_interface.html
omni.kit.app 子系统是一个 Kit 核心插件,它定义了 Kit Core 提供的最小功能集,具体来说:
- Loop runner entry point (循环运行入口点)
- Extension manager 扩展管理器)
- Scripting support (脚本支持)
- General message bus (通用消息总线)
- Shutdown sequence management (关闭顺序管理)
- Hang detector (挂起探测器)
Loop runner(循环运行)
循环运行器是驱动应用程序循环的东西,更具体地说 - 将更新事件推送到相应的更新事件流中并泵送事件流,从而允许模块化的点滴滴答作响。
在最简单的场景中,循环运行器是确保定期抽取核心事件流的逻辑。 最简单的循环运行器的伪代码:
void update()
{
preUpdateEventStream->push(...);
preUpdateEventStream->pump();
updateEventStream->push(...);
updateEventStream->pump();
postUpdateEventStream->push(...);
postUpdateEventStream->pump();
messageBus->pump();
}
这是驱动 Kit 应用程序的最直接的方法,并且可以实现 IRunLoopRunner 的自定义版本并将其提供给应用程序使用。 默认循环运行器接近于伪代码中概述的简单实现,只是添加了少量的速率限制器逻辑和其他少量的维护逻辑。
Extension manager(扩展管理器)
扩展管理器控制扩展执行流程,维护扩展注册表,并执行其他相关操作。 扩展子系统将单独详细说明,因为这是构成 Kit 应用程序的所有模块化部分的主要入口点。 扩展管理器界面可以通过 Kit Core 应用程序界面访问。
Scripting(脚本编写)
Kit Core 应用程序设置支持 Python 扩展并执行自定义 Python 脚本和代码片段所需的 Python 脚本环境。 IAppScripting 为该脚本环境提供了一个简单的接口,可用于执行文件和字符串,以及管理脚本搜索文件夹,并订阅将广播所有脚本事件的事件流(例如脚本命令事件、脚本输出事件和脚本错误事件,所有事件都存储在相应的事件类型中)。
General message bus(通用消息总线)
通用消息总线是一个简单而强大的概念。 这只是一个事件流,在所有更新后每帧泵送一次,任何人都可以使用总线发送和侦听事件。 这在事件流所有权不方便的情况下,或者在建立应用程序范围的事件(例如,显示弹出窗口或类似的事情)时非常有用 - 它可以被所有扩展中的许多消费者使用。 根据事件流指南,建议从字符串哈希派生事件类型。 消息总线使用的简单示例:
import carb.events
import omni.kit.app
BUS_EVENT_TYPE = carb.events.type_from_string("my_ext.SOME_EVENT")
message_bus = omni.kit.app.get_app().get_message_bus_event_stream()
subscription = message_bus.create_subscription_to_pop_by_type(BUS_EVENT_TYPE, on_change)
# 将订阅存储在某处,这样它就不会立即被删除
subs.append(subscription)
Shutdown sequence(关闭顺序)
应用程序通过退出后查询接收关闭请求。 将记录查询并且应用程序将照常进行,直到在更新逻辑中的定义位置处处理关闭查询。
在真正的关闭启动之前,查询后事件将被注入到关闭事件流中。 订阅事件流的消费者将有机会请求取消关闭请求。 如果提出请求,则不会发生关闭。 例如,当有未保存的工作待处理时,需要显示对话框弹出窗口确认退出。 如果关闭未被取消 - 另一个事件将被注入关闭事件流中,这次告诉它真正的关闭即将开始。
但是,可以发布不可取消的退出请求 - 作为紧急措施,以防应用程序需要不间断地关闭。
Hang detector(挂起探测器)
该应用程序核心还包含一个简单的挂起检测器,该检测器旨在接收定期推送,如果在指定的时间内没有推送,它将通知用户检测到挂起,并且如果用户选择,可能会导致应用程序崩溃。 这很有用,因为崩溃会生成故障转储,使开发人员能够了解发生了什么以及挂起时的调用堆栈。 诸如超时(如果启用)之类的事情以及其他事情可以通过设置进行调整。