C++ 原生腳本
為 Minecraft Transit Railway 4 的資源包作者提供以 C++ 編寫車輛、PIDS、電梯、裝飾、屏蔽門五類腳本的能力——與 JavaScript 腳本同生命週期、同 API 面,熱路徑零 JVM 穿越。JavaScript 腳本(原版 JCM 的腳本體系)的完整開發文件見下方「JavaScript 腳本」一節。
這是什麼
Joban Client Mod(JCM)原版允許資源包以 JavaScript 編寫動態顯示腳本。Yanyang 分支在此基礎上加入 C++ 原生腳本:把腳本編譯為本機共享程式庫(.dll / .so / .dylib),由模組在遊戲內載入並逐幀驅動。
C++ 腳本與 JS 腳本可以在同一個宣告條目裡混用、同時渲染。模組按檔案特徵自動判定語言——.js 是 JavaScript,其餘按 C++ 模組解析。兩側各自擷取繪製指令、各自回放,互不干擾。
同款腳本模型
create / render / dispose 生命週期與逐實例持久狀態,和 JS 完全一致;快照包裝器逐欄位對齊 JS Wrapper。
零 JNI 傳輸
Java ↔ C++ 經共享記憶體輪詢平面(任意 JDK ≥ 16)或 Panama FFM(JDK 22+)通訊,全程不經 JNI;每幀每實例僅一次宿主穿越。
8 平台原生橋
windows-x64 / windows-arm64 / linux-x64 / linux-arm64 / android-arm64 / macos-x64 / macos-arm64 / ios-arm64 全部內建於 jar,按系統架構自動匹配。
崩潰隔離
腳本崩潰只停用出錯模組本身並留下一行日誌,遊戲行程不受影響;模組內的 C++ 例外同樣被防護攔截。
一幀的旅程
natives/<platform>/ 程式庫檔案
每幀序列化緊湊快照
讀取快照 · 寫入繪製記錄
與 JS 腳本同一渲染路徑
十五行的 PIDS 腳本
#include <mtr/script.hpp>
struct ArrivalState {};
struct ArrivalDisplay : mtr::PidsScript<ArrivalState> {
static constexpr auto ID = "example:arrivals";
void render(mtr::PidsContext& ctx, ArrivalState&, const mtr::Pids& pids) override {
for (int row = 0; row < pids.rows(); row++) {
if (pids.is_row_hidden(row)) continue;
std::string text = pids.get_custom_message(row).str();
if (text.empty() && row < pids.arrivals().size())
text = pids.arrivals().at(row).destination().str();
if (!text.empty())
mtr::Text::create().text(text.c_str())
.pos(2, row * 10.0 + 2).size(pids.width() - 4, 9).draw(ctx);
}
}
};
MTR_REGISTER_PIDS_SCRIPT(ArrivalDisplay)
沒有 JNI、沒有反射、沒有逐呼叫的裝箱——pids.rows()、arrivals().at(i).destination() 都是緊湊快照上的普通記憶體讀取。
什麼時候選 C++
| 情境 | 建議 |
|---|---|
| 高解析度 LCD / 點陣螢幕,每幀重繪大量像素 | C++ Gfx2D 軟體光柵 + 髒矩形上傳,像素不跨 JVM |
| 複雜字串處理 / 逐幀排序 / 數學計算 | C++ 原生計算零配置 |
| 需要呼叫大量 Java API(網路、檔案、聲音管理器) | 皆可 兩側都能經 Api 存取同一批公開物件 |
| 簡單的一次性顯示邏輯 | JS 無需編譯工具鏈,疊代更快 |
相容性
| 項目 | 需求 |
|---|---|
| Minecraft | 1.17.1 – 1.20.4(Fabric / Forge) |
| 前置模組 | Minecraft Transit Railway 4.0.5+(必需);Fabric 版另需 Fabric API |
| Java | 16 及以上;22+ 自動啟用全程零 JNI 的 FFM 平面 |
| ABI | 宿主接受 ABI 6–13 模組;目前 SDK 編譯產出 ABI 13 |
| 工具鏈 | C++17;MSVC / GCC / Clang;CMake ≥ 3.16(建議) |