unity面试总结(项目篇)

张开发
2026/5/26 0:41:25 15 分钟阅读
unity面试总结(项目篇)
项目头顶信息科技树换装头顶信息2dUI做法更新放在lateupdate之后通过移除画布的方式隐藏手动计算偏移量不用layout组件分区域布局避免直接使用transform.position缓存角色坐标使用判断是否在视野范围内来判断是否更新在一个job里面同时判断对象是否在视野范围内和把他的3d坐标转成2d坐标计算这个角色的相关信息判断是否在视野范围内使用视口坐标判断因为用六个面判断是主线程api合批逻辑关联物理分层文字层图片层特效层如果要解决重叠问题要自己处理深度测试缺点网格重建1.静态合批缺点1.运行的时候合并mesh会有大量mesh顶点相对于gpu instance2.贴图要求同meterial材质才合批3DUI做法1.使用textmeshpro同一层级下可以合批在一起动态网格把文字拼成一个巨大的mesh2.使用动态合批单次顶点数量小于640就没问题3.text也可以动态合批(在空间中坐标极其接近或者完全重叠时Unity 为了防止渲染时出现“闪烁Z-Fighting)有z-fighting可以想办法让他走srp batcher4.为什么不用2DUI主要是因为网格重建5.系统耗时 0.06ms。换装要求骨骼要求:骨骼结构完全一致,空间位置零偏差,不同部分表现上同一位置的顶点收骨骼权重影响尽量相同同一套基准骨骼T-Pose零件贴图是按部位来规范固定大小(1024和512)合并后大图固定大小2048贴图格式统一算法装箱算法先放大的再放小的 RectanglePacker库存取骨骼层级使用的数据结构字典UV 象限法的缺点:空间浪费精度死板扩展性差需要的工作动态生成basecolor的大图(根据优先级缩放贴图)动态mask大图动态法线大图遮挡剔除肚子被衣服挡住就剔除合并时候剔除具体步骤1.加载各部位 SkinnedMeshRenderer2.提取所有子 Mesh 的 CombineInstance含顶点、UV。3. 收集骨骼重映射的骨骼数组信息4.合并颜色贴图uv象限做法固定uv分区5.合并mesh创建材质赋值新贴图一定要自己创建材质吗优化lod(动态选用的贴图大小)固定贴图大小预分配内存使用RenderTexture而不是texture纹理压缩缺点内存压力合并贴图的计算压力渲染基础mesh里面一个顶点应该是有切线uv法线的只不过可以通过法线贴图来二次修改渲染时候使用的法线,没有法线贴图就是插值使用顶点的法线renderer.material.mainTexture这个会生成一个新的材质renderer.sharedMaterial这个不会渲染流程总结cpu收集顶点材质数据组成drawcall发给gpugpu顶点着色器坐标映射裁剪变换光栅化片元着色器输出合并通过 深度测试 (Z-Test)、模板测试 和 Alpha 混合 决定像素是否最终写入颜色缓冲区。srp batcher需要满足什么条件shader最后生成的代码逻辑指令一样你知道包装到那个语法里面他的真实含义是什么 为什么要包装到那个里面显存里面开辟了一块持久缓冲区把包装到cbuffer里面的数据都提前上传上去luaSprite.__index Sprite的作用“如果有人把我Sprite当成元表且他在自己身上找不到某个东西那就来我Sprite自己这里找。”没定义的话就算有元表也找不到继承太多的耗时table hash查找的耗时编辑器相关技能前摇也是通过技能段的首发段来处理的动作融合通过crossfadeundo, redo的方法SerializedObject 的“三部曲”,存取的时候引入中间数据层 ScriptableObject第一步so.Update() —— 【拉取】动作将 C# 对象内存里的真实数据同步到 SerializedObject 的内部缓冲区。第二步so.FindProperty(“fieldName”).xxxValue … —— 【修改】动作修改缓冲区中的副本数据。第三步so.ApplyModifiedProperties() —— 【提交】计算差异对比 Update 时的初始值和现在的缓冲区值。注册 Undo如果值变了自动向 Unity 注册一个 Undo 操作你不用手动写 Undo.RecordObject 了。正式赋值把缓冲区的新值正式写回到 C# 对象的内存字段里。标记脏数据自动调用 SetDirty确保 Unity 知道这个文件需要保存到硬盘。刷新 UI通知 Inspector 或其他面板数据变了赶紧重绘。SerializedObject内部保存了一份每个对象的isdirty状态可以直接读取到EditorUtility.IsDirty(targetSO)在导出脚本里你可以遍历所有的 SO 资源只对 IsDirty 为 true 的对象执行“导出到表格”的操作。血条相关的优化动态合批还是会有cpu非常累要动态拼顶点上传可以改成 gpu instance只传一个模型就行了CPU 会在内存中合并出一个全新的大网格gpu instance可以渲染血条属性面板变量 Uniform(材质属性) 每个顶点在这一次绘制中不变。顶点/像素变量 Varying 随位置改变。SRP Batcher 确实无法优化顶点数据Vertex Data本身的提交量它优化的重心确实是“属性面板”上的那些数据材质参数。提前提交uniform参数蒙皮动画Skinned Mesh的用法就是把骨骼动画矩阵变成贴图数据传到gpu里面去渲染然后mesh只传一份通过gpuinstance来变化CBuffer vs Instance Buffer (物理区别)CBuffer (给 SRP Batcher)它是常量缓冲区空间小但速度极快。存的是材质属性。Instance Buffer (给 GPU Instancing)它通常是 StructuredBuffer 或 Vertex Buffer 的一种。空间很大专门存大批量的位置、缩放、旋转等实例数据。它不是程序员手动开辟的是你在 Shader 里声明 UNITY_INSTANCING_BUFFER_START 时由引擎底层分配的显存空间。text和textmeshprotext它把每个字符按照你设置的 FontSize实时生成一张小位图塞进一张 动态图集图集重建Rebuild动态图集空间有限通常 1024x1024。当大字体塞满图集时Unity 必须清空旧图集并重新排列所有字符这会导致巨大的 CPU 掉帧打嗝。textmeshpro用shader解决这个技术3D TMP 的“单体重建特效显示在UI上面动态生成一个image网格效果上跟原来的粒子特效对的上吗粒子特效是动态了那这个网格是每帧都在变化生成有cpu开销

更多文章