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 相关代码,必须区分:

  1. 子模块:lib/MobiusCore,gitmodules 指向 https://github.com/GTNewHorizons/MobiusCore.git(branch modless)。本机未 checkout(ls lib/MobiusCore 报 No such file or directory)
  2. 仓内副本: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、MonitoredTileList
    • profiler/ —— 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_INVOKE
  • modOpis.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 控制采样节奏