Defold HTML5 导出与 Web 性能优化
完整拆解 Defold 的 HTML5 导出:构建流程与 build/html5 产物结构、WASM 主循环与 JS 桥接机制、归档(Archive)资源加载与自定义加载页、纹理压缩与包体裁剪、WebGL 上下文与内存的运行时优化,以及 JS 互操作、音频解锁与离线缓存的平台集成。
tag
完整拆解 Defold 的 HTML5 导出:构建流程与 build/html5 产物结构、WASM 主循环与 JS 桥接机制、归档(Archive)资源加载与自定义加载页、纹理压缩与包体裁剪、WebGL 上下文与内存的运行时优化,以及 JS 互操作、音频解锁与离线缓存的平台集成。
系统讲解 Defold GUI 的响应式布局:节点树与锚点(Anchor)体系、Adjust Mode 的 Fit/Zoom/Stretch 取舍、pivot 与百分比相对布局、safe area 与刘海屏处理、断点式动态重排脚本,以及从手机到桌面的一整套多分辨率适配工程实践。
从插值数学讲起,系统拆解 Defold 的补间动画:go.animate 的签名与播放模式、go.Easing 全部曲线类型与选型直觉、自定义 easing 函数的实现与曲线拟合、多属性协同与链式序列编排、时长/延迟/暂停与变速控制,以及 UI 动效与角色运动的实战配方。
系统讲透 Defold 的消息传递架构:msg.post 与 URL 寻址、on_message 回调与分发顺序、父子层级与集合代理(proxy)、事件总线与集中式分发的解耦模式、请求-响应与订阅式通信、消息与直接调用的性能取舍,并给出可复用的消息驱动架构实践。
主线程为什么是瓶颈、哪些活能挪出去、挪出去要付什么代价。本节讲清 Worker 的数据边界——结构化克隆的复制成本与 Transferable 的零拷贝,用可跑的纯 TS 代码量化两者差异;说明 cc.d.ts 并不导出 Worker,必须走平台全局对象并做特性检测;最后给出分片计算任务与并行化的工程判断。
把《方块冲刺》接一个三方 SDK 的完整链路走一遍:先看 Android/iOS 原生工程里插件该落在哪,再分别写 Java 与 Objective-C 桥接类,然后用 TypeScript 门面包一层平台适配,让业务代码只见接口不见平台;重点讲清原生结果回传给 JS 时的线程约束、回调注册与生命周期坑,最后算一笔插件维护成本的账。
从原生构建产物入手,讲清 Cocos Creator 3.8 在 Android/iOS 上如何把 JS 引擎嵌进 C++ 宿主,JSB 绑定怎样把 cc 的类暴露给脚本层;用 cc.d.ts 实测划出「平台无关 API」与「原生运行时注入对象」的边界,讲对 sys.isNative 与 sys.platform 的用法,量化反射式原生调用的成本,给出下沉原生的工程判断。
卷二 13.3 讲清了帧预算四段与 Profiler 面板怎么开。本节把它升成一个可重复的闭环:采样、定位、修复、验证,每一步给出 cc.d.ts 能证明的 API,并用纯 TS 写一个带分位数的帧时间采样器配 vitest 断言。核心纪律是先量再改、一次只改一处、改完同设备复测。
7.1 说明资源内存在引擎与 GPU 侧、不归 GC 管。本节把这笔账算细:落到 cc.d.ts 里的 PixelFormat 与 gfx.Format 两套枚举,把块压缩对齐与 mipmap 的 1.33 倍写进公式,用纯 TS 写一个可单测的显存计算函数,并给出整包资源预算表与读取真实显存的 API。
卷二 13.2 算过纹理内存、也定了引用计数纪律,但没回答字节到底躺在哪、Asset 从加载到消失经历了什么、GC 何时被触发。本节把 Cocos 运行时内存切成 JS 堆、原生堆与 GPU 显存三块,给出 Asset 生命周期与引用计数的 cc.d.ts 证据,并用纯 TS 写一个对象池加触发式回收模型,配 vitest 断言。
动画的代价分两块:CPU 每帧采样曲线并混合,内存里躺着关键帧数据、烘焙关节纹理与合批图集。本节算清这笔账,讲明采样率、烘焙、图集三者如何互相兑换,用纯 TS 写一个可单测分位数的帧耗时统计器,并给出《方块冲刺》这类项目能直接落地的动画预算清单与排查顺序。
骨骼动画把动画数据从「节点属性」换成「几十上百个关节的变换矩阵」。本节讲清 Skeleton 资源里的 joints 与 bindposes、SkeletalAnimation 的烘焙开关、蒙皮顶点的加权计算,以及蒙皮模型为什么难以合批、SkinnedMeshBatchRenderer 又如何把共享骨骼的模型合并。
Cocos 动画由 AnimationClip 的 track/channel/curve 三层数据驱动,AnimationState 按时间采样并混合出当前姿态。本节拆开整条求值链路:关键帧插值、weight 混合、crossFade 过渡,用纯 TS 写一个可单测的关键帧求值器,并核对事件常量到底挂在哪个类上。
讲清 Cocos 2D 物理的主动查询与自定义碰撞响应:用 PhysicsSystem2D.instance 的 raycast、testPoint、testAABB 做射线与区域查询,用 Contact2DType 的四个回调写自定义响应,并指出 IPhysics2DContact 的字段是 colliderA/colliderB 而非 selfCollider/otherCollider。
讲清 Cocos 2D 物理的可观测性:用 PhysicsSystem2D 的 debugDrawFlags 与 EPhysics2DDrawFlags 位掩码把物理世界画出来,理解 fixedTimeStep、maxSubSteps、autoSimulation 与求解器迭代参数的语义,并用 profiler.stats.physics 定位物理帧开销,附可单测的固定步长累加器实现。
从 cc.d.ts 与引擎源码路径实证 Cocos 2D 物理的两套后端:内置 builtin 与 Box2D,讲清 PhysicsSystem2D 的后端选择、PHYSICS_2D_PTM_RATIO 单位换算、刚体类型与碰撞体家族,以及两套后端在碰撞回调与动力学上的能力差异,最后落到工程选型。
RenderTexture 是把渲染结果搬进一张纹理的载体。本节从 cc.d.ts 与引擎源码实证它的能力边界,讲清用 Camera.targetTexture 做离屏渲染、用自定义 Effect 做镜像、用 readPixels 做截图,并给出尺寸上限、坐标系与复用等实战陷阱。
光被挡住怎么办、光能不能提前算好?本节讲 2D 阴影的两条实现路线——投影剪影与阴影贴图,怎样用 RenderTexture 承载一个专用阴影相机,以及把光提前烘进贴图的预烘焙做法,并附一个可单测的烘焙器骨架、动态阴影与预烘焙的取舍表和工程决策清单。
Cocos Creator 3.8 的 cc.d.ts 里其实没有 Light2D——2D 光照在引擎里不是一个组件,而是一个着色器问题。本节先用 grep 证伪,再讲清法线贴图与 Lambert 漫反射的直觉,最后给出可直接单测的纯 TS 光照算法、把光参数喂给材质的组件,以及一个自定义 .effect。
后处理是把整帧渲染结果当输入纹理再算一遍。本节讲清 Cocos 3.8 的 PostProcess 与 BlitScreen 框架、如何写一个全屏灰度 Effect、如何在编辑器里搭起后处理链,并给出可编译的装载代码;同时算清全屏带宽、shadingScale 与多 pass 泛光的性能代价。