samp-node 插件内部架构与 libnode 嵌入

samp-node 插件内部架构与 libnode 嵌入 由 Archify 生成的架构图。 sampgdk · 静态桥接库 · open.mp 宿主 sampgdk 静态桥接库 open.mp Server · 宿主与原生 · open.mp 宿主 open.mp Server 宿主与原生 Load / Unload · 插件导出入口 · 插件导出入口 Load / Unload 插件导出入口 OnPublicCall · 回调分发 · 插件导出入口 OnPublicCall 回调分发 nodeimpl.cpp · 初始化与 Tick · 嵌入运行时 nodeimpl.cpp 初始化与 Tick resource.cpp · bootstrap 装载 · 嵌入运行时 resource.cpp bootstrap 装载 libnode 与 V8 · Node 22 共享库 · 嵌入运行时 libnode 与 V8 Node 22 共享库 events.cpp · 事件注册表 · 事件与原生转换 events.cpp 事件注册表 natives.cpp · 原生参数转换 · 事件与原生转换 natives.cpp 原生参数转换 callbacks.cpp · 公共函数转换 · 事件与原生转换 callbacks.cpp 公共函数转换 entry_file 模块 · 业务脚本入口 · JS 资源层 entry_file 模块 业务脚本入口 @infernus/core · 事件引擎触发 · JS 资源层 @infernus/core 事件引擎触发 全局 samp 对象 · JS 调用入口 · JS 资源层 全局 samp 对象 JS 调用入口 宿主加载 PLUGIN_EXPORT Initialize LoadResource CreateEnv 动态 import register / on OnPublicCall events[name]->call 调用 trigger callNative callPublic InvokeNativeArray open.mp 宿主 插件导出入口 嵌入运行时 事件与原生转换 JS 资源层 图例 前端 后端 云服务

插件导出与启动顺序

  • • Load() 读 samp-node.json,再 Log::Init、sampgdk::Load、Initialize、LoadResource
  • • Supports() 声明 AMX 原生与 PROCESS_TICK 支持
  • • OnPublicCall 查 js_calling_public 防递归;AmxLoad 注册 SAMPNode_CallEvent

libnode 嵌入与 bootstrap

  • • InitializeOncePerProcess,再 MultiIsolatePlatform::Create(4) 与 NewIsolate,并建 uv_loop
  • • functions::init 注入全局 samp,再 CreateEnvironment 装载 bootstrap
  • • bootstrap 设 ipv4first、import entry_file,最后 __internal_esmLoaded 解除等待

单线程事件循环与同步桥

  • • 无独立 Node 线程:ProcessTick 每帧跑微任务、uv_run(NOWAIT)、DrainTasks
  • • async 监听器返回 Promise 时,循环驱动事件循环直到它完成,再取结果
  • • callNative 走 FindNative 并按格式串转换参数;callPublic 遍历所有 AMX 实例