Profiler 计时段
Opis 的探针本体:MobiusCore 的 ASM 核心模组与 12 个计时段。
基本信息
| 属性 | 值 |
|---|---|
| 核心模组入口 | mcp.mobius.mobiuscore.asm.CoreDescription,gradle.properties:131 coreModClass = mobiuscore.asm.CoreDescription |
| 核心模组声明 | @IFMLLoadingPlugin.MCVersion("1.7.10") |
| ASM 转换器 | mcp.mobius.mobiuscore.asm.CoreTransformer |
| 模容器 | mcp.mobius.mobiuscore.asm.CoreContainer |
| Access Transformer | 无(getAccessTransformerClass() 返回 null) |
| 计时段总数 | 12 |
| 计时段所在文件 | src/main/java/mcp/mobius/mobiuscore/profiler/ProfilerSection.java(在 Opis 仓内,非子模块) |
功能
MobiusCore 的两种形态
仓库里有两份 MobiusCore 相关代码,必须区分:
- 子模块:
lib/MobiusCore,gitmodules指向https://github.com/GTNewHorizons/MobiusCore.git(branchmodless)。本机未 checkout(ls lib/MobiusCore报No such file or directory) - 仓内副本:
src/main/java/mcp/mobius/mobiuscore/,共 27 个.java文件(git ls-files src/main/java/mcp/mobius/mobiuscore | wc -l),分三个子包:asm/+asm/transformers/—— 核心模组与 12 个转换器monitors/——MonitoredEntityList、MonitoredList、MonitoredTileListprofiler/——ProfilerSection、IProfilerBase、DummyProfiler
本条目只描述第 2 部分(仓内可读可核实)。子模块中的 Swing UI 框架、网络层等代码本机不可见,不纳入本条目。
README.md 说明了整合的来由:Integration of MobiusCore as opposed to building it as an external mod,理由是 I found that MobiusCore is not depended upon by any other mods, so I thought it OK to integrate it directly.
ASM 转换器清单
asm/transformers/ 下按目标运行环境分 5 组:
| 子包 | 转换器 | 目标 |
|---|---|---|
common |
TransformerASMEventHandler |
ASM 事件处理器 |
common |
TransformerFMLCommonHandler |
FML 通用事件 |
common |
TransformerFMLOutboundHandler |
FML 出站封包 |
common |
TransformerFMLProxyPacket |
FML 代理封包 |
common |
TransformerMessageDeserializer |
封包反序列化 |
common |
TransformerMessageSerializer |
封包序列化 |
common |
TransformerRenderManager |
渲染管理器 |
common |
TransformerTERenderer |
TileEntity 渲染器 |
common |
TransformerWorldServer |
服务端世界 |
forge |
TransformerWorld |
Forge 世界 |
crucible |
TransformerWorldCrucible |
Crucible |
kcauldron |
TransformerWorldKCauldron |
KCauldron |
mcpc |
TransformerWorldCauldron |
MultiMC / Cauldron(MCPC) |
thermos |
TransformerWorldThermos |
Thermos |
后三组(Crucible / KCauldron / Cauldron / Thermos)面向的是 1.6.x 与旧版服务端环境,在 1.7.10 上不会被选中,但代码在仓内。
12 个计时段
ProfilerSection(ProfilerSection.java:8-30)每个成员带两个维度:RunType(REALTIME 或 ONREQUEST)与生效的 Side。
| 计时段 | RunType | Side | 用途 |
|---|---|---|---|
DIMENSION_TICK |
REALTIME | SERVER | 每维度 tick 整体(方块 + 实体) |
TICK |
REALTIME | SERVER | tick 计时 |
PACKET_INBOUND |
REALTIME | SERVER | 入站封包分析 |
PACKET_OUTBOUND |
REALTIME | SERVER | 出站封包分析 |
DIMENSION_BLOCKTICK |
ONREQUEST | SERVER | 维度方块 tick 子段 |
ENTITY_UPDATETIME |
ONREQUEST | SERVER | 逐实体 tick 耗时 |
TILEENT_UPDATETIME |
ONREQUEST | SERVER | 逐 TileEntity tick 耗时 |
NETWORK_TICK |
ONREQUEST | SERVER | 服务端处理封包的耗时 |
EVENT_INVOKE |
ONREQUEST | CLIENT + SERVER | 事件调用计时 |
RENDER_TILEENTITY |
ONREQUEST | CLIENT | TileEntity 渲染 |
RENDER_ENTITY |
ONREQUEST | CLIENT | 实体渲染 |
RENDER_BLOCK |
ONREQUEST | CLIENT | 方块渲染 |
其中 4 个是 REALTIME(activate() 即刻生效),8 个是 ONREQUEST(desactivate() 时被替换成 DummyProfiler)。setProfiler 的实现对 REALTIME 段会同时替换 profilerSuspended 与 profiler。
ProfilerSection.java:17-23 另有 4 个被注释掉的成员(HANDLER_TICKSTART、HANDLER_TICKSTOP、PACKETFML_INBOUND、PACKETFML_OUTBOUND),不计入上表。
探针安装时机
modOpis.load(modOpis.java:190-193):安装 3 个客户端段与 1 个双端段 ——RENDER_TILEENTITY、RENDER_ENTITY、RENDER_BLOCK、EVENT_INVOKEmodOpis.serverStarting(modOpis.java:204-211):安装 8 个服务端段 ——DIMENSION_TICK、DIMENSION_BLOCKTICK、ENTITY_UPDATETIME、TICK、TILEENT_UPDATETIME、PACKET_INBOUND、PACKET_OUTBOUND、NETWORK_TICK
注意 PACKET_INBOUND 与 PACKET_OUTBOUND 各自 new ProfilerPacket(),即两个独立实例、同一实现类(modOpis.java:209-210)。
启停由 ProfilerSection.activateAll(Side) / desactivateAll(Side) 控制,调用点在 run-control 的 /opis_start 与 /opis_stop。
监控列表
monitors/ 包提供三个被 ASM 转换器替换进世界数据结构的列表类型:
MonitoredEntityList<E>—— 替换WorldServer.loadedEntityList,EntityManager.getCumulativeEntities依赖它统计实体数量(EntityManager.java:146-157)。若检测到类型不对,会打日志Improper type detected for entity list in world N. Regenerating tracking list.并重建列表MonitoredTileList—— TileEntity 侧对应MonitoredList—— 通用基类
数值
| 数值名 | 值 |
|---|---|
| 计时段总数 | 12 |
| REALTIME 段 | 4 |
| ONREQUEST 段 | 8 |
| SERVER 专属段 | 8 |
| CLIENT 专属段 | 3 |
| 双端段 | 1(EVENT_INVOKE) |
| 仓内 mobiuscore 文件数 | 27 |
| ASM 转换器数 | 14 |
| 被注释掉的计时段 | 4 |
相关条目
- run-control -
activateAll/desactivateAll的调用点 - swing-ui - 各计时段的数据消费方
- network-protocol -
PACKET_INBOUND/PACKET_OUTBOUND对应的封包 - debug-blocks - 用于制造可测量卡顿的方块
- config -
profiler.delay/profiler.maxpts控制采样节奏