Opis

[!INFO] Git Commit: 747bdcb | Updated: 2026-10-02

Opis 是 ProfMobius 编写的服务端/客户端性能分析工具(contextual server profiler),现由 GTNewHorizons 维护。定位是纯诊断模组:在本仓中 0 物品 / 0 实体 / 0 配方 / 0 创造标签 / 0 GUI 容器(证据:grep -rn 'registerItem\|addRecipe\|CreativeTabs\|setCreativeTab' --include=*.java src/main/java 全仓 0 命中)。方块数量为 0 —— 仅有的两个方块是默认关闭的调试方块(见下方「方块列表」)。

它不进合成表、不加任何世界内容、不提供物品。全部功能是:16 条服务端指令、一个 Swing 控制面板(23 个页签)、两个 Navigator 地图覆盖层、13 个配置键、一个四接口的扩展 API,以及内嵌的 MobiusCore ASM 探针(12 个计时段)。

分析结果不产出文件,而是直接在客户端 Swing 面板与地图覆盖层上呈现 —— 这与同样定位的 spark 相反 —— spark 把分析结果输出为可点击 URL 交给外部 Web 查看器,而 Opis 全部在游戏内呈现。

modid 与分类名不一致

分类目录名是 opis(小写),但源码中的 modid 是 Opis(大写 O)。这一点在三条独立位置得到确认:

  • src/main/java/mcp/mobius/opis/modOpis.java:74 的 @Mod(modid = "Opis", name = "Opis", version = Tags.VERSION, acceptableRemoteVersions = "*")
  • gradle.properties:10 的 modId = Opis(该属性的注释明确写着 Case-sensitive identifier string ... Conventionally lowercase,但本项目并未遵守小写惯例)
  • @Instance("Opis")(modOpis.java:79)与网络通道名 "Opis"(PacketManager.java:87)

因此游戏中出现的是 Opis:xxx 而非 opis:xxx。这与本 wiki 已有的同类情况一致(display-panels → IC2NuclearControl、horizon-qa → horizonqa)。

方块注册名例外:两个调试方块用的是 GameRegistry.registerBlock(block, "opis.laggen") 这种旧式点分名,不带 Opis 命名空间(modOpis.java:182、:186)。

版本门禁

MC 版本 1.7.10,来自 gradle.properties:24 的 minecraftVersion = 1.7.10(属性键形式,RetroFuturaGradle / 现代 Gradle 约定)。同文件 :27 为 forgeVersion = 10.13.4.1614,:30 为 channel = stable,:33 为 mappingsVersion = 12。

本项目使用 com.gtnewhorizons.gtnhconvention 插件(build.gradle),仓库内的 build.gradle.old 是 ForgeGradle 1.2 时期的遗留文件,不参与构建 —— 其中 build.gradle.old:46 的 version = "1.7.10-10.13.4.1614-1.7.10" 与上述属性一致。

核心模组:gradle.properties:131 的 coreModClass = mobiuscore.asm.CoreDescription,这是一个 FML coremod(ASM 字节码注入),在 Minecraft 类加载前运行。

语言构成

纯 Java,243 个 .java 文件,0 个 .scala / .kt(find . -type f \( -name '*.java' -o -name '*.scala' -o -name '*.kt' \) 按扩展名统计)。其中 27 个文件位于 mcp/mobius/mobiuscore/ 包下,是内嵌的 MobiusCore 探针代码。

lib/MobiusCore 是未 checkout 的 git 子模块(.gitmodules 指向 GTNewHorizons/MobiusCore branch modless),本机不可见,因此其内容不在本条目范围内。

指令列表

共注册 16 条服务端指令(modOpis.java:213-233),全部为顶层指令,/opis 没有子命令。

  • /opis - 唯一入口,打开客户端 Swing 面板;无按键绑定
  • 采集运行控制 - /opis_start、/opis_stop、/opis_reset
  • 采样参数 - /opis_delay、/opis_ticks
  • 排名查询 - /opis_te、/opis_ent、/opis_chunk、/opis_nent、/opis_enttrace
  • 实体操作 - /opis_kill、/opis_killall 及面板侧的批量清理封包
  • 权限管理 - /opis_addpriv、/opis_rmpriv、/opis_help

设置列表

  • 配置项 - 全部 13 个配置键,其中 REMOTE_CONSOLE 整组 3 个键因服务器未启动而失效

面板列表

方块列表

默认状态下方块数为 0。仅当配置键 laggenerator_id 设为非 -1 时才注册两个诊断方块:

  • 调试方块 - opis.laggen(每 tick 阻塞 5 ms)与 opis.debug(构造时打印创建栈)

两个方块均无物品形式、无合成配方、无创造标签,setUnlocalizedName 被注释掉,因此游戏内显示为默认名 + 缺失纹理。详见该条目。

集成列表

两个依赖都是可选软依赖,通过运行时检测启用,缺失时模组照常加载:

  • Navigator - 地图上叠加「区块更新耗时热力图」与「已加载区块」两个图层,需 Navigator ≥ 1.1.7
  • JourneyMap - 把上述两个图层以原生多边形画上 JM6 全屏地图与小地图

探针列表

  • Profiler 计时段 - 内嵌 MobiusCore:FML coremod + 14 个 ASM 转换器 + 12 个计时段

API 列表

  • 扩展 API - mcp.mobius.opis.api 包下 4 个接口/注册器,供其他模组挂接封包与面板页签
  • 网络协议 - 通道 Opis、5 个封包类、69 个 Message 成员与服务端节流

死代码与已知缺陷

以下均为实际代码状态,非推测,每条都附 grep 证据:

  • REMOTE_CONSOLE 配置整组失效:RConServer.instance 的唯一引用在 OpisServerEventHandler.java:32 的 /* */ 块注释内,run() 无调用点,远程控制服务器永不启动。详见 配置项。
  • laggenerator_id 的数值从未被使用:该值只作布尔开关(!= -1),从不用于定位任何实体或区块。全仓仅 3 处引用。详见 调试方块。
  • /opis_chunk 的参数被忽略:CommandChunkList.java:42 传入 Integer.valueOf(astring.length)(参数个数)而非参数值。
  • /opis_nent all 无效果:EntityManager.getCumulativeEntities(boolean filtered) 的方法体不读取 filtered 形参。
  • CommandChunkDump 从未注册:类声明在 commands/server/CommandChunkDump.java:16,getDescription() 字面写着 "Unused",全仓除声明外 0 引用。
  • 3 条客户端指令被注释掉:modOpis.java:229-231 的 CommandClientTest / CommandClientStart / CommandClientShowRenderTick 注册行全部注释,其中 CommandClientShowRenderTick 与 CommandClientStart 的类文件仍存在。
  • VALUE_TIMING_ENTUPDATE 永不发送:客户端注册了 handler、PanelSummary 有分支,但服务端 ServerMessageHandler.java:160 是空分支。
  • /opis_help 漏列 3 条指令:帮助列表硬编码 13 条,缺 /opis、/opis_enttrace(未实现 IOpisCommand)、/opis_help 自身。
  • SelectedTab.PACKETS 无对应面板。
  • fontMC12/16/18/24 声明但从未赋值,只有 fontMC8 被创建。
  • 界面不可本地化:无 .lang 文件,页签名是硬编码英文字符串。