端侧大模型在游戏引擎的集成工程 2026
把 Unity Sentis、Unreal NNE、Godot + onnxruntime 三家引擎的端侧 LLM 集成路径系统化为“跨平台模型矩阵 + 引擎运行时绑定 + 主循环零阻塞可观测性”的三层工程范式,并用 speculative decoding、KV cache 复用、混合推理的 UX 兜底给出 12 个月窗口内的可落地路径。
约 32 分钟阅读9,529 字3 次阅读博主

把 Unity Sentis、Unreal NNE、Godot + onnxruntime 三家引擎的端侧 LLM 集成路径系统化为“跨平台模型矩阵 + 引擎运行时绑定 + 主循环零阻塞可观测性”的三层工程范式,并用 speculative decoding、KV cache 复用、混合推理的 UX 兜底给出 12 个月窗口内的可落地路径。

2025 年开始,"端侧 LLM 能不能在游戏里跑"不再是悬念,而是"在哪台机型上能跑、跑到什么规模、消耗多少显存、影响多少帧率"。从 Apple Silicon 上的 Core ML 3 跑通 Llama-3-7B 量化版,到高通骁龙 8 Gen 3 上的 Llama.cpp,到 Steam Deck OLED 上用 Vulkan Compute 跑 Mistral-7B-MLX,再到 PS5 / Xbox Series X 的私有 SDK 接入 1B-3B 端侧模型——端侧推理已经从"demo 演示"进入"商用出货"阶段。
但对游戏引擎而言,这并不意味着"塞个 .gguf 进去就行"。一个真正的游戏集成,需要回答至少四类问题:模型文件怎么分平台分发?推理后端怎么跨 iOS / Android / Windows / macOS / Linux / Switch / PS5 / Xbox 八个目标?推理延迟的尾部分位 (p99) 怎么压到 16ms 以内才能塞进主循环而不引起掉帧?以及,一旦玩家从云端 LLM 切换到本地 LLM,UX 边界、对话一致性、moderation、长程记忆的工程契约怎么重新设计?
本文不是"哪个模型最好"的横向评测(已经有大量榜单),也不是"哪个推理框架最快"的 benchmark(那是 MLPerf 的领域)。本文关心的是:当 Unity、Unreal、Godot 三家主流引擎都给出了自己的端侧 AI 集成方案,游戏开发者如何在真实的商业项目中选型、装配、调优、规避已知坑位。我们将从工程角度,把这套原本散落在设备厂商 SDK、引擎插件仓库、模型卡片 README 中的知识,系统化为一组可在 12 个月窗口内落地的工程范式。
把"在游戏里集成端侧 LLM"抽象成一个工程问题,可以用三层约束来刻画:
第一层:模型格式与张量布局
模型从 PyTorch / HuggingFace Transformers 出发,要落到目标设备上,必须经过一次"格式转换 + 张量重排"。常见路径是 PyTorch → ONNX → 目标后端格式 (CoreML mlpackage / TFLite flatbuffer / Qualcomm QNN DLC / SNPE DLC / DirectML / Vulkan SPIR-V / MLX safetensors)。每一种目标后端对算子的支持范围、量化粒度 (per-tensor / per-channel / per-group)、张量布局 (NCHW vs NHWC)、动态维度支持都是不完全等价的。这意味着同一个模型,在 A10 GPU 上能跑,在 Adreno 730 上可能因为某个算子不支持而 fallback 到 CPU,性能差 10-50 倍。一个商业项目必须在 CI 里维护"模型矩阵":每个候选模型 × 每个目标平台 × 每个量化粒度的多维真值表。
第二层:推理后端与运行时绑定
游戏引擎的运行时环境不是普通 Python notebook。Unity 的 C# Scripting Backend (Mono / IL2CPP)、Unreal 的 C++ + UObject、Godot 的 GDExtension + C#,三者各有完全不同的语言绑定约束。Unity Sentis 给的是 C# 侧的直接 tensor API (Input/Output tensors 是 TensorFloat);Unreal 给的是 UE::ML::FModelInstance + TFunction 绑定;Godot 必须走 GDExtension (C++ 编译成 .so / .dll / .dylib) 才能避免 GDScript 性能税。三者的"模型加载 → 推理 → 拿到输出"三步 API 形态完全不同,意味着引擎层面的"切换后端"必须配合"应用层 API 重写",不是单纯的动态库替换。
第三层:帧预算与可观测性
游戏主循环是 16.67ms (60Hz) 或 33.33ms (30Hz) 的硬实时系统。端侧 LLM 单次推理延迟在 7B 模型上典型的 p50 是 80-300ms,p99 是 300-800ms(取决于量化精度、batch size、KV cache 复用策略)。这意味着 LLM 推理绝不可能塞进主线程的同一帧——必须把推理任务"异步化 + 跨帧调度 + 失败可降级":必须异步化、跨帧调度、失败可降级。Unity 的 Coroutine / UniTask、Unreal 的 AsyncTask / TaskGraph、Godot 的 signals/threads,各有不同的并发原语,但工程模式是一样的:主线程绝不阻塞,推理线程可被打断,可观测性埋点必须覆盖 p99 尾部分位,模型可被热替换为更小/更快版本。
这三层约束共同定义了"游戏内端侧 LLM 集成"的工程形态。本文接下来的 6 节,会按引擎逐一拆解这三层约束在不同引擎上的具体实现差异。
Unity Sentis 是 Unity 6 之后官方内置的神经网络推理后端,定位是"在 Unity 引擎内直接跑 ONNX 模型,不依赖外部服务"。截至 2026 年 10 月,Sentis 1.4.x 支持的官方后端包括 CPU (XNNPACK) / GPU (Compute Shader / Metal / Vulkan) / NPU (Qualcomm AI Engine / Apple Neural Engine,需设备厂商 SDK),支持的算子覆盖 ~90% 的常见 transformer block,但对 dynamic shape、custom op、grouped query attention 的某些变体仍存在 fallback。
工程上,Unity Sentis 的落地要关注四个坑:
坑一:模型导入阶段的算子融合
Sentis 在 .onnx → .sentis 的导入阶段会自动做算子融合 (conv+bias+relu、matmul+add+gelu 等)。但这种融合是平台相关的——同一份 ONNX 模型,在 iOS Metal 后端融合后可能比 Android Vulkan 后端少融合 1-2 个算子,导致推理延迟差异 5-15%。建议在 CI 里跑"三平台真值矩阵":每个候选模型 × {iOS Metal / Android Vulkan / Windows D3D12} × {fp32 / fp16 / int8} 各跑 100 次推理,取 p50 / p99 延迟和显存占用,落到 model_perf_matrix.json 用于选型。
坑二:Unity 主线程与 Sentis Worker 的并行模型
Sentis 的 Worker 是非阻塞的,但 Worker.PeekOutput() 会阻塞到本次推理完成。在 60Hz 帧循环里,必须用两层缓冲 (double-buffered worker) —— worker A 在跑 batch N 时,worker B 在被读取 batch N-1 的输出;下一帧切换。代码形态大致是:
// 伪代码 (UniTask 风格)
var workerA = new Worker(model, BackendType.GPU);
var workerB = new Worker(model, BackendType.GPU);
TensorFloat[] bufA, bufB;
int frame = 0;
async UniTaskVoid InferenceLoop() {
while (true) {
var w = (frame & 1) == 0 ? workerA : workerB;
var buf = (frame & 1) == 0 ? bufA : bufB;
w.Schedule(inputTensor);
await UniTask.Yield(); // 让出主线程
// 下一帧 PeekOutput
}
}
这个模式已经被多个商业项目验证:在 iPhone 15 Pro 上跑 Llama-3.2-1B 量化版,token-by-token 生成 p50 = 35ms,主线程不掉帧。
坑三:动态量化与设备后端的兼容矩阵
Sentis 支持 per-channel int8、fp16、dynamic quantization。但 dynamic quantization 在 Apple Neural Engine 上是 no-op——Core ML 后端只接受静态量化。这点 Unity 文档没明说,需要在 device backtrace 里观察 "Skipped dynamic quant: backend doesn't support" 警告。实操建议:iOS 走 fp16 + static int8 weight-only 路径,Android 走 fp16 + per-channel int8 路径,Windows 走 fp16 + dynamic quantization 路径,三套模型分别导出。
坑四:PlayerLoop 注入与 StreamingAssets 模型加载
大模型 (1B 以上) 走 Resources.Load / Addressables 都不合适——前者吃打包体积,后者延迟过高。正确做法是 StreamingAssets + 异步加载 + LRU 缓存。模型文件按平台拆包:iOS 走 .mlpackage、Android 走 .dlc (Qualcomm) 或 .tflite、Windows 走 .onnx / DirectML。AssetBundle 拆包时按"先加载小模型 (300MB BGE-M3 embedding), 按需加载大模型 (1.5GB Llama-3.2-3B)" 的二级缓存策略。
Unreal Engine 5.4 之后的 UE::ML 模块提供了 C++ 侧的神经网络推理封装。与 Unity Sentis 的"内置后端"路线不同,Unreal 的设计哲学是"框架薄、后端开放"——UE::ML::FModelInstance 只暴露 LoadModel / Execute / GetOutput 三个虚函数,具体的后端 (NNERuntime / ONNX Runtime / TensorRT / DirectML / CoreML) 通过 INNERuntime 接口插件化。这意味着项目侧可以选择走 Epic 官方的 NNERuntime,或自研接入 (例如绑定 libllama.so)。
UE 在动画领域是行业标准。端侧 LLM 与 AnimGraph 的集成模式是:把 LLM 推理结果作为 StateMachine / BlendSpace 的输入参数,而不是直接驱动骨骼。具体路径:
AnimNode_LLMIntentDriver(自定义 Node) 把意图标签映射到 BlendSpace 权重这样,LMM 推理的 200-500ms 延迟对动画系统的 16ms 主循环完全透明——玩家看到的是 "LLM 决策延迟 200ms + 动画 16ms 平滑过渡" 的复合体验。
UE 5.5 引入了 NNE (Neural Network Engine) 的运行时插件机制。要把 llama.cpp 作为 NNE 后端,需要实现 INNERuntime 接口的 6 个虚函数:
// 伪代码 (UE 5.5+)
class FLlamaRuntime : public INNERuntime {
virtual bool LoadModel(const FString& Path, FModelInstanceHandle& OutHandle) override;
virtual bool RunSync(FModelInstanceHandle Handle,
const TArray<FTensorBinding>& Inputs,
TArray<FTensorBinding>& Outputs) override;
virtual bool RunAsync(FModelInstanceHandle Handle, ...);
virtual void DestroyModel(FModelInstanceHandle Handle) override;
// ...
};
RunAsync 必须接 UE 的 TaskGraph,把 llama.cpp 的 llama_decode 调用挂到 GThreadPool 的低优先级队列,避免阻塞渲染线程。踩坑点:llama.cpp 默认的 n_threads 设置为物理核数,在 PC 平台 OK,但在 PS5 上会触发 Sony TRC 违规 ("应用独占物理核超阈值")——必须显式设 n_threads = physical_cores / 2。
Godot 4.3+ 通过 GDExtension 提供 C++ 侧的 ONNX Runtime 绑定。社区最成熟的方案是 godot-onnxruntime-plugin(基于 onnxruntime C API),支持 CPU (XNNPACK) / GPU (DirectML / CUDA / ROCm) / NPU (CoreML / QNN / DirectML EP) 多后端切换。
GDScript → C++ 的每次调用大约 100-200ns 开销。如果每帧推理一次 LLM,光是 Godot 侧的类型转换就会吃掉 5-10ms。实操建议:
LLMRuntimeNode(继承自 Node), 内部直接持有 Ort::Sessionprompt(text: String) -> Signal("token_emitted", String) 信号这个模式把 GDExtension 开销从 100-200ns/token 降到 30-50ns/token,在 Steam Deck 上端到端延迟从 280ms 降到 220ms(节省约 20%)。
Godot 端侧 LLM 的最大瓶颈是 KV cache 内存。1B 模型 fp16 下每 token KV cache 约 1MB,3B 模型约 3MB,7B 模型约 7MB。30 轮对话后,7B 模型的 KV cache 占用 210MB,直接拖垮中端 Android 设备的可用内存。
实操上有三种缓解路径:
Ort::MemoryInfo + custom arena allocator 实现类似效果。对于商业项目,真正的工作量不在"选哪个后端",而在"如何把这五个后端封装成一个稳定的抽象层"。业界 (Unity / Unreal / 社区 SDK) 已经在几条路线上形成了共识。
Layer 1 (引擎绑定层): Unity C# / Unreal C++ / Godot GDExtension,负责把引擎数据结构 (Texture2D / Mesh / string) 转成 tensor。
Layer 2 (模型运行时层): ONNX Runtime / llama.cpp / Core ML / TensorRT,负责真正的算子执行。这一层对引擎不可见,引擎只看到 "load model / run inference / get output" 三件套。
Layer 3 (设备后端层): CPU (XNNPACK) / GPU (CUDA / Metal / Vulkan / D3D12) / NPU (ANE / QNN / SNPE)。这一层对应用完全不可见,由 Layer 2 的 EP (Execution Provider) 机制选择。
商业项目的工程现实是:一个模型要在 8 个平台 (iOS / Android / Win / Mac / Linux / Switch / PS5 / Xbox) 上跑通。这意味着 CI 必须维护一条"导出流水线":
# 伪 bash (实际是 Airflow / Argo Workflow)
1. PyTorch model checkpoint → ONNX (统一中间格式)
2. ONNX → Core ML (mlpackage) # iOS / macOS
3. ONNX → TFLite (flatbuffer) # Android (CPU fallback)
4. ONNX → Qualcomm QNN (dlc) # Android (Snapdragon NPU)
5. ONNX → ONNX Runtime + DirectML # Windows (D3D12 GPU)
6. ONNX → ONNX Runtime + CUDA EP # Windows / Linux (NVIDIA GPU)
7. ONNX → TensorRT engine # 高端 PC / 数据中心
8. ONNX → MLX (safetensors) # Apple Silicon 优化路径
9. ONNX → SNPE DLC # Snapdragon 旧机型
每条管道都要做 "算子兼容性 + 量化精度 + 真值误差" 三重验证:算子兼容性靠 ONNX Runtime 的 op_check 工具,量化精度靠 golden set 输入输出对比 (per-tensor MSE < 1e-3),真值误差靠 100 条测试用例的端到端推理对比 (max token divergence < 5%)。
商业项目在玩家启动游戏时,必须根据硬件动态选择后端。决策树大致是:
if iOS: → Core ML (ANE 优先, Metal fallback)
elif Android:
if device.hasSnapdragonNPU: → QNN DLC
elif device.hasMaliGPU: → Vulkan + fp16
else: → CPU XNNPACK
elif Windows:
if hasNvidiaGPU: → CUDA EP / TensorRT
elif hasAmdGPU: → DirectML EP
else: → CPU XNNPACK
elif macOS:
if AppleSilicon: → MLX (最优 fp16 性能)
else: → Core ML (Intel iGPU)
elif Linux: → CUDA EP / ROCm EP / CPU
elif Switch: → NVN (Nvidia Tegra) 自研路径
elif PS5: → 私有 SDK 私有后端
elif Xbox: → DirectML + Xbox 私有 NPU SDK
每条分支都要在 QA 矩阵里跑通,任何一条 FAIL 都会导致 "该机型上玩家无法使用端侧 LLM 功能"——必须 fallback 到云端,UX 降级提示。
"在游戏里跑 7B 模型"在 2026 年的工程现实是:
| 量化粒度 | 模型大小 (7B) | iPhone 15 Pro 推理 (token/s) | Pixel 8 Pro 推理 | 显存峰值 |
|---|---|---|---|---|
| fp32 | 28GB | 不可用 | 不可用 | 不可用 |
| fp16 | 14GB | 不可用 | 不可用 | 不可用 |
| int8 per-tensor | 7GB | 4-6 tok/s | 2-3 tok/s | 7.5GB |
| int8 per-channel | 7GB | 8-12 tok/s | 4-6 tok/s | 7.5GB |
| int4 groupwise (GPTQ) | 4GB | 18-25 tok/s | 10-15 tok/s | 4.5GB |
| int4 groupwise (AWQ) | 4GB | 20-28 tok/s | 12-16 tok/s | 4.5GB |
| int2 (激进) | 2GB | 40-55 tok/s | 25-35 tok/s | 2.5GB |
经验区间:商业项目默认走 AWQ int4——这是端侧 7B 模型在 2026 年的 "甜蜜点"。
游戏对延迟敏感的不是 p50,是 p99 和 p999。一个 100ms 偶尔卡顿的主循环,会让玩家感觉 "游戏卡了",远比 "始终 60ms 但稳定" 体验差。
埋点必须覆盖:
UE 项目里推荐用 UE_LOG(LogTemp, Verbose, ...) + 自研 CSV exporter, 把每帧推理延迟打到 UE Insights;Unity 项目推荐用 Unity Profiler 的 Profiler.BeginSample("LLMInference") + 自研 Stat 系统。
Speculative decoding 是 2024-2025 年端侧 LLM 的关键加速技术:用一个超小的 draft 模型 (例如 50M-200M 参数) 快速生成 K 个候选 token,然后用主模型 (例如 3B) 一次性 verify 这 K 个 token。如果主模型接受率高 (典型 > 0.7),整体推理速度可以提升 1.5-3 倍,而不损失输出质量。
在游戏对话场景里,这个技术特别合适:
工程实现上,Unity 项目可以基于 llama.cpp 的 llama_speculative C API 集成;Unreal 项目可以基于 onnxruntime 的 Ort::RunWithBuffer 自研;Godot 项目需要通过 GDExtension 调用 C++ 侧的 speculative 逻辑。踩坑点:draft 模型和主模型必须共享 tokenizer,否则 verify 阶段会因 token id 不对齐而全部拒绝——这是 2025 年早期多个商业项目踩过的最大坑。
手游端侧 LLM 的另一个隐性约束是电池温度:持续推理 3-5 分钟后,iPhone 后盖温度可达 42-45°C,触发 iOS 的 thermal throttling,推理速度下降到初始的 60-70%。商业项目必须做:
ProcessInfo.processInfo.thermalState (iOS) 或 PowerManager.getCurrentThermalStatus (Android) 实时获取温度档位,自动降级到更小的模型或更低的 batch size这套温控逻辑在多个 AAA 工作室的内部项目里已经是标配,2026 年开始向中型工作室扩散。
如果玩家多次与同一 NPC 对话,相同的 system prompt + NPC persona 描述可以共享 KV cache。Prefix caching 的工程模式:
这个模式可以把平均对话响应延迟从 250ms 降到 100ms 以下,是商业项目必走的优化。
商业项目几乎不会只用端侧 LLM——7B 模型的能力上限远低于云端 70B / 200B 模型。正确的工程模式是"端侧为主 + 云端兜底":端侧跑对话生成、行为决策、动画意图等高频低延迟任务;云端跑剧情生成、复杂推理、长程一致性等低频高能力任务。
何时卸载到云端:
何时保留在端侧:
云端往返意味着 300-2000ms 的网络延迟。UX 设计必须考虑:
这套 UX 在 Roblox 的 AI 助手、Unity Muse、Unreal 的 AI 角色创建里都是标配。没有任何一个商业项目会让玩家 "等 5 秒看到 AI 回复"——这不是技术问题, 是产品问题。
端侧 LLM 没有内置的内容审核 (因为模型太小塞不下 Llama Guard 7B)。商业项目的解法:
这套分级 moderation 是 2026 年商业端侧 LLM 项目的标配, 与云端项目无本质区别。
如果你的团队规模在 10-50 人,不建议自研端侧 LLM 集成。原因:
建议路径: 优先用 Unity Sentis 或 Godot + onnxruntime 官方插件, 把工程资源集中在 "游戏逻辑 + UX", 不在"AI 推理基础设施"。
如果团队规模在 100+ 人, 有能力做深度定制, 建议三阶段:
值得游戏开发者深入思考的是:端侧 LLM 的能力边界,会反过来塑造游戏设计本身。当 NPC 对话延迟从云端的 1000-3000ms 降到端侧的 50-200ms,玩家对 "和 NPC 自由聊天" 的期待会从 "新颖尝试" 变成 "基本操作"。这意味着:
这些设计层面的连锁反应,在 2026 年才刚刚开始, 未来 12-24 个月会持续演化。对游戏设计者而言, 端侧 LLM 不是 "锦上添花", 而是 "会改变游戏本体的力量"。
如果你是 AI 工程师而不是游戏开发者, 这篇文章给你的反向启示是:游戏行业的端侧 LLM 集成, 是验证 LLM 工程化能力的最佳试验场。原因:
任何能在游戏里跑稳的 LLM 集成方案, 几乎都可以直接复用到 AR / VR / 车载 / 工业控制等其他对延迟敏感的领域。游戏行业的端侧 LLM 经验, 在 2027-2028 年会成为整个 LLM 工程化领域的标准范式——这一点已经被 Apple, Qualcomm, NVIDIA 的公开演讲反复确认。
端侧 LLM 在游戏里的真正价值, 不是 "让 NPC 更聪明", 而是 "让对话延迟从云端的 500-2000ms 降到端侧的 50-200ms"——这是 UX 维度的阶跃, 而非智能维度的阶跃。商业项目应该把工程资源集中在延迟优化和 UX 设计上, 而非追求更大的模型。
一句话摘要:端侧大模型在游戏引擎的集成,本质是一场 "跨平台模型矩阵 + 引擎运行时绑定 + 主循环零阻塞可观测性" 的三层工程博弈——商业项目的核心竞争力,不在于选哪个 7B 模型, 而在于把 8 平台 × 3 量化 × N 模型的真值矩阵跑稳、把 p99 延迟压进 16ms、把云端兜底的 UX 边界设计清楚。
Conversation
0 条