C++ 原生腳本
為 Minecraft Transit Railway 4 資源包之作者而設。以 C++ 撰四類之腳本:曰車輛,曰 PIDS,曰電梯,曰裝飾——與 JavaScript 腳本同其體、同其命、同其法;熱路徑之中,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;每幀每實例,惟一遭宿主之穿越而已。
八平臺原生橋
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 軟體光柵,輔以髒矩形(dirty rectangle)上傳,像素不越 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(薦) |