UE4 资源的关联性

leileilcy 2016-01-19 11:26:58
在编辑器当中,资源之间的关联性比较清晰,但是将资源打包成pak之后,资源之间如何存在关联呢?求教大神
...全文
788 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
3GPP TS 23.501 V16.1.0(2019-06 年)5G 系统的系统架构; 第二阶段 (版本 16) 目录 前言 15 1 范围 16 2 参考文献 16 3 定义和缩写 20 3.1 定义 20 3.2 缩写 24 4 架构(architecture)模型和概念 26 4.1 一般概念 26 4.2 架构参考模型 27 4.2.1 概述 27 4.2.2 网络功能和实体 27 4.2.3 非漫游参考架构 28 4.2.4 漫游参考架构 31 4.2.5 数据存储架构 35 3gpp 公司 邮政地址 3GPP 支持办公室地址 650 路德卢西亚-索菲亚-安提波利斯 Valbonne-法国 电话:+33 4 92 94 42 00 传真:+33 4 93 65 47 16 互联网 网址:http://www.3gpp.org 版权通知 未经书面许可,不得复制任何部分。版权和上述限制适用于所有媒体的复制。 ?2019,3GPP 组织合作伙伴(ARIB、ATIS、CCSA、ETSI、TSDSI、TTA、TTC)。 版权所有。 UMTS™是为其成员利益注册的 ETSI 商标。 3GPP™是为其成员利益注册的 ETSI 商标,3GPP 组织合作伙伴的商标;LTE™是为其成员和 3GPP 组织合作伙 伴利益注册的 ETSI 商标。 GSM®和 GSM 标志由 GSM 协会注册并拥有。 3GPP 错误!文档中没有指定样式的文字。 3 3GPP TS 23.501 V16.1.0(2019-06 年) 4.2.5a 无线电能力信号优化 36 4.2.6 基于服务的接口 37 4.2.7 参考点 38 4.2.8 支持非 3gpp 接入 39 4.2.8.0 概述 39 4.2.8.1 支持受信任和不受信任的非 3gpp 访问的一般概念 40 4.2.8.1 支持电缆接入的一般概念 41 4.2.8.2 可信和不可信非 3gpp 访问的体系结构参考模型 42 4.2.8.2.1 非漫游架构 42 4.2.8.2.2 LBO 漫游架构 43 4.2.8.2.3 家庭路由漫游架构 45 4.2.8.3 受信任和不受信任的非 3gpp 访问的参考点 47 4.2.8.3.1 概述 47 4.2.8.3.2 对 TA 48 的要求 4.2.8.4 有线接入网体系结构参考模型 48 4.2.8.5 从不支持 5GC NAS 的设备通过 WLAN 访问 5GC 49 4.2.8.5.1 概述 49 4.2.8.5.2 参考架构 49 4.2.8.5.3 网络功能 50 4.2.8.5.4 参考点 50 4.2.9 网络分析架构 50 4.2.10 ATSSS 支持的架构参考模型 51 4.3 与 EPC 的互通 52 4.3.1 非漫游架构 52 4.3.2 漫游架构 53 4.3.3 5GC 通过非 3GPP 接入与 E-UTRAN 连接到 EPC 55 之间的互通 4.3.3.1 非漫游架构 55 4.3.3.2 漫游架构 56 4.3.4 与 EPC 连接的 EPDG 与 5GS 的互通 58 4.3.4.1 非漫游架构 58 4.3.4.2 漫游架构 59 4.3.5 互通场景中的服务暴露 61 4.3.5.1 非漫游架构 61 4.3.5.2 漫游架构 62 4.4 特定服务 63 4.4.1 公共报警系统 63 4.4.2 NAS 上的 SMS 63 4.4.2.1 通过 NAS 支持 SMS 的体系结构 63 4.4.2.2 支持 NAS 65 上的 SMS 的参考点 4.4.2.3 基于服务的接口,支持 NAS 65 上的 SMS 4.4.3 国际监测系统支持 65 4.4.4 定位服务 65 4.4.4.1 支持定位服务的体系结构 65 4.4.4.2 支持定位服务的参考点 65 4.4.4.3 支持位置服务的基于服务的接口 65 4.4.5 应用程序触发服务 66 4.4.6 5G LAN 型服务 66 4.4.6.1 支持 5G LAN 类型服务的用户平面结构 66 4.4.6.2 支持 5G LAN 类型服务的参考点 66 4.4.7 msisdn-less-mo-sms 服务 66 4.4.8 时间敏感通信 67 4.4.8.1 概述 67 3GPP 错误!文档中没有指定样式的文字。 4 3GPP TS 23.501 V16.1.0(2019-06 年) 4.4.8.2 支持时间敏感通信的体系结构 67 5 高级功能 68 5.1 概述 68 5.2 网络访问控制 68 5.2.1 概述 68 5.2.2 网络选择 68 5.2.3 识别和认证 69 5.2.4 授权 69 5.2.5 访问控制和限制 69 5.2.6 政策控制 70 5.2.7 合法拦截 70 5.3 注册和连接管理 70 5.3.1 概述 70 5.3.2 登记管理 70 5.3.2.1 概述 70 5.3.2.2 5GS 注册管理状态 70 5.3.2.2.1 概述 70 5.3.2.2.2 RM-注销状态 70 5.3.2.2.3 RM 注册国 71 5.3.2.2.4 5GS 注册管理状态模型 71 5.3.2.3 登记区管理 72 5.3.2.4 支持在 3gpp 和非 3gpp 访问上注册的 UE 72 5.3.3 连接管理 74 5.3.3.1 概述 74 5.3.3.2 5GS 连接管理状态 74 5.3.3.2.1 概述 74 5.3.3.2.2 CM-空闲状态 74 5.3.3.2.3 CM-连接状态 75 5.3.3.2.4 5GS 连接管理状态模型 76 5.3.3.2.5 cm-连接 RRC 非活动状态 76 5.3.3.3 NAS 信号连接管理 78 5.3.3.3.1 概述 78 5.3.3.3.2 NAS 信号连接建立 78 5.3.3.3.3 NAS 信号连接释放 78 5.3.3.4 支持通过 3gpp 和非 3gpp 访问连接的 UE 79 5.3.4 UE 移动性 79 5.3.4.1 流动限制 79 5.3.4.1.1 概述 79 5.3.4.1.2 服务区域限制管理 80 5.3.4.2 机动性模式 82 5.3.4.3 无线电资源管理功能 82 5.3.4.4 UE 移动事件通知 82 5.4 3GPP 访问特定方面 83 5.4.1 在 CM-IDLE 中的 UE 可达性 83 5.4.1.1 概述 83 5.4.1.2 当 UE 为 CM-IDLE 时,允许移动端接数据的 UE 可达性 84 5.4.1.3 仅移动启动连接(MICO)模式 84 5.4.2 在 CM-CONNECTED 中的 UE 可达性 85 5.4.3 寻呼策略处理 86 5.4.3.1 概述 86 5.4.3.2 寻呼策略差异 86 5.4.3.3 寻呼优先级 87 3GPP 错误!文档中没有指定样式的文字。 5 3GPP TS 23.501 V16.1.0(2019-06 年) 5.4.4 UE 无线电能力处理 87 5.4.4.1 在 AMF 87 中的 UE 无线电能力信息存储 5.4.4.1A UE 无线电能力信号优化(RACS)88 5.4.4.2 无效 89 5.4.4.2A UE 无线电能力匹配请求 89 5.4.4.3 寻呼辅助信息 90 5.4.4aue-mm 核心网络能力处理 90 5.4.4b UE 5GSM 核心网络能力处理 91 5.4.5 DRX(不连续接收)框架 91 5.4.6 运行优化的核心网络协助信息 91 5.4.6.1 概述 91 5.4.6.2 核心网络辅助运行参数调整 92 5.4.6.3 核心网络辅助运行寻呼信息 93 5.4.7 NG-RAN 位置报告 93 5.5 非 3gpp 访问特定方面 93 5.5.0 概述 93 5.5.1 登记管理 93 5.5.2 连接管理 94 5.5.3 可用性 95 5.5.3.1 可访问性(cm-idle 95) 5.5.3.2 在 CM-Connected 95 中的 UE 可到达性 5.6 会议管理 96 5.6.1 概述 96 5.6.2 AMF 和 SMF 98 之间的相互作用 5.6.3 漫游 100 5.6.4 带有多个 PDU 会话锚定的单个 PDU 会话 101 5.6.4.1 概述 101 5.6.4.2 为 PDU 会话 101 使用 UL 分类器 5.6.4.3 为 PDU 会话 103 使用 IPv6 多归位 5.6.5 支持局域网 104 5.6.6 建立 PDU 会话期间由 DN-AAA 服务器进行的二级身份验证/授权 106 5.6.7 应用功能对交通路由的影响 108 5.6.7.1 概述 108 5.6.7.2 在与 AFS 113 协调的基础上加强上行路径管理 5.6.8 选择性激活和停用现有 PDU 会话的上行连接 114 5.6.9 会议和服务连续性 115 5.6.9.1 概述 115 5.6.9.2 SSC 模式 115 5.6.9.2.1 SSC 模式 1 115 5.6.9.2.2 SSC 模式 2 115 5.6.9.2.3 SSC 模式 3 116 5.6.9.3 SSC 模式选择 116 5.6.10 不同 PDU 会话类型的具体方面 117 5.6.10.1 IP PDU 会话类型 117 的支持 5.6.10.2 支持以太网 PDU 会话类型 117 5.6.10.3 支持非结构化 PDU 会话类型 119 5.6.11 SMF 在报告使用情况的利益领域存在 UE 119 5.6.12 网络实例的使用 121 5.6.13 始终在 PDU 会议 121 上 5.6.14 框架布线的支撑 121 5.7 QoS 模型 122 5.7.1 概述 122 3GPP 错误!文档中没有指定样式的文字。 6 3GPP TS 23.501 V16.1.0(2019-06 年) 5.7.1.1 QoS 流 122 5.7.1.2 QoS 配置文件 122 5.7.1.3 QoS 流的控制 123 5.7.1.4 QoS 规则 123 5.7.1.5 QoS 流映射 124 5.7.1.6 DL 流量 126 5.7.1.7 UL 流量 126 5.7.1.8 AMBR/MFBR 执行和费率限制 126 5.7.1.9 优先值 127 5.7.2 5G QoS 参数 127 5.7.2.1 5QI 127 5.7.2.2 ARP 127 5.7.2.3 RQA 128 5.7.2.4 通知控制 128 5.7.2.5 比特率 129 5.7.2.6 总比特率 129 5.7.2.7 默认值 129 5.7.2.8 最大丢包率 130 5.7.2.9 有线接入网络特定 5G QoS 参数 130 5.7.3 5G QoS 特性 130 5.7.3.1 概述 130 5.7.3.2 资源类型 131 5.7.3.3 优先级 131 5.7.3.4 包延迟预算 131 5.7.3.5 包错误率 132 5.7.3.6 平均窗口 132 5.7.3.7 最大数据突发量 132 5.7.4 标准化 5qi 到 qos 特征映射 133 5.7.5 反射 QoS 136 5.7.5.1 概述 136 5.7.5.2 UE 派生的 QoS 规则 136 5.7.5.3 反射 QoS 控制 137 5.7.6 分组滤波器组 138 5.7.6.1 概述 138 5.7.6.2 IP 包滤波器组 138 5.7.6.3 以太网分组滤波器组 139 5.8 用户平面管理 139 5.8.1 概述 139 5.8.2 功能描述 140 5.8.2.1 概述 140 5.8.2.2 UE IP 地址管理 140 5.8.2.2.1 概述 140 5.8.2.2.2 路由规则配置 142 5.8.2.2.3 无状态 IPv6 地址自动配置程序 142 5.8.2.3 CN 隧道信息管理 143 5.8.2.3.1 概述 143 5.8.2.3.2 SMF 143 中的 CN 隧道信息管理 5.8.2.3.3 UPF 143 中的 CN 隧道信息管理 5.8.2.4 交通检测 143 5.8.2.4.1 概述 143 5.8.2.4.2 交通检测信息 143 5.8.2.5 用户平面转发控制 144 5.8.2.6 充电和使用监控处理 145 3GPP 错误!文档中没有指定样式的文字。 7 3GPP TS 23.501 V16.1.0(2019-06 年) 5.8.2.6.1 概述 145 5.8.2.6.2 激活 UPF 146 中的使用报告 5.8.2.6.3 向 SMF 146 报告使用信息 5.8.2.7 PDU 会话和 QoS 流策略 147 5.8.2.8 PCC 相关功能 147 5.8.2.8.1 激活/停用预定义 PCC 规则 147 5.8.2.8.2 动态 PCC 规则的执行 147 5.8.2.8.3 重定向 148 5.8.2.8.4 支持 PFD 管理 148 5.8.2.9 发送“结束标记”功能 149 5.8.2.9.0 简介 149 5.8.2.9.1 UPF 构建“端标记”包 149 5.8.2.9.2 SMF 构建“端标记”包 149 5.8.2.10 上行隧道管理 149 5.8.2.11 N4 会话管理参数 150 5.8.2.11.1 概述 150 5.8.2.11.2 N4 会议背景 151 5.8.2.11.3 包检测规则 151 5.8.2.11.4 QoS 实施规则 152 5.8.2.11.5 使用报告规则 154 5.8.2.11.6 转发操作规则 156 5.8.2.11.7 UPF 158 生成的使用报告 5.8.2.11.8 多访问规则 159 5.8.2.12 报告 PDU 会话中使用的 UE MAC 地址 160 5.8.2.13 支持 5G VN 组通信 160 5.8.2.13.0 概述 160 5.8.2.13.1 支持 5G VN 161 的单播流量转发 5.8.2.13.2 支持 UE 移动性导致的单播流量转发更新 162 5.8.3 显式缓冲区管理 162 5.8.3.1 概述 162 5.8.3.2 UPF 162 的缓冲 5.8.3.3 SMF 163 处的缓冲 5.8.4 SMF 暂停充电 163 5.9 标识符 163 5.9.1 概述 163 5.9.2 订阅永久标识符 163 5.9.2A 订阅隐藏标识符 164 5.9.3 永久设备标识符 164 5.9.4 5G 全球唯一临时标识符 164 5.9.5 AMF 名称 165 5.9.6 数据网络名称(DNN)165 5.9.7 内部组标识符 165 5.9.8 通用公共订阅标识符 166 5.9.9 AMF UE NGAP 编号 166 5.9.10 UE 无线电能力 ID 166 5.10 安全方面 166 5.10.1 概述 166 5.10.2 非 3gpp 接入安全模型 167 5.10.2.1 信号安全 167 5.10.3 PDU 会话用户机安全 167 5.11 支持双重连接、多重连接 168 5.11.1 支持双重连接 168 3GPP 错误!文档中没有指定样式的文字。 8 3GPP TS 23.501 V16.1.0(2019-06 年) 5.12 充电 169 5.12.1 概述 169 5.12.2 二级大鼠使用数据报告 169 5.12.3 二级大鼠定期使用数据报告程序 170 5.13 支持边缘计算 170 5.14 政策控制 171 5.15 网络切片 171 5.15.1 概述 171 5.15.2 网络切片的识别和选择:S-NSSAI 和 NSSAI 172 5.15.2.1 概述 172 5.15.2.2 标准化 SST 值 173 5.15.3 订阅方面 173 5.15.4 UE NSSAI 配置和 NSSAI 存储方面 173 5.15.4.1 概述 173 5.15.4.1.1 UE 网片配置 173 5.15.4.1.2 将允许的 NSSAI 和请求的 NSSAI 中的 S-NSSAI 值映射到 HPLMN 175 中使用的 S-NSSAI 值 5.15.4.2 更新 UE 网片配置 176 5.15.5 详细操作概述 176 5.15.5.1 概述 176 5.15.5.2 选择支持网络切片的服务 AMF 176 5.15.5.2.1 注册到一组网络切片 176 5.15.5.2.2 为 UE 181 修改网络切片集 5.15.5.2.3 由于网络切片支持,AMF 重新分配 182 5.15.5.3 在网络切片中建立 PDU 会话 182 5.15.6 漫游网络切片支持 183 5.15.7 网络切片及与 EPS 的互通 184 5.15.7.1 概述 184 5.15.7.2 空闲模式方面 185 5.15.7.3 连接模式方面 185 5.15.8 PLMN 中网络切片可用性的配置 185 5.15.9 操作员控制的 NSSAI 纳入接入层连接设施 186 5.15.10 特定于网络切片的身份验证和授权 187 5.16 对特定服务的支持 188 5.16.1 公共报警系统 188 5.16.2 NAS 上的短信 188 5.16.2.1 概述 188 5.16.2.2 通过 NAS 传输的短信 188 5.16.3 国际监测系统支持 188 5.16.3.1 概述 188 5.16.3.2 通过 3gpp 访问支持的 IMS 语音转换 PS 会话指示 189 5.16.3.2A 通过非 3gpp 访问支持的 IMS 语音交换 PS 会话指示 189 5.16.3.3 同构支持 IMS 语音交换 PS 会话支持指示 190 5.16.3.4 P-CSCF 地址传递 190 5.16.3.5 UE 发起会话/呼叫的域选择 190 5.16.3.6 IMS 语音的终止域选择 191 5.16.3.7 UE 的使用设置 191 5.16.3.8 UE 发起 SMS 191 的域和访问选择 5.16.3.8.1 支持 IP 191 上的 SMS 的支持 IMS 的 UE 的 UE 发起 SMS 5.16.3.8.2 超过 NAS 的短消息访问选择 192 5.16.3.9 SMF 支持 P-CSCF 恢复程序 192 5.16.3.10 5GS 中通过 EPS 回退或 RAT 回退的 IMS 语音服务 192 5.16.3.11 P-CSCF 发现和选择 192 3GPP 错误!文档中没有指定样式的文字。 9 3GPP TS 23.501 V16.1.0(2019-06 年) 5.16.3.12 HSS 发现和选择 193 5.16.4 应急服务 193 5.16.4.1 简介 193 5.16.4.2 应急服务体系结构参考模型 195 5.16.4.3 应急服务的流动限制和准入限制 195 5.16.4.4 可达性管理 196 5.16.4.5 应急服务的 SMF 和 UPF 选择功能 196 5.16.4.6 应急服务的 QoS 196 5.16.4.7 应急服务 PCC 196 5.16.4.8 IP 地址分配 197 5.16.4.9 应急服务 PDU 会议的处理 197 5.16.4.9A 处理紧急登记 UES 正常服务的 PDU 会议 197 5.16.4.10 仅支持 eCall 模式 197 5.16.4.11 应急服务回退 198 5.16.5 多媒体优先服务 198 5.16.6 关键任务服务 199 5.17 互通与迁移 200 5.17.1 支持从 EPC 迁移到 5GC 200 5.17.1.1 概述 200 5.17.1.2 支持与 EPS 202 互通的用户平面管理 5.17.2 与 EPC 202 的互通 5.17.2.1 概述 202 5.17.2.2 与 N26 接口 204 的互通程序 5.17.2.2.1 概述 204 5.17.2.2.2 单注册模式下的 UES 移动性 205 5.17.2.3 无 N26 接口的互通程序 206 5.17.2.3.1 概述 206 5.17.2.3.2 单注册模式下的 UE 移动性 207 5.17.2.3.3 双重注册模式下的 UE 移动性 208 5.17.2.3.4 连接状态下的 UE 重定向 209 5.17.2.4 5GS 和 Geran/Utran 209 之间的机动性 5.17.3 在非 3GPP PDU 会议上与 EPC 进行互动 209 5.17.4 EPS 与 5GS 210 的网络共享支持与互通 5.17.5 互通场景中的服务暴露 210 5.17.5.1 概述 210 5.17.5.2 支持监控事件的互通 211 5.17.5.2.1 与 N26 接口 211 的互通 5.17.5.2.2 无 N26 接口的互通 211 5.17.6 互通场景中的服务暴露 211 5.17.6.1 服务 API 211 的可用性或预期级别 5.17.7 NG-RAN 和 E-UTRAN 之间的配置转移程序 212 5.17.7.1 NG-RAN 和 E-UTRAN 之间配置转换的架构原则 212 5.17.7.2 寻址、路由和中继 213 5.17.7.2.1 寻址 213 5.17.7.2.2 路线 213 5.17.7.2.3 继电保护 213 5.18 网络共享 213 5.18.1 一般概念 213 5.18.2 网络共享广播系统信息 214 5.18.2A 网络共享的 PLMN 列表处理 214 5.18.3 UE 的网络选择 215 5.18.4 网络选择 215 3GPP 错误!文档中没有指定样式的文字。 10 3GPP TS 23.501 V16.1.0(2019-06 年) 5.18.5 网络共享和网络切片 215 5.19 控制平面负荷控制、拥塞和过载控制 216 5.19.1 概述 216 5.19.2 TNLA 负载平衡和 TNLA 负载重新平衡 216 5.19.3 AMF 负载平衡 216 5.19.4 AMF 负载重新平衡 216 5.19.5 AMF 过载控制 217 5.19.5.1 概述 217 5.19.5.2 AMF 过载控制 217 5.19.6 SMF 过载控制 218 5.19.7 NAS 级拥塞控制 218 5.19.7.1 概述 218 5.19.7.2 一般 NAS 级拥塞控制 218 5.19.7.3 基于 DNN 的拥塞控制 220 5.19.7.4 基于 S-NSSAI 的拥塞控制 221 5.19.7.5 特定于组的 NAS 级别拥塞控制 222 5.19.7.6 控制平面数据特定 NAS 级拥塞控制 222 5.20 网络能力外部暴露 223 5.20A 从 AF 224 采集数据 5.21 虚拟化部署的体系结构支持 224 5.21.0 概述 224 5.21.1 氮气 225 的建筑支架 5.21.1.1 TNL 协会 225 5.21.1.2 NGAP UE TNLA 绑定 225 5.21.1.3 氮气 TNL 关联选择 225 5.21.2 AMF 管理 226 5.21.2.1 AMF 添加/更新 226 5.21.2.2 AMF 计划拆除程序 226 5.21.2.2.1 部署了 UDSF 的 AMF 计划拆除程序 226 5.21.2.2.2 无 UDSF 的 AMF 计划拆除程序 228 5.21.2.3 AMF 自动恢复程序 229 5.21.3 带机组的网络可靠性支持 231 5.21.3.1 概述 231 5.21.3.2 NF 集和 NF 服务集 231 5.21.3.3 同一个 nf 集内 nf 实例的可靠性 231 5.21.3.4 NF 服务的可靠性 231 5.21.4 网络功能/nf 服务上下文传输 232 5.21.4.1 概述 232 5.22 优先机制的系统使能器 232 5.22.1 概述 232 5.22.2 与认购相关的优先机制 232 5.22.3 与调用相关的优先级机制 233 5.22.4 应用于已建立的 QoS 流的 QoS 机制 234 5.23 支持异步通信 234 5.24 3GPP PS 数据关闭 235 5.25 支持 OAM 功能 235 5.25.1 跟踪支持:基于信令的跟踪激活/停用 235 5.25.2 支持基于 OAM 的 5G VN 集团管理 236 5.26 配置转移程序 236 5.26.1 配置转移的架构原则 236 5.26.2 寻址、路由和中继 237 5.26.2.1 寻址 237 3GPP 错误!文档中没有指定样式的文字。 11 3GPP TS 23.501 V16.1.0(2019-06 年) 5.26.2.2 路线 237 5.26.2.3 继电保护 237 5.27 时间敏感通信 238 5.27.0 概述 238 5.27.1 TSN 时间同步 238 5.27.1.1 概述 238 5.27.1.2 定时信息的分发 238 5.27.1.2.1 5G 内部系统时钟分布 238 5.27.1.2.2 TSN 时钟分布及时间戳 239 5.27.1.3 支持多个 TSN 工作域 239 5.27.1a 周期性确定性 QoS 239 5.27.2 TSC 援助信息(TSCAI)240 5.27.3 支持 TSC QoS 流 240 5.27.4 保持和向前缓冲机构 240 5.27.5 5G 系统电桥延迟 241 5.28 支持与 TSN 241 集成 5.28.1 5GS 逻辑 TSN 网桥管理 241 5.28.2 5GS 网桥配置的 QoS 参数映射 243 5.28.3 5GS 中的端口管理信息交换 243 5.28.3.1 概述 243 5.28.4 QoS 映射表 243 5.29 支持 5G LAN 类型服务 244 5.29.1 概述 244 5.29.2 5G VN 集团管理 245 5.29.3 PDU 会话管理 246 5.29.4 用户飞机处理 246 5.30 对非公用网络的支持 247 5.30.1 概述 247 5.30.2 独立的非公用网络 247 5.30.2.1 标识符 247 5.30.2.2 广播系统信息 247 5.30.2.3 UE 配置和订阅方面 248 5.30.2.4 SNPN 接入方式下的网络选择 248 5.30.2.5 网络访问控制 248 5.30.2.6 SNPN 接入模式中的细胞(RE-)选择 249 5.30.2.7 通过独立的非公用网络访问 PLMN 服务 249 5.30.2.8 通过 PLMN 249 访问独立的非公用网络服务 5.30.3 公共网络集成 NPN 250 5.30.3.1 概述 250 5.30.3.2 标识符 250 5.30.3.3 UE 配置、订阅特性和存储 250 5.30.3.4 网络和小区(RE-)选择和访问控制 251 5.30.3.5 支持 CAG 单元的应急服务 252 5.31 支持细胞物联网 252 5.31.1 概述 252 5.31.2 首选和支持的网络行为 252 5.31.3 EPS 和 5GS 253 之间的选择、转向和重定向 5.31.4 控制平面 CIOT 5GS 优化 254 5.31.4.1 概述 254 5.31.4.2 控制平面 CIOT 5GS 优化中数据传输期间 N3 数据传输的建立 255 5.31.5 非 IP 数据传输(NIDD)255 5.31.6 可靠数据服务 255 3GPP 错误!文档中没有指定样式的文字。 12 3GPP TS 23.501 V16.1.0(2019-06 年) 5.31.7 节能增强功能 256 5.31.7.1 概述 256 5.31.7.2 CM-空闲和 CM-连接 RRC-非活动的扩展不连续接收(DRX)256 5.31.7.2.1 概述 256 5.31.7.2.2 与 5GC 258 相连的 E-UTRA 中扩展空闲模式 DRX 的寻呼 5.31.7.3 延长连接时间的 MICO 模式 259 5.31.7.4 激活时间为 259 的 MICO 模式 5.31.7.5 MICO 模式和定期登记计时器控制 259 5.31.8 高延迟通信 260 5.31.9 支持监控事件 260 5.31.10 NB IOT UE 无线电能力处理 261 5.31.11 大鼠间空闲模式移入和移出 NB IOT 261 5.31.12 限制使用增强覆盖 261 5.31.13 寻呼以增强覆盖 262 5.31.14 支持用户数据速率控制 262 5.31.14.1 概述 262 5.31.14.2 服务 PLMN 速率控制 262 5.31.14.3 小数据速率控制 263 5.31.15 控制平面数据传输拥塞控制 264 5.31.16 服务差距控制 264 5.31.17 NB IOT 266 的用户间 QoS 5.31.18 用户平面 CIOT 5GS 优化 266 5.32 支持 ATSSS 267 5.32.1 概述 267 5.32.2 多访问 PDU 会话 267 5.32.3 ATSSS 控制政策 269 5.32.4 QoS 支持 269 5.32.5 接入网络性能测量 270 5.32.5.1 一般原则 270 5.32.5.2 往返时间测量 270 5.32.5.3 访问可用性/不可用性报告 271 5.32.5.4 用户平面测量和测量报告协议栈 272 5.32.6 转向功能的支持 272 5.32.6.1 概述 272 5.32.6.2 高级转向功能 274 5.32.6.2.1 MPTCP 功能 274 5.32.6.3 低层转向功能 274 5.32.6.3.1 ATSSS-LL 功能 274 5.32.7 与 EPS 274 的互通 5.32.8 ATSSS 规则 275 5.33 支持超可靠的低延迟通信 276 5.33.1 概述 276 5.33.2 高可靠性通信的冗余传输 276 5.33.2.1 基于双连接的端到端冗余用户平面路径 276 5.33.2.2 支持 N3/N9 接口上的冗余传输 278 5.33.2.3 支持传输层 280 的冗余传输 5.34 支持特定 SMF 服务区域的部署拓扑 280 5.34.1 概述 280 5.34.2 建筑 281 5.34.2.1 SBA 架构 281 5.34.2.2 非漫游架构 281 5.34.2.3 漫游架构 282 3GPP 错误!文档中没有指定样式的文字。 13 3GPP TS 23.501 V16.1.0(2019-06 年) 5.34.3 I-SMF 选择 282 5.34.4 I-SMF 283 控制的 PDU 会话使用 UL 分类器 5.34.5 i-smf 283 控制的 PDU 会话使用 ipv6 多归位 5.34.6 i-smf 和 smf 之间的交互,以支持 i-smf 284 控制的 upf 的流量卸载 5.34.6.1 概述 284 5.34.6.2 N4 从 SMF 向 I-SMF 发送的本地流量卸载信息 285 6 网络功能 285 6.1 概述 285 6.2 网络功能功能描述 285 6.2.1 AMF 285 6.2.2 脱脂奶粉 287 6.2.3 UPF 288 6.2.4 PCF 288 6.2.5 内福 289 6.2.5.1 对 Capif 290 的支持 6.2.5a 中间 NEF 290 6.2.6 NRF 290 6.2.7 UDM 291 6.2.8 澳大利亚联邦 292 6.2.9 N3IWF 292 型 6.2.9A TNGF 293 6.2.10 自动对焦 293 6.2.11 UDR 293 6.2.12 UDSF 294 6.2.13 平方英尺 294 6.2.14 全国社保基金 294 6.2.15 5G-EIR 294 6.2.16 低分子量纤维 294 6.2.17 SEPP 294 号 6.2.18 网络数据分析功能(NWDAF)295 6.2.19 SCP 295 标准 6.2.20 w-agf 296 型 6.2.21 UE 无线电能力管理功能(UCMF)296 6.3 网络功能与网络功能服务发现与选择原则 296 6.3.1 概述 296 6.3.1.0 绑定、选择和重新选择原则 297 6.3.1.1 与间接通信相关的 NF 发现和选择方面 298 6.3.1.2 位置信息 298 6.3.2 SMF 发现和选择 299 6.3.3 用户平面功能选择 300 6.3.3.1 概述 300 6.3.3.2 SMF 提供可用的 UPF 301 6.3.3.3 为特定 PDU 会议 301 选择 UPF 6.3.4 AUSF 发现和选择 302 6.3.5 AMF 发现和选择 303 6.3.6 N3IWF 选择 305 6.3.6.1 概述 305 6.3.6.2 独立 N3IWF 选择 305 6.3.6.3 组合式 N3IWF/EPDG 选择 306 6.3.6.4 应急服务的 PLMN 选择 307 6.3.7 PCF 发现和选择 307 6.3.7.0 一般原则 307 6.3.7.1 UE 或 PDU 会话的 PCF 发现和选择 308 3GPP 错误!文档中没有指定样式的文字。 14 3GPP TS 23.501 V16.1.0(2019-06 年) 6.3.7.2 提供适用于多个 UE 的政策要求,从而适用于多个 PCF 309。 6.3.7.3 将针对 IP 地址的 AF 请求绑定到相关 PCF 310 6.3.8 UDM 发现和选择 310 6.3.9 UDR 发现和选择 311 6.3.10 SMSF 发现和选择 311 6.3.11 CHF 发现和选择 311 6.3.12 可信非 3gpp 接入网选择 312 6.3.12.1 概述 312 6.3.12.2 接入网选择程序 313 6.3.12 不支持 5gc NAS over WLAN 315 的设备的访问网络选择 6.3.12A.1 概述 315 6.3.12A.2 接入网选择程序 315 6.3.13 NWDAF 发现和选择 316 7 网络功能服务及说明 317 7.1 网络功能服务框架 317 7.1.1 概述 317 7.1.2 NF 服务使用者-NF 服务生产者交互 317 7.1.3 网络功能服务发现 319 7.1.4 网络功能服务授权 319 7.1.5 网络功能和网络功能服务注册和注销 320 7.2 网络功能服务 320 7.2.1 概述 320 7.2.2 AMF 服务 321 7.2.3 SMF 服务 322 7.2.4 PCF 服务 322 7.2.5 UDM 服务 323 7.2.6 NRF 服务 324 7.2.7 AUSF 服务 324 7.2.8 NEF 服务 325 7.2.9 SMSF 服务 325 7.2.10 UDR 服务 326 7.2.11 5G-EIR 服务 326 7.2.12 NWDAF 服务 326 7.2.13 UDSF 服务 327 7.2.14 全国社保基金服务 327 7.2.15 BSF 服务 327 7.2.16 LMF 服务 327 7.2.17 CHF 服务 327 7.2.18 UCMF 服务 328 7.2.19 自动对焦服务 328 7.3 暴露 328 8 控制和用户平面协议栈 329 8.1 概述 329 8.2 控制平面协议栈 329 8.2.1 5G-AN 和 5G 核心之间的控制平面协议栈:n2 329 8.2.1.1 概述 329 8.2.1.2 安-AMF 330 8.2.1.3 安-SMF 330 8.2.2 UE 和 5GC 330 之间的控制平面协议栈 8.2.2.1 概述 330 8.2.2.2 UE-AMF 332 3GPP 错误!文档中没有指定样式的文字。 15 3GPP TS 23.501 V16.1.0(2019-06 年) 8.2.2.3 UE–SMF 332 8.2.3 5GC 333 中网络功能之间的控制平面协议栈 8.2.3.1 基于服务接口的控制平面协议栈 333 8.2.3.2 SMF 和 UPF 333 之间 N4 接口的控制平面协议栈 8.2.4 不可信非 3gpp 接入控制平面 334 8.2.5 可信非 3gpp 接入控制平面 335 8.2.6 W-5gan 入口控制平面 335 8.3 用户平面协议栈 335 8.3.1 PDU 会话 335 的用户平面协议栈 8.3.2 非可信非 3gpp 接入用户平面图 337 8.3.3 可信非 3gpp 接入用户平面图 337 8.3.4 W-5gan 接入用户平面图 337 8.3.5 5G VN 组基于 N19 转发的用户平面 338 附录 A(资料性附录):基于服务的接口与参考点 339 之间的关系 附录 B(规范性附录):临时身份之间的映射 341 附录 C(资料性附录):计算存储分离的指南和原则 342 附件 D(资料性附录):5GS 支持非公共网络部署方案 343 D.1 简介 343 D.2 支持非公共网络作为 PLMN 343 的一个网络切片 附录 E(资料性附录):NF/NF 服务交互的通信模型 344 E.1 概述 344 附录 F(资料性附录):基于每个设备 346 多个 UE 的冗余用户平面路径 附录 G(资料性附录):SCP 部署示例 349 G.1 概述 349 G.2 基于服务网格 349 的 SCP G.2.1 简介 349 G.2.2 跨越服务网格边界的通信 350 G.3 基于独立部署单元的 SCP 351 G.4 基于基于名称的路由 352 的 SCP 部署示例 G.4.0 一般信息 352 G.4.1 服务注册和服务发现 353 G.4.2 部署场景 354 概述 G.4.3 参考文献 354 附录 H(规范性附录):时间同步进入时间信号 355 附录 H(资料性附录):变更历史 356
5G接通率优化 5G无线接通率排查提升思路 将参数“PDCCH公共空间EPRE相对于小区RE参考功率的偏移”增大,可以提升接通率,但负面影响是减少了PDCCH可用资源,当5G用户较多的时候,可能会导致资源不足。该参数网管截图及路径如下: 第二个参数是“MSG3相对于PRACH的功率偏移”,可以针对MSG4没有携带“PO-PUSCH-Alphaset”,会导致概率性基站收不到UE建立完成消息,主要还是提升UE的发射功率,进而提升RRC连接建立成功率和QoS Flow建立成功率。 HW对该参数的命令是:LST NRDUCELLULPCCONFIG 协议对该参数的定义如下:(取值为-1到6,现网是4,实际值是取值的2倍,也就是8).该参数设置的越小,Msg3的发射功率越低,Msg3被基站成功接收的概率越小,对邻区的干扰越小;该参数设置的越大,Msg3的发射功率越高,Msg3被基站成功接收的概率越大,对邻区的干扰越大。 (一)RRC连接建立成功率 中兴RRC建立失败目前分为三类,定时器超时、接纳失败和其他原因。 定时器超时这里不做过多分析,因为定时器参数设置都是集团管控,全网统一设置,可优化空间不大。 接纳失败的原因主要有参数设置异常、负荷过高等。 其他原因一般是5G基站内部处理异常,比如CPU利用率过高。 总体原因可以归纳如下: 1. 基站故障,优先处理告警; 2. 接入参数异常、最小接入电频等; 3. 有干扰; 4. 用户数过多,导致SR容量不足; 5. 弱场接入。这里有本身弱覆盖、邻区不完善导致切换不及时,包括缺少到4G的邻区,特别是到FDD900的邻区。 6. 基站CPU负荷过高。 (二)QoS Flow建立成功率 QoS Flow属于用户面流程,建立失败的原因有:参数错误、切换失败、无线原因和其他原因。 参数错误涉及的流程:Initial Context Setup Request、PDU session response setup request、PDU session response modify response,可能造成消息携带的QoS Flow Setup Request List中QoS Flow异常释放。 切换流程异常会导致PDU Session Resource Setup Response、PDU Session Resource Modify Resource造成QoS Flow Setup Request List某些QoS Flow异常释放。 无线原因是因为向AMF发送Initial Context Setup Failure、PDU Session Resource Failed to Setup List、Initial Context setup response携带了一个或多个PDU Session的QoS Flow Failed to setup List、PDU Session Resource Modify Response携带一个或多个QoS Flow Failed to add or Modify List。 主要的原因可以归纳如下: 1. 是否关联了E-RAB建立成功率,如果关联,那就和基站侧或无线侧关联较大; 2. 核查节能策略,是否由节能导致建立失败; 3. 干扰 4. 传输故障 5. 部分异常终端或SIM卡异常,加密算法或完整性算法不合理
HGE 系列教材(1) --- 简介 HGE 是一个硬件加速(Hardware accelerated)的2D 游戏引擎(Game Engine), HGE 是一个富有特性的中间件,可以用于开发任何类型的2D 游戏。HGE 封装性良好, 以至于你仅仅需要关系游戏逻辑(Game Logic),而不需要在意DirectX,Windows 消 息循环等。 HGE 架构在DirectX 8.0 之上,能够跑在大多数的Windows 系统上。 1. 选用HGE 的理由: 1)专业化--- 专注于2D 领域 2)简单化--- 非常容易使用 3)技术优势--- 基于Direct3D API 有较好的性能和特性 4)免费--- 对于个人或者商业用户都免费,遵循zlib/libpng license 5)代码高度的一致性--- 代码是否具有一致性,是衡量代码质量的标准之一(《Co de Reading: The Open Source Perspective》) 2. 体系结构: HGE 有3 个抽象层(layers of abstraction): 1)核心函数(Core Functions) 处于核心的函数和例程(routines),被整个系统所依赖。 2)辅助类(Helper Classes) 游戏对象相关的类,架构于HGE Core Functions 层之上,辅助用户进行游戏开发。 3)创作工具(Authoring Tools) 用于游戏开发的一组工具。 从上图可以看见: 1)用于代码只需要架构在HGE Helper Classes 之上 2)通常游戏资源(Game Resources)需要使用HGE 创作工具来产生 3. 体系结构概述: 1)Core Functions 层 <1> 图形格式支持:支持BMP, JPG, PNG, TGA, DDS, DIB 文件格式 <2> 支持窗口模式和全屏模式 <3> 音频支持和音乐回放(music playback):支持WAV, MP3, MP2, MP1 an d OGG 音频文件格式(audio file formats),支持MO3, IT, XM, S3M, MTM, MO D and UMX 音乐文件格式(music file formats),支持压缩流的回放。声音大小和声 道的控制 <4> 输入设备支持:鼠标和键盘 <5> 资源:读取硬盘上的资源,支持ZIP 打包的文件格式 <6> 日志支持 2)Helper Classes 层 <1> 精灵(Sprites)和动画(Animations) 对于所有硬件设备特性的直接支持:锚点(anchor)支持,伸展、缩放、旋转的支持, 不同的回放模式的支持 <2> 字体 读取和渲染(render)位图字体,多种字体排列方式,旋转和缩放字体,字符串宽度计 算等 <3> 粒子系统(particle systems)和网格变形(distortion mesh) 高效的粒子系统,可用于创建烟雾、爆炸、魔法效果等,提供粒子系统的管理,支持定 界盒(bounding box)计算和冲突检测(collision detection) <4> 资源管理:通过简单的函数调用,来创建复杂的对象,自动的内存管理。对于资 源组(resource groups)采用预先缓存和特殊的清除处理(这是一种通过控制对象分配 和释放来提高效率的方法) <5> GUI:强大而灵活的GUI 管理,支持动画式的GUI <6> 矢量(Vectors),对于2D 矢量的完全支持 3)Authoring Tools 层 <1> 资源的打包(pack):HGE 使用ZIP 格式的资源包,你可以使用任何的打包工 具,甚至还可以给资源包加密 <2> 纹理(Texture)工具 <3> 粒子系统编辑器:能够设定粒子的速度,方向,生命周期,轨迹,颜色,透明等 <4> 位图字体编辑器:运行通过系统中已经安装的字体来创建位图字体,你可以使用 图形编辑器来为位图字体添加额外的效果 HGE 系列教材(2) --- 安装 HGE 在HGE 的文档中有详细谈到如何安装的问题,这里讲一下VC6 平台的安装问题: 1. 下载完HGE 之后,需要使用到lib\vc 文件夹下的库文件以及include 目录下的头文 件 2. 打开 Tools->Options->Directories 如上两图,添加路径 3. 在游戏开发中使用HGE 首先建立一个空的Win32 工程,然后选择Project->Settings...->Link 按图所示,输入hge.lib 和hgehelp.lib 当然,也可以使用预编译器指令pragram 来打到同样的目的。 HGE 系列教材(3) --- 初试 HGE 当HGE 安装完成之后,就可以使用了,关于HGE 的安装,可以参考《HGE 系列教材(2) --- 安装HGE》 现在使用HGE 开发一个极小的程序: 1. 包含hge.h 文件,并且定义一个HGE 的指针,通过这个指针,我们可以访问HGE Core Functions 层的函数。 #include HGE *pHge = 0; 使用完HGE 指针之后,需要释放这个指针,pHGE->Release(); 2. 帧函数(Frame Function)是一个用户定义的函数,每一帧时间,它会被HGE Engi ne 调用一次,函数返回true,则调用停止: bool FrameFunc() { if (hge->Input_GetKeyState(HGEK_ESCAPE)) { return true; } return false; } 3. 建立一个WinMain 函数,WinMain 函数是标准的Windows 应用程序入口,这里, 我们首先初始化HGE 指针: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { pHge = hgeCreate(HGE_VERSION); // ... pHge->Release(); return 0; } 通过HGE 指针,我们才可以访问HGE Engine 的接口。调用了hgeCreate 函数之 后,不要忘记了使用Release 函数释放资源。 4. 初始化操作: 有一些初始化操作需要完成,使得程序能够跑起来: // 设置帧函数 pHge->System_SetState(HGE_FRAMEFUNC, FrameFunc); // 设置窗口模式 pHge->System_SetState(HGE_WINDOWED, true); // 设置不使用声音 pHge->System_SetState(HGE_USESOUND, false); // 设置标题为"Minimal HGE" pHge->System_SetState(HGE_TITLE, "Minimal HGE"); 最后需要调用函数System_Initiate 来完成初始化操作,这个函数返回值是一个bool 类型的变量,如果是true 那么表示初始化成功,如果是false 表示出错,这时候可以通 过System_GetErrorMessage 函数来获取错误消息: if (pHge->System_Initiate()) { pHge->System_Start(); } else { MessageBox(NULL, pHge->System_GetErrorMessage(), "Error", MB_O K | MB_ICONERROR | MB_APPLMODAL); } 再程序结束的时候,需要释放资源: pHge->System_Shutdown(); pHge->Release(); 5. 整个完整的程序如下: #include HGE* pHge = 0; bool FrameFunc() { if (pHge->Input_GetKeyState(HGEK_ESCAPE)) { return true; } return false; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { pHge = hgeCreate(HGE_VERSION); pHge->System_SetState(HGE_FRAMEFUNC, FrameFunc); pHge->System_SetState(HGE_WINDOWED, true); pHge->System_SetState(HGE_USESOUND, false); pHge->System_SetState(HGE_TITLE, "HGE 小程序"); if (pHge->System_Initiate()) { pHge->System_Start(); } else { MessageBox(NULL, pHge->System_GetErrorMessage(), "Error", MB_O K | MB_ICONERROR | MB_APPLMODAL); } pHge->System_Shutdown(); pHge->Release(); return 0; } 注意,程序运行之后,一直调用函数FrameFunc 直到用户按下ESC,那么跳到pHge- HGE 系列教材(4) --- 初探 HGE Core Functions 层 HGE Core Functions 层中的函数需要通过HGE 指针来访问,就如《HGE 系列教 材(3) --- 初试HGE》所谈到的一样,通过调用hgeCreate 函数来初始化HGE 指针, HGE Core Functions 层中的函数,大致分层一下几类: 1. 接口函数(Interface functions): hgeCreate --- 初始化HGE 指针,这是一个全局函数,除了这个函数,HGE Cor e Funtions 中所有的函数都需要通过HGE 指针调用。 Release --- 释放HGE 接口,调用了hgeCreate 就应该调用Release 释放。 2. 系统函数(System functions): 这类函数都是以System_ 开头,后面加上表示函数意义的单词(不出现下划线), 之后介绍的函数也将使用这种命名方式,即类型前缀+ 有意义的单词: System_Initiate 初始化相关软件和硬件 System_Shutdown 恢复声音模式并且释放资源 System_Start 开始运行用户定义的帧函数 System_SetState 设置系统内部状态 System_GetState 返回内部状态的值 System_GetErrorMessage 返回最后出错的HGE 错误描述符 System_Log 在日志文件中书写格式化消息 System_Launch 运行一个URL 或者外部的可执行文件或数据文件 System_Snapshot 截屏并保存到一个文件 3. 资源函数(Resource functions): Resource_Load 从硬盘上读取资源到内存中 Resource_Free 从内存中删除读取的资源 Resource_AttachPack 附加一个资源包 Resource_RemovePack 移除一个资源包 Resource_RemoveAllPacks 移除之前关联的所有资源包 Resource_MakePath 建立一个绝对文件路径 Resource_EnumFiles 通过通配符来枚举文件 4. 初始化文件函数(initialization file functions) Ini_SetInt 在初始化文件中写入一个整数值 Ini_GetInt 从初始化文件中读取一个整数值 Ini_SetFloat 在初始化文件中写入一个浮点值(float) Ini_GetFloat 从初始化文件中读取一个浮点值(float) Ini_SetString 在初始化文件中写入一个字符串 Ini_GetString 从初始化文件中读取一个字符串 5. 随机数参数函数(Random number generation functions) Random_Seed 设置随机数产生器的种子 Random_Int 产生int 类型的随机数 Random_Float 产生float 类型的随机数 6. 计时函数(Timer functions) Timer_GetTime 返回从调用System_Initiate 函数到现在所用的时间(单位 为秒) Timer_GetDelta 返回上一次调用帧函数到现在所用的时间(单位为秒) Timer_GetFPS 返回当前FPS 的值 7. 声效函数(Sound effect functions) Effect_Load 载入从硬盘载入声音到内存 Effect_Free 从内存中删除载入的音效和相关的资源 Effect_Play 开始播放音效 Effect_PlayEx 开始播放音效,这个函数含有更多的参数 8. 更多查看HGE 的文档 HGE 系列教材(5) --- 输入、声音和渲染 建议读者对应HGE 的官方的例子:Tutorial 02 - Using input, sound and renderi ng 来阅读本文 渲染: 在HGE 中,四边形是一种图元,对应了结构体hgeQuad,另外还有三角形图元,对应 hgeTriple,为了渲染,我们现在需要使用hgeQuad 结构体,这个结构体如下: struct hgeQuad { hgeVertex v[4]; // 顶点描述了这个四边形 HTEXTURE tex; // 纹理的句柄或者为0 int blend; // 混合模式(blending mode) }; HGE 中图元对应的结构体总含有这3 个部分:顶点,纹理句柄,混合模式 struct hgeVertex { float x, y; // 屏幕的x,y 坐标 float z; // Z-order,范围[0, 1] DWORD col; // 顶点的颜色 float tx, ty; // 纹理的 x,y 坐标(赋值前需要规格化坐标间隔,使得 tx,ty 取 值范围在[0,1]) }; 规格化坐标间隔在后面的例子中会谈到 1. 颜色的表示: 颜色使用32 位表示,从左开始,8 位为Alpha 通道,8 位红色,8 位绿色,8 位蓝色 对于后24 位,如果全部为0,表示黑色,如果全部为1,表示白色 2. 定义颜色的运算: 我们把颜色看成一个四维向量,即alpha 通道,红色,绿色,蓝色这四个分量 <1> 颜色是可以相乘的 颜色的相乘是对应的四个分量分别相乘的结果,即:alpha 通道的值与alpha 通道的 值相乘,红色的值与红色的值相乘,绿色的值与绿色的值相乘,蓝色的值与蓝色的值相乘。 <2> 颜色是可以相加的 同上,对应分量相加。 颜色的每个分量使用浮点数表示,范围是[0-1],相加操作可能导致溢出,一种处理的方式 就是,如果溢出,则设定值为1。 3. 混合模式: 1)BLEND_COLORADD 表示顶点的颜色与纹理的纹元(texel)颜色相加,这使得纹理变亮,可见顶点颜色为0x0 0000000 将不造成任何影响。 2)BLEND_COLORMUL 表示顶点的颜色与纹理的纹元颜色相乘,这使得纹理变暗,可见顶点颜色为0xFFFFFFFF 将不造成任何影响。 注意:必须在1),2)中做一个选择,且只能选择1),2)中的一个。处理的对象是纹理 颜色和顶点颜色。 这里有一个技巧: 如果我们需要在程序中显示一个气球,这个气球的颜色不断变化,这时候我们并不需要准备 多张不同颜色的气球纹理,而只需要一张白色的气球纹理,设置blend 为BLEND_COL ORMUL,白色的R,G,B 值被表示成1.0,也就是说,纹理颜色和顶点颜色相乘的结果是 顶点的颜色,那么就可以通过修改顶点颜色,得到任意颜色的气球了。 3)BLEND_ALPHABLEND 渲染时,将对象的像素颜色(而非顶点的颜色)与当前屏幕的对应像素颜色进行alpha 混 合。alpha 混合使用到alpha 通道,对于两个像素颜色进行如下操作,得到一个颜色: R(C)=alpha*R(B)+(1-alpha)*R(A) G(C)=alpha*G(B)+(1-alpha)*G(A) B(C)=alpha*B(B)+(1-alpha)*B(A) 这里的BLEND_ALPHABLEND 使用的是对象像素的颜色的alpha 通道。可见如果对象像 素颜色alpha 通道为0,那么结果就是只有当前屏幕的像素颜色,也就是常常说的100 % 透明,因此,我们可以理解alpha 混合就是一个是图像透明的操作,0 表示完全透明, 255 表示完全不透明。 4)BLEND_ALPHAADD 渲染时,将对象的像素颜色与当前屏幕的对应像素颜色相加,结果是有了变亮的效果。 注意:这里的3),4)必选其一,且只能选其一。处理的对象是对象像素颜色和屏幕像素 颜色。 5)BLEND_ZWRITE 渲染时,写像素的Z-order 到Z-buffer 6)BLEND_NOZWRITE 渲染时,不写像素的Z-order 到Z-buffer 这里一样是二者选一 设置举例: quad.blend=BLEND_ALPHAADD | BLEND_COLORMUL | BLEND_ZWRITE; // quad 为hgeQuad 变量 4. HGE 渲染 1)定义和初始化hgeQuad 结构体: hgeQuad quad; // 定义四边形 2)初始化hgeQuad 变量: // 设置混合模式 quad.blend=BLEND_ALPHAADD | BLEND_COLORMUL | BLEND_ZWRITE; // 加载纹理 quad.tex = pHGE->Texture_Load("particles.png"); 注意,读取硬盘上资源的时候,可能会失败,因此通常都需要检查,例如: if (!quad.tex) { MessageBox(NULL, "Load particles.png", "Error", 0); } // 初始化顶点 for(int i=0;i<4;i++) { // 设置顶点的z 坐标 quad.v[i].z=0.5f; // 设置顶点的颜色,颜色的格式为0xAARRGGBB quad.v[i].col=0xFFFFA000; } // 这里假定载入的纹理大小为128*128,现在截取由点(96,64),(128,64), (128,96),(96,96)这四个点围成的图形。 quad.v[0].tx=96.0/128.0; quad.v[0].ty=64.0/128.0; // 规格化坐标间隔 quad.v[1].tx=128.0/128.0; quad.v[1].ty=64.0/128.0; quad.v[2].tx=128.0/128.0; quad.v[2].ty=96.0/128.0; quad.v[3].tx=96.0/128.0; quad.v[3].ty=96.0/128.0; 注意,对于hgeQuad 结构体,顶点quad.v[0] 表示左上那个点,quad.v[1] 表示右上 的点,quad.v[2] 表示右下的点,quad.v[3] 表示左下的点。 // 设置hgeQuad 在屏幕中的位置 float x=100.0f, y=100.0f; quad.v[0].x=x-16; quad.v[0].y=y-16; quad.v[1].x=x+16; quad.v[1].y=y-16; quad.v[2].x=x+16; quad.v[2].y=y+16; quad.v[3].x=x-16; quad.v[3].y=y+16; System_SetState(HGE_RENDERFUNC,RenderFunc); RenderFunc 原型和帧函数一样: bool RenderFunc(); 4)编写RenderFunc 函数: bool RenderFunc() { pHGE->Gfx_BeginScene(); // 在如何渲染之前,必须调用这个函数 pHGE->Gfx_Clear(0); // 清屏,使用黑色,即颜色为0 pHGE->Gfx_RenderQuad(&quad); // 渲染 pHGE->Gfx_EndScene(); // 结束渲染,并且更新窗口 return false; // 必须返回false } 补充:Load 函数是和Free 函数成对出现的,即在硬盘上加载了资源之后,需要Free 它们,例如: quad.tex = pHGE->Texture_Load("particles"); // ... pHGE->Texture_Free(quad.tex); 音效: 使用音效是很简单的 1. 载入音效: HEFFECT hEffect = pHGE->Effect_Load("sound.mp3"); 2. 播放: pHGE->Effect_PlayEx(hEffect); 或者pHGE->Effect_Play(hEffect); 1)Effect_Play 函数只接受一个参数就是音效的句柄HEFFECT xx; 2)Effect_PlayEx 函数较为强大,一共有四个参数: HCHANNEL Effect_PlayEx( HEFFECT effect, // 音效的句柄 int volume = 100, // 音量,100 为最大,范围是[0, 100] int pan = 0, // 范围是[-100, 100],-100 表示只使用左声道, 100 表示只使用右声道 float pitch = 1.0, // 播放速度,1.0 表示正常速度,值越大播放 速度越快,值越小播放越慢。这个值要大于0 才有效(不可以等于0) bool loop = false // 是否循环播放,false 表示不循环 ); 输入: 仅仅需要调用函数pHGE->Input_GetKeyState(HGEK_xxx); 来判断输入,应该在帧 函数中调用它,例如: bool FrameFunc() { if (pHGE->Input_GetKeyState(HGEK_LBUTTOM)) // ... if (pHGE->Input_GetKeyState(HGEK_UP)) // ... } HGE 系列教材(6) --- 程序流程与细节 HGE 的一些细节,通过源码可以更加清楚的了解,通过读源码,可以更加高效的使用HG E Engine。 必要的第一步: Help Classes 层建立于Core Functions 层之上,这并不意味着用户只需要关心Help Classes 而忽略Core Functions,因此我们需要获得一个HGE 指针,来使用Core F unctions 的函数: <1> 获取HGE 指针: HGE* pHGE = pgeCreate(HGE_VERSION); <2> 释放HGE 指针: 使用之后,需要释放HGE 指针。 pHGE->Release(); Create 和Release 过程使用了引用计数,也就是说,一般来看,除了第一次的Create 调用之外几乎不消耗CPU 时间和资源,每调用一次Create 函数,引用计数器就加一,只 有在第一次调用的时候才会真正的分配空间,调用Release 会使得引用计数器减一,当它 为0 的时候,才真正是释放资源。因此以下代码是可用的: while(true) { HGE* pHGE = pgeCreate(HGE_VERSION); // 确保不是第一次调用pgeCre ate 函数,因为如果是第一次调用,会分配内存。 // ... do something pHGE->Release(); } 此外,要成对的调用pgeCreate 和Release 函数,每次调用Release 之后,调用它的 指针将被赋值为0,例如: HGE* pHGE = hgeCreate(HGE_VERSION); pHGE->Release(); pHGE->Release(); // ERROR: pHGE == 0 另外,pHGE->Release 会调用pHGE->System_Shutdown(); 必要的第二步: 初始化: pHGE->System_Initiate(); 初始化语句放在Windows 入口函数中,这个函数将按顺序完成 1)窗口类的注册 2)创建窗口 3)初始化子系统 4)显示一个HGE 的LOGO(这个东西在HGE 里面被称之为HGE splash) 一般使用System_Initiate() 都会是这样的: if (pHGE->System_Initiate()) { pHGE->System_Start(); } else { MessageBox(NULL, pHGE->System_GetErrorMessage(), "Error", MB_O K | MB_ICONERROR | MB_APPLMODAL); } 必要的第三步: 调用: pHGE->System_Start(); 调用了System_Start 的目的是开始消息循环,见必要的第二步代码 pHGE->System_Start 和pHGE->System_Shutdown 是成对出现的,处于某些原 因,即使我们知道pHGE->Release 会调用System_Shutdown 函数,我们还是应该 去显示的调用System_Shutdown 函数。System_Shutdown 相比Release 要安全, 我们可以这样调用,而不会出错: pHGE->System_Start(); // ... Something pHGE->System_Shutdown(); pHGE->System_Shutdown(); // OK 不论如何,Create 和Release 成对调用,Start 和Shutdown 成对调用,那么就不会 有问题出现。 还有什么是需要的? System_SetState 函数 常常需要设置窗口大小或者是设置为全屏模式,需要设置是否使用声音等,这一系列操作被 称之为设置系统状态,统一通过调用pHGE->System_SetState 函数来完成,最为关键 的是设置帧函数,调用了pHGE->System_Start 之后,会在绘制每帧图像时调用帧函数。 pHGE->System_SetState(XXX, XXX) 通常可以在如何地方,如何情况下调用,不要 认为它们只能在pHGE->System_Initiate 之前调用 System_SetState 函数的第一个参数表示状态,在内部实现时,它是FSM 的状态,而 第二个参数表示值,通过这个函数,可以绑定状态和相关的值 补充一下,帧函数必须是一个全局函数,而不能是一个类的成员函数,并且帧函数的原型必 须是: bool FunName(void); 惯用法: 我们通常会在程序初始化之前设置状态,即在System_Initiate 调用之前,例如: int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { pHGE->System_SetState(HGE_FRAMEFUNC, FrameFunc); pHGE->System_SetState(HGE_WINDOWED, true); pHGE->System_SetState(HGE_USESOUND, false); pHGE->System_SetState(HGE_TITLE, "HGE"); pHGE->System_SetState(HGE_SHOWSPLASH, false); // 用于去除 L OGO if (pHGE->System_Initiate()) { pHGE->System_Start(); } { MessageBox(NULL, pHGE->System_GetErrorMessage(), "Error", MB_O K | MB_ICONERROR | MB_APPLMODAL); } pHGE->System_Shutdown(); pHGE->Release(); return 0; } HGE 系列教材(7) --- 使用 Helper Classes 字体的使用: 1. 头文件 #include 2. 载入字体 hgeFont* pFont; pFont = new hgeFont("font1.fnt"); // 不要忘记delete fnt 文件是一个字体描述文件(font description file),可以通过创作工具产生 3. 打印字体 pFont->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d (constant)", // 使用中文将出现“??” pHGE->Timer_GetDelta(), pHGE->Timer_GetFPS() ); 在渲染函数中打印文字,HGE 到目前版本1.81 依然不支持中文,只能使用第三方支持。 建议使用微妙的平衡(BOGY)提供的解决方案。 粒子系统的使用: 1. 建立一个hgeSprite 对象,hgeSprite 类的构造函数如下: hgeSprite( HTEXTURE tex, // 纹理的句柄 float x, // sprite 对应的纹理的x 坐标 float y, // sprite 对应的纹理的y 坐标(区别于顶点中的纹理坐标,这里无需规格 化坐标间隔) float w, // sprite 的宽 float h // sprite 的高 ); 注意,sprite 对应的纹理的坐标,是sprite 的左上的坐标。由此可见,一个精灵对应了 纹理中的一个四边形区域,实际的源码中,sprite 类含有一个hgeQuad 成员变量。 如果tex 为0,那么就使用白色作为纹理的数据(texture data) hgeSprite* pSpt = new hgeSprite(tex, 32, 32, 32, 32); 2. 设置混合模式,根据情况设置混合模式,后面详细讨论: pSpt->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_N OZWRITE); // 建议使用BLEND_ALPHAADD,这样看起来效果会好很多(增亮)。 3. 设置锚点(似乎和函数名字有点不符) void SetHotSpot( float x, // 锚点的x 坐标 float y // 锚点的y 坐标 ); 锚点是这样的一个点:进行一些操作的中心点。例如进行旋转操作的中心点,即旋转操作依 赖于这个点。通常设置sprite 的中心点为锚点。 4. 关联hgeParticleSystem pPar = new hgeParticleSystem("trail.psi", m_pSpt); // 关联hgeParticleSys tem psi 文件被称之为粒子系统描述文件(particle system description file),这个文件是 hgeParticleSystemInfo 结构对象的硬盘镜像,这里不做详细介绍。 5. 粒子系统中的基本参数介绍: 系统生命周期(System lifetime):粒子系统的生命周期,在这个周期内会产生新粒子 Emission:每秒产生多少个新的粒子 粒子生命周期(Particle lifetime):特定的某个粒子的生命周期 6. 设定Emission: pPar->info.nEmission=10; 7. 调用Fire 函数 pPar->Fire() 函数会重启粒子系统,但它不会影响当前活跃粒子 pPar->Render(); 9. MoveTo 函数 pPar->MoveTo(x, y); 用于移动粒子系统到(x,y)处 10. Update 函数 pPar->Update(m_pHGE->Timer_GetDelta()); 在帧函数中应该调用Update 且使用参数为m_pHGE->Timer_GetDelta() 使用 hgeSprite 渲染: 前面说了为了渲染,使用了hgeQuad,那样做是复杂的,我们完全可以使用sprite 来实 现,而不需要使用到过多的Core Functions 层的函数。 1. 创建sprite pSpt = new hgeSprite(tex, 96, 64, 32, 32); 2. 设置颜色 pSpr->SetColor(0xFFFFA000); SetColor 函数将为sprite 添加颜色,添加的方式由混合模式决定,设置混合模式,通过 调用函数pSpr->SetBlendMode 实现。 注意,这里设置的颜色是sprite 中hgeQuad 对象的顶点的颜色,四个顶点颜色将设为 相同,而混合模式设置的是sprite 中的hgeQuad 对象的blend 值。 pSpr->SetBlendMode(BLEND_COLORMUL | BLEND_ALPHAADD | BLEND_NO ZWRITE); // 这里使用的纹理是alpha 通道渐变,颜色为白色的纹理,因此会使用到B LEND_COLORMUL,这点在《HGE 系列教材(5) --- 输入、声音和渲染》做了详细的 说明 3. 设置锚点: pSpr->SetHotSpot(16, 16); 4. 渲染 在渲染函数中,调用pSpr->Render(x, y); 方可 HGE 系列教材(8) --- hgeResourceManager helper class(本文未完成) hgeResourceManager 是一个资源管理类 1. 构造函数 hgeResourceManager( const char* scriptname = 0 ); scriptname 表示资源脚本文件名(Resource script filename),如果此参数为0,表 示不使用Resource script file 现在来介绍一下资源脚本: 资源脚本是一个文本文件,用于定义资源资源文件由多个(或一个)命令(command) 组成,格式如下: Command ResourceName : BaseResourceName { Parameter1=Value1 ; 这里是注释 Parameter2=Value2 ... ParameterN=ValueN } 我们来看一个例子: Resource level1 { filename=levels\level1.dat resgroup=1 } 这里只有一个命令:Resource,Resource 命令定义了一个原生资源(raw resource) 注意,资源文件是大小写敏感的,资源文件中可以有注释,使用“;”开头。资源文件的参数 (parameter)是没有顺序限制的。 同种类型的资源,不可以使用相同的资源名(Resource Name)。在定义资源名或者文件 路径时,出现空格或者特殊字符,需要把整个字符串用双引号引起来。 BaseResourceName 是可选的,如果被指定,那么就表示对BaseResourceName 对 应的参数(Parameters)的拷贝,例如: Sprite wizard { texture=characters rect=0,0,32,32 hotspot=16,16 blendmode=COLORMUL,ALPHABLEND,NOZWRITE resgroup=1 } Sprite orc : wizard { rect=0,64,32,32 ; 设定新值 color=FF808000 ; 设定新值 } 这里orc 除了rect 和color 两个参数以外,其他参数值都和wizard 一样。 hgeResourceManager 是可以容错的,如果脚本出现错误,不会导致程序的终止,错误 信息将被写入日志文件。 1)Command(命令) Command 表明了资源的含义,含有以下几种: Include,Resource,Texture,Sound,Music,Stream,Target,Sprite,Animat ion,Font,Particle,Distortion,StringTable <1> Include 命令:Include 命令用于导入其他的资源脚本文件,例如: Include level2.res ; level2.res 是一个资源脚本文件 注意,自引用和循环引用是可行的,它们会被检查出来,并报告在日志文件中,例如: <2> Resource 命令:定义原生资源(raw resource) 参数: filename,resgroup。例如: Resource level1 { filename=levels\level1.dat ; 可以使用绝对或者相对路径,相对路径是相对于应 用程序所在的文件夹或者是相对于资源包的根目录,特别应该注意的是,如果它是一个相对 路径,相对的是应用程序或者资源包的根目录而不是脚本文件 resgroup=1 ; 资源组(resource group)标识符,0 表示没有特定的组 } <3> Texture 命令:定义一个纹理 参数:filename,mipmap,resgroup。例如: Texture background { filename=images\bg.jpg resgroup=1 } 由于没有设定mipmap 参数的值,因此它取默认值。 <4> Sound 命令:定义一个音效 参数:filename,resgroup。例如: Sound explosion1 { filename=sounds\expl1.ogg resgroup=1 } <5> Music 命令 HGE 系列教材(9) --- GUI(本文未完成) 1. hge 中GUI 对象和控件 hge 中GUI 对象被看作是一个控件的容器,hge 提供了创建GUI 对象的类hgeGUI 类 2. hgeGUI 类 1)AddCtrl 函数 void AddCtrl( hgeGUIObject *ctrl // hgeGUIObject 对象的指针 ); 我们通常可以有这样的写法: gui->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Play")); 这里hgeGUIMenuItem 是一个控件,继承于hgeGUIObject 类,注意,我们创建了 hgeGUIObject 对象,但是却没有去销毁它,因为hgeGUI 类的析构函数会去处理这些 问题。 2)SetNavMode 设置GUI 导航模式(Navigate mode): void SetNavMode( int navmode ); HGEGUI_NONAVKEYS - 无键盘导航 HGEGUI_LEFTRIGHT - 左右按键导航 HGEGUI_UPDOWN - 上下按键导航 HGEGUI_CYCLED - 循环 默认情况下,navmode 被设置为HGEGUI_NONAVKEYS,对于一个菜单,我们可以这 样设置: SetNavMode(HGEGUI_UPDOWN | HGEGUI_CYCLED); 使用上下键导航,并且循环。 设置光标sprite: void SetCursor( hgeSprite *sprite ); 设置光标对应的sprite,如果为0,表示不显示光标,默认情况为0。注意,光标不受G UI 对象的管理,也就是用户必须自己释放光标资源。 4)SetFocus void SetFocus( int id ); 每个控件都有一个对应的ID 号,这个ID 号被称之为控件的标识符,这里通过控件标识 符来设置焦点。键盘事件只会被分发到成为焦点的控件上。 5)Enter 开始GUI Enter 动画 3. hgeGUIObject hgeGUIObject 是一个抽象类,它有一个纯虚函数Render hgeGUIObject 类的子类的对象并不是GUI 对象,而是GUI 控件,这一点应该清楚 1)hgeGUIObject 的成员变量 hgeGUIObject 的成员变量都为public: // 必须在构造函数中初始化的变量 int id; // 控件标识符 bool bStatic; // 如果为true 控件无法成为焦点也不会接受键盘事件,同时它将被 navigate 例程忽略(前面已谈到设置navigate) bool bVisible; // 控件是否可见,如果为false,控件将不被渲染 bool bEnabled; // false 时,控件对用户的输入不作出任何回应,但是控件是可以 接受到用户的通知(区别于bStatic) hgeRect rect; // 控件有界框(bounding box)在屏幕上的区域 DWORD color; // 控件颜色 // 不需要在构造函数中初始化的变量 hgeGUI *gui; // GUI 对象指针 hgeGUIObject *prev; // 连接GUI 对象中的所有控件,子类不需要改变它 // hge 指针 static HGE *hge; 2)void Render(void) 渲染控件到屏幕 3)void Update(float fDt) fDt 上次调用Update 函数到现在所用的时间(单位是秒) 4)void Enter(void) 控件出现在屏幕上的时候被调用,用于播放控件出现时的动画 5)void Leave(void) 控件离开屏幕的时候被调用,用于播放控件离开屏幕的动画 6)bool IsDone(void) 判断控件出现动画和控件离开动画是否播放完毕 7)void Focus(bool bFocused) 控件获得焦点,bFocused 为true,反之为false 8)bool MouseMove(float x, float y) 以控件左上为原点,鼠标指针的坐标。如果控件状态改变,需要通知调用者,那么返回tr ue,否则返回false 9)bool MouseLButton( bool bDown) bDown 如果为true,表示按下鼠标左键,如果bDown 为false,表示松开鼠标左键 10)bool KeyClick( int key, int chr) key 表示按键的虚拟代码(Virtual code of the pressed key),见下表: HGEK_LBUTTON Left mouse button HGEK_RBUTTON Right mouse button HGEK_MBUTTON Middle mouse button (wheel button) HGEK_BACKSPACE BACKSPACE key HGEK_TAB TAB key HGEK_ENTER Any of the two ENTER keys HGEK_SPACE SPACE key HGEK_SHIFT Any of the two SHIFT keys HGEK_CTRL Any of the two CTRL keys HGEK_ALT Any of the two ALT keys HGEK_LWIN Left WINDOWS key HGEK_RWIN Right WINDOWS key HGEK_APPS APPLICATIONS key HGEK_PAUSE PAUSE key HGEK_CAPSLOCK CAPS LOCK key HGEK_NUMLOCK NUM LOCK key HGEK_SCROLLLOCK SCROLL LOCK key HGEK_PGUP PAGE UP key HGEK_PGDN PAGE DOWN key HGEK_HOME HOME key HGEK_END END key HGEK_INSERT INSERT key HGEK_DELETE DELETE key HGEK_LEFT LEFT ARROW key HGEK_UP UP ARROW key HGEK_RIGHT RIGHT ARROW key HGEK_DOWN DOWN ARROW key HGEK_0 Main keyboard '0' key HGEK_1 Main keyboard '1' key HGEK_2 Main keyboard '2' key HGEK_3 Main keyboard '3' key HGEK_4 Main keyboard '4' key HGEK_5 Main keyboard '5' key HGEK_6 Main keyboard '6' key HGEK_7 Main keyboard '7' key HGEK_8 Main keyboard '8' key HGEK_9 Main keyboard '9' key HGEK_A 'A' key HGEK_B 'B' key HGEK_C 'C' key HGEK_D 'D' key HGEK_E 'E' key HGEK_F 'F' key HGEK_G 'G' key HGEK_H 'H' key HGEK_I 'I' key HGEK_J 'J' key HGEK_K 'K' key HGEK_L 'L' key HGEK_M 'M' key HGEK_N 'N' key HGEK_O 'O' key HGEK_P 'P' key HGEK_Q 'Q' key HGEK_R 'R' key HGEK_S 'S' key HGEK_T 'T' key HGEK_U 'U' key HGEK_V 'V' key HGEK_W 'W' key HGEK_X 'X' key HGEK_Y 'Y' key HGEK_Z 'Z' key HGEK_GRAVE Grave accent (`) HGEK_MINUS Main keyboard MINUS key (-) HGEK_EQUALS Main keyboard EQUALS key (=) HGEK_BACKSLASH BACK SLASH key (\) HGEK_LBRACKET Left square bracket ([) HGEK_RBRACKET Right square bracket (]) HGEK_SEMICOLON Semicolon (;) HGEK_APOSTROPHE Apostrophe (') HGEK_COMMA Comma (,) HGEK_PERIOD Main keyboard PERIOD key (.) HGEK_SLASH Main keyboard SLASH key (/) HGEK_NUMPAD0 Numeric keyboard '0' key HGEK_NUMPAD1 Numeric keyboard '1' key HGEK_NUMPAD2 Numeric keyboard '2' key HGEK_NUMPAD3 Numeric keyboard '3' key HGEK_NUMPAD4 Numeric keyboard '4' key HGEK_NUMPAD5 Numeric keyboard '5' key HGEK_NUMPAD6 Numeric keyboard '6' key HGEK_NUMPAD7 Numeric keyboard '7' key HGEK_NUMPAD8 Numeric keyboard '8' key HGEK_NUMPAD9 Numeric keyboard '9' key HGEK_MULTIPLY Numeric keyboard MULTIPLY key (*) HGEK_DIVIDE Numeric keyboard DIVIDE key (/) HGEK_ADD Numeric keyboard ADD key (+) HGEK_SUBTRACT Numeric keyboard SUBTRACT key (-) HGEK_DECIMAL Numeric keyboard DECIMAL key (.) HGEK_F1 F1 key HGEK_F2 F2 key HGEK_F3 F3 key HGEK_F4 F4 key HGEK_F5 F5 key HGEK_F6 F6 key HGEK_F7 F7 key HGEK_F8 F8 key HGEK_F9 F9 key HGEK_F10 F10 key HGEK_F11 F11 key HGEK_F12 F12 key 如果控件状态修改了,希望通知调用者,那么返回true,否则为false

456

社区成员

发帖
与我相关
我的任务
社区描述
其它游戏引擎
社区管理员
  • 其它游戏引擎社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧