Knowledge
图形学、引擎、编程与游戏开发笔记。
- ARTICLES
- 221
- SECTIONS
- 27
/221 / 221
共 27 个主题 · 221 篇文章
技术中文写作规范技术文章像一位熟悉问题的工程师向另一位工程师解释:先把现象和数据说清楚,再沿原因、机制与实现推进。读者应当知道每一步发生了什么,为什么成立,如何验证。5 MIN ↗术语表术语表只统一叫法和搜索入口,不代替正文解释。12 MIN ↗学习与维护方法本知识库以主要技术问题组织正文,领域入口见 知识地图。阅读时沿输入与数据变化理解机制,维护时把文章边界、命名、归属和验证状态分别记录。6 MIN ↗知识地图从工程问题进入主归属,再按前置、实现与验证继续阅读。领域使命组织稳定问题,路线表达跨领域数据依赖。10 MIN ↗知识库实施规范知识库面向引擎开发者与技术美术,文章以一个主要技术问题为单位。结构、正文、代码、图片和证据共同构成作者工作流。8 MIN ↗
采样与混叠远处棋盘格会出现本来没有的大块条纹,因为像素网格把高频变化采成了错误的低频。我们先用频率解释这份歧义,再看过滤、提高采样密度和时间抖动分别改变了什么。5 MIN ↗程序噪声每个像素独立取随机数,只能得到颗粒。地形和云需要邻近位置相关,而且相同坐标再次求值时结果相同。程序噪声用格点、梯度或特征点建立这份结构,多尺度叠加再分别控制大形和细节。6 MIN ↗空间变换图形学中的数学问题,难点很少在公式本身,多在数据所在的空间不清楚。同一组三个浮点数可以表示位置、方向、法线或颜色;数值一样,语义未必一样。7 MIN ↗球谐光照环境图保存各个方向的入射光,而漫反射积分会削弱其中快速变化的角向细节。SH把这份球面函数投影到正交基底,让运行时用少量系数重建方向光照。角向细节来自保留的频带,空间可见性则需要探针系统另外处理。4 MIN ↗旋转表示与插值旋转问题通常有三个层次:怎么给人编辑、怎么在程序中保存、怎么在两个姿态之间平滑变化。欧拉角、矩阵和四元数各自适合不同层次。6 MIN ↗Monte Carlo采样半球上有无数入射方向,有限预算只能取一部分。样本出现得更频繁,不代表那一块应被重复计算;Monte Carlo用采样密度修正贡献,再通过重要性分布降低方差。6 MIN ↗
光栅化可见性几何覆盖产生候选样本,深度比较筛选表面,模板测试按标签控制区域。三者位于同一条可见性链,但读取的数据和比较规则不同。1 MIN ↗光栅化与属性插值同一个三角形的UV在斜面上扭曲,往往是屏幕插值没有还原透视关系。光栅器先判断覆盖,再插值顶点属性,重心权重与clip w各有用途。我们从共享边覆盖开始,再看透视校正与导数,利用棋盘格区分坐标错误和过滤误差。4 MIN ↗基于深度的可见性优化像素Shader花了很多时间画后方表面,可以尝试让深度更早拒绝它们。Early-Z改变测试时机,Depth Prepass先建立深度,Hi-Z用区域摘要减少判断。每种方法都增加不同的准备或状态要求,沿着遮挡数据怎样生成和消费来比较,才能知道额外几何是否划算。7 MIN ↗抗锯齿与时域重建锯齿不是只发生在三角形边缘。几何覆盖、纹理、高光、阴影和透明测试都会产生高频信号。不同抗锯齿方法处理的信息不同。8 MIN ↗可见性剔除一个物体在视野边缘突然消失,剔除可能把本该保留的区域排掉了。背面、视锥和遮挡测试都以减少无贡献工作为目标,但使用的数据和保守条件不同。先用可见对象对照基线,再逐层查看包围体与深度,才能定位误删来自哪一步。3 MIN ↗可见性与合成常规不透明绘制在每个样本处保留最近的可见表面,透明绘制还要组合后方颜色。剔除负责减少无需进入后续处理的候选,合成负责按覆盖、透射和顺序保留颜色贡献。2 MIN ↗深度缓冲与位置重建把采样深度乘一个距离,屏幕效果可能贴不住物体,因为缓冲里保存的是投影比较值。先确认投影和深度区间,再还原视空间距离或位置。Reversed-Z改变映射、清除与比较规则;这些条件一致,远近精度和位置重建才可验证。6 MIN ↗时域采样与重投影时域抗锯齿(TAA)把每像素多个采样点分摊到多帧。本文从投影抖动和指数累积进入历史坐标,再说明重采样、深度简化方案与超分;历史能否采用由 时域历史校验判断。空间抗锯齿与选型见 抗锯齿与时域重建。10 MIN ↗时域历史校验上一帧颜色只有在历史表面、着色与覆盖仍相容时才适合复用。本文沿几何拒绝、颜色校验、裁剪和混合推进,再分析头发等高频内容的模糊、鬼影与闪烁。本文记alpha为当前样本权重,运动向量v=uvcurrent−uvprevious,历史坐标为uvcurrent−v;完整采样与坐标约定见 时域采样与重投影。9 MIN ↗透明合成两个半透明面交叉时,简单排序很难给所有像素同一个前后顺序。透明颜色需要保留多层贡献,深度写入和混合决定哪些层参与。排序、深度剥离、链表与加权方案保存的信息不同,我们按交叉面和覆盖层数比较结果,再测内存与采样成本。9 MIN ↗显示呈现GPU帧时间稳定,不代表按键很快出现在屏幕上。显示呈现还包含交换链、Present与扫描节奏,CPU-GPU排队增加吞吐也可能增加延迟。VSync与VRR分别约束不同等待关系。3 MIN ↗渲染帧流程CPU 准备逻辑与资源,GPU 执行队列中的命令,显示系统再呈现图像。这些工作可以跨帧重叠,所以帧率、排队和输入延迟要沿整条时间线理解。3 MIN ↗Geometry Shader顶点阶段只看到单个输入顶点,画三角形边或生成调试几何却需要图元上下文。Geometry Shader每次接收一个图元,再输出数量有上限的新顶点。它提供这种局部生成能力,输出放大与有序流也决定了成本。8 MIN ↗GPU执行与访存同一段Shader在一台设备上受纹理访问限制,换到另一台可能被寄存器或计算吞吐卡住。只看指令行数很难解释差异。我们先追踪线程怎样组织、地址怎样访问,再用保持输出一致的对照实验,把代码行为与目标计数器联系起来。4 MIN ↗OpenGL对象与状态OpenGL对象名称不是内存地址,绑定又改变当前上下文。绘制失败时要同时核对对象生命周期与当时状态,不能只看到句柄非零就认为资源已正确使用。3 MIN ↗Stencil与对象遮罩一个遮罩效果单独运行正常,和别的效果组合以后却把对象裁掉,先看它们是否改写了同一模板位。Stencil保存有限标签,比较和写入规则共同决定像素能否通过。把位分配、深度失败操作和清理时机对应起来,才能解释多对象与多效果的覆盖。5 MIN ↗Stream Output有时顶点结果还要用于下一次模拟或绘制,无需立即光栅化。Stream Output把选定阶段输出按声明写进缓冲,后续再作为输入。接口声明、输出容量与图元顺序共同决定这份缓存能否正确复用。3 MIN ↗
Compute Shader逐像素复制可以让每个线程写自己的位置,但共享结果需要明确同步范围。Compute Shader用Dispatch与线程组组织工作,我们先界定每个索引读写哪份数据,再让组内共享和API依赖分别处理不同层次的协作。9 MIN ↗GPU归约与前缀和可见标记是一组零和一,间接绘制却要一个紧凑列表。归约计算总数,前缀和给每个保留元素分配不冲突的输出位置。两者共享分阶段协作模型,但输出语义不同,不能拿原子计数的无序结果当稳定顺序。4 MIN ↗GPU异步回读CPU立即读取刚算出的GPU结果,会等待前面整条队列。异步回读先安排复制,后续再使用已完成请求;它把等待转成数据年龄,因此完成值、容量与失效策略是同一条实现链。3 MIN ↗Shader Variant管理给材质加几个开关,编辑器里只是多了几个选项,构建却可能突然变慢。参与条件编译的开关会组合成不同GPU程序,还与Pass、平台和质量档位一起扩展。管理变体就是先说清哪些组合会出现,再保证构建保留它们,首次使用时也有正确的准备路径。8 MIN ↗Shader接口与数据流CPU上传了一组参数,Shader却读到错位的值,类型名字相似并不能保证布局相同。阶段接口、常量对齐、资源视图和采样方式构成一份契约。沿着数据从顶点或缓冲进入Shader,再输出到后续阶段,能把编译问题与运行数据问题分开。7 MIN ↗
法线贴图一张法线贴图在烘焙器里正常,进引擎却出现接缝,往往是两端使用了不同切线基。纹理保存的是局部方向,运行时必须解码并沿同一基底还原,才能得到连续的世界着色法线。5 MIN ↗皮肤次表面散射标准 BRDF 假设光在表面某一点进入、同一点离开。皮肤、玉石、蜡、树叶和牛奶不满足这个假设:光穿入表层,在内部多次散射后从邻近位置射出。用纯 BRDF 渲染皮肤,结果会像塑料——明暗交界线过硬,耳廓和鼻翼缺少透光的红色。12 MIN ↗BRDF与微表面模型一个粗糙度参数改变了高光宽度,也可能改变总反射能量。要解释这个结果,先看入射光、表面分布、Fresnel与几何遮蔽怎样组成BRDF。模型各项单独可视化以后,才能判断异常来自参数映射、能量分配还是光源单位。6 MIN ↗Cubemap环境采样六张图片已经摆好,反射方向一转却出现接缝,可能是面朝向、手性或跨面mip不一致。Cubemap把三维方向映射到六面坐标,天空绘制与反射查询共享这份方向契约,粗糙响应则交给IBL。3 MIN ↗IBL镜面能直接看见环境图,粗糙表面却同时接收许多方向。IBL把昂贵方向积分的一部分预先保存,再让运行时根据法线、视线和粗糙度查询。预过滤图与BRDF LUT必须来自相同约定,才能保持亮度和粗糙度响应。5 MIN ↗PBR材质同一材质换了环境以后金属感消失,可能是参数语义、颜色导入或光照输入发生变化。PBR把这些参数与能量关系联系起来,让变化有明确原因。材质的反射类型决定 Base Color 和镜面参数的含义,颜色导入、遮罩打包与标定场景共同约束这些数据的使用。6 MIN ↗
动态GI门打开以后,预计算结果不会自动让另一间房变亮。动态GI选择可更新的场景表示,再用有限采样与缓存摊平传播成本。屏幕、体素、距离场和探针保存的信息不同,缺失、漏光和历史滞后也要分别解释。6 MIN ↗直接光照给灯光增加强度以后,地面亮了,高光和阴影却未必按同样的比例变化。因为一个表面的直接光照同时取决于光源发出了多少光、光怎样到达表面,以及材质把它反射到哪里。光源单位约束输入,距离和可见性约束传播,BRDF约束表面响应;三者需要分别求值后组合。7 MIN ↗GI方案选择间接光可以保存在表面纹理、空间探针或持续更新的场景表示中。选择时先确定哪些物体和光源会变化,再比较更新频率、空间精度与目标设备预算。2 MIN ↗Light Probe角色走出阴影,不能直接读取墙面的Lightmap。Light Probe在空间点保存低频光照,角色根据位置插值这份表示。系数重建与墙体可见性不同,漏光往往来自探针无效或跨墙插值。4 MIN ↗Lightmap墙面和灯都不动时,运行时反复追踪间接光没有必要。Lightmap把表面光照烘进专用UV,采样时复用结果。它省下积分,却把质量要求转到UV覆盖、边距、方向编码和资产重烘焙上。3 MIN ↗Reflection Probe镜面用一张全局环境图,在室内会把墙面当作无限远。Reflection Probe保存某个捕获位置的六面环境,并按区域混合或近似修正视差。捕获结果还要按粗糙度预过滤,运行时求值交给IBL。3 MIN ↗Shadow Map一块表面是否受光,取决于光源与它之间有没有遮挡。Shadow Map 把这个问题转成两份深度的比较:先从光源看场景,记录最近表面,再检查当前接收点是否位于它后面。比较得到可见性,材质与光源随后决定这部分光有多亮。13 MIN ↗
视差映射给一块砖墙平面贴上颜色和法线,斜看时砖缝仍停在原来的位置。我们让观察射线进入砖缝的高度层,找到交点,再把这一个交点交给材质采样和朝光查询。一张平面纹理可以描述颜色,也可以描述表面的局部形状。法线贴图改变着色方向,视差映射移动纹理坐标,位移映射才真正改变几何位置。三者解决的问题和产生的遮挡不同。11 MIN ↗纹理采样与过滤相机斜着看一条路,纹理开始模糊或闪烁,单纯提高图片分辨率未必改善。一个像素覆盖的Texel范围发生了变化,采样器必须选择Mip和过滤方式。我们从这个采样足迹出发,看邻域过滤怎样保留信息,以及法线、Alpha和距离场为何不能都按普通颜色缩小。5 MIN ↗纹理图集子图近看正常,拉远却混进相邻颜色,说明采样足迹跨出了它的区域。图集用UV矩形共享一张纹理,过滤、边距和mip生成必须共同保证子图隔离;能否合批还取决于渲染状态。4 MIN ↗纹理压缩格式一张 PNG 在磁盘上很小,导入后却可能占去数十 MB 显存。磁盘压缩与 GPU 采样使用的是两种表示:GPU 要随机访问纹素,通常把数据存成固定尺寸的可解码块。我们因此从块的字节数算预算,再根据法线、颜色、Alpha 和平台支持选择格式。5 MIN ↗Texture Streaming相机走近物体,着色器需要更细的mip,而上传可能还没有结束。纹理流送因此要分别记录采样需求、预算目标和实际驻留状态。只有理解这三个状态的差距,才能区分低清来自估计错误、预算不足还是加载延迟。4 MIN ↗Virtual Texture巨大纹理中只有少量区域可见,整级加载会带入大量暂时用不到的内容。虚拟纹理把每级mip切成页,让逻辑页映射到有限的物理槽位。采样地址、缺页回退和槽位寿命必须一起成立,否则会出现接缝、错误页面或闪烁。5 MIN ↗
后处理链后处理读取某个阶段的颜色、深度或运动数据。先确认这些数据的曝光、颜色空间、分辨率和时域处理状态,再决定效果放在哪个位置。2 MIN ↗景深与运动模糊失焦和运动都会让一个表面点覆盖更多像素,但前者来自光学焦平面,后者来自曝光期间位移。两种模糊都要解决前后景混色,因此先生成CoC或速度,再在深度约束下分层采样。5 MIN ↗屏幕空间AO接触处需要更暗,但深度缓冲只有当前视图最前层。SSAO从这份局部信息采样周围遮挡,再过滤估计值。它能补接触层次,也会在屏幕外和深度断层失去信息,不能当作完整GI。4 MIN ↗颜色空间sRGB中间灰值不是一半光能。把编码值直接当作线性光能做运算,会改变亮度关系。颜色空间记录原色、白点和传递函数;采样解码后在线性空间处理,显示时再编码。3 MIN ↗Alpha表示透明边缘出现黑线,常是RGB填充、预乘方式和Blend State不一致。Alpha可以是覆盖,也可以是项目数据,首先要确定含义。Straight与Premultiplied保存颜色的方式不同,过滤与合成必须沿同一表示。4 MIN ↗Bloom小亮点只模糊一次,容易得到单一大小的光圈。Bloom先从HDR颜色构建多尺度图,再从粗层向细层合成,让光晕同时保留近处亮核和远处扩散。每级过滤与能量权重共同决定形状和闪烁。7 MIN ↗HDR与曝光灯光强度提高,最终画面却不一定更亮,因为自动曝光会改变整体缩放。HDR先保存超过显示白色的场景值,曝光决定它们进入显示曲线的位置;预曝光还要让历史颜色处于可比较尺度。4 MIN ↗Tone Mapping场景亮度可以远大于显示白色,直接Clamp会把亮部层次全部截掉。Tone Mapping用曲线压缩动态范围,再按明确色域和输出变换显示。曝光决定输入落在哪里,曲线决定这些值怎样分配对比。3 MIN ↗
网格数据与GPU访问网格不是一组孤立的三角形。它是一套拓扑、顶点属性和索引数据。DCC 里的一个“点”进入引擎后,可能因为 UV 缝、硬边或材质边界拆成多个 GPU 顶点。8 MIN ↗植被包裹法线叶片几何各自朝向不同,光照就像一堆板片。包裹法线从树冠代理体积取得方向,让叶片共同表达团块明暗。离线代理生成、空间变换与各LOD写回共同决定受光是否连贯。6 MIN ↗Billboard面片已经面向相机,角色却像绕中心悬在地面上,说明朝向算对了,锚点还没有对齐。Billboard用相机方向构造面片位置,接地点、阴影和深度仍属于场景。先固定脚底,再转动上面的面片,就能把显示朝向与世界位置联系起来。4 MIN ↗Heightfield地形高度图能描述地表,却不能直接表达悬挑和洞穴。Heightfield把水平位置映射到一个高度,再用分块网格、边界连接和材质权重构成场景。单位、采样密度和相邻块契约决定它是否能无缝落地。5 MIN ↗LOD选择距离一样的树和大楼占屏幕大小不同,按固定距离减面会让两者产生不同误差。LOD先估计屏幕贡献,再选择几何、材质和动画预算;切换稳定性由过渡与滞回处理。4 MIN ↗Tessellation与位移近看模型露出折角,直接换高模能改善,却会让远景也承担同样的几何成本。Tessellation在运行时细分Patch,再由求值Shader决定新点位置。先分清生成密度和几何位移,才能判断裂缝来自共享边因子,还是高度采样与变换。7 MIN ↗
动画压缩同一段动作删掉一半关键帧,躯干可能看不出变化,手指却离开了握持点。局部旋转的微小误差会沿骨骼层级放大,所以动画压缩先定义哪些部位容许多大误差,再决定删轨道、删关键帧还是降低位宽。包体之外,解码速度和随机访问也决定它能否用于运行时。4 MIN ↗动画重定向同名骨骼不一定使用同一坐标。源角色的手臂沿局部 X 轴,目标角色沿局部 Y 轴,直接复制旋转就会把抬手变成扭手。重定向先把动作从参考姿态中分离,再用对应基底表达这份变化。比例和接触点随后处理,因为旋转正确并不保证脚落在地面上。4 MIN ↗动画姿态混合从走路切到跑步,直接播放另一个动画片段会让脚步和姿态跳变。姿态混合先对齐动作相位,再在局部TRS中合成基础、加法和骨骼层,最后累积层级。动作规则与根运动所有权保持明确,才能避免脚滑和重复位移。5 MIN ↗骨骼动画与蒙皮骨骼动画把高维的逐顶点运动压缩成少量关节变换,再用蒙皮权重恢复表面运动。要理解实现,关键是分清绑定姿态、当前姿态、局部空间和模型空间。6 MIN ↗角色布料渲染衣服有很多顶点,全部用于实时求解成本过高。角色布料让低模代理负责约束与碰撞,再把运动传到高模。代理映射、身体碰撞和瞬移重置是一条完整集成链,PBD公式由物理专篇解释。5 MIN ↗角色动画导读角色动画需要把动作、表情和模拟结果转换为表面变形。骨骼姿态、面部目标、布料与毛发各有数据来源,组合顺序取决于它们读写的姿态和空间;动画压缩则处理动作数据的存储与求值成本。2 MIN ↗毛发表示与模拟近景需要发丝轮廓,远景却主要看到发束体积。毛发表示因此分成发片、发丝与引导线代理,模拟密度、渲染密度和阴影预算分别变化。切换不能只减发丝数,还要保持运动与覆盖连续。3 MIN ↗面部动画单独张嘴和单独微笑都正常,把它们同时打开却可能让嘴角塌下去。因为形状目标的差值线性相加,表情的真实组合却不是简单相加。我们先看形状数据怎样求值,再处理骨骼、组合修形和口型曲线,让几个控制器一起工作时仍能保持可读的表情。3 MIN ↗植被风动树叶随风摇动了,根部也漂走,或者本体在动而影子留在原地,这些都是形变数据没有沿同一规则传递。风动从锚点和权重出发,用相位组织主摆动与细抖动。阴影、深度与运动向量复用同一位置函数以后,画面才会把它们看作同一次运动。3 MIN ↗IK一段动画的脚落在平地上,地面变成斜坡以后就会悬空。IK从已采样姿态出发,根据末端目标修正关节链。骨长、弯曲平面、接触相位和迭代预算决定修正是否稳定。4 MIN ↗
大气散射太阳接近地平线时,光在空气中走得更远,颜色与亮度一起改变。大气渲染需要同时计算太阳到散射点、散射点到相机的损失,再累积沿视线进入相机的光。查找表(LUT)缓存这份计算中的稳定维度;表的坐标、积分边界和更新依赖共同决定结果。8 MIN ↗屏幕扰动热浪让背景扭曲,但屏幕颜色只包含已绘制内容。屏幕扰动把偏移场变成UV,采样场景快照再合成。执行时机、深度拒绝与源目标分离决定边缘是否会吸入错误前景。2 MIN ↗溶解材质阈值推进时,溶解边缘应沿噪声场移动,而阴影与本体不能各用一份阈值。溶解材质把覆盖和边缘颜色分开求值,再接入统一的深度、阴影与Motion路径。2 MIN ↗软粒子烟片穿过墙面会出现一条硬线,因为面片与墙的遮挡突然变化。软粒子比较两份线性深度,把接触范围映射成覆盖衰减。它软化交界,不补充屏幕深度缺失的背后几何。2 MIN ↗水面与海洋渲染水面渲染由三个相对独立的子问题组成:网格如何组织、波形如何生成、表面如何着色。三者可以自由搭配——同一套波形可以跑在不同的网格方案上,也可以配不同的着色模型。分开理解比整体记忆某个方案更有用。10 MIN ↗体积云云不是一张半透明表面,视线会穿过不同密度段。Weather Map决定大形,噪声雕刻体积,每段再估计到太阳的透射。有限步进需要空区跳过与历史重建,密度和光照变化时分别失效。4 MIN ↗Froxel体积雾沿视线逐步计算雾,每个表面都要重复积分。Froxel 方案把视锥切成三维网格,先算每段散射,再沿深度保存累计结果。这样,墙面只需按自己的深度查一次纹理,就能得到相机到墙之间的雾;代价则转移到网格精度、历史重投影与三维资源访问上。4 MIN ↗GPU粒子系统粒子系统用大量生命周期短、行为相似的元素近似烟、火、碎片、轨迹和环境动态。系统真正困难的部分是生命周期管理、数据布局、并行更新、排序与跨系统交互。7 MIN ↗VFX纹理动画同一张纹理可以逐帧换图,也可以沿流向连续移动。VFX纹理动画先选择时间参数怎样映射到采样坐标,再处理周期接缝、帧间插值和mip。两种表示都要保持动画尺度与资产布局一致。2 MIN ↗VFX效果组合一个特效可以同时需要时间动画、覆盖变化和场景交界。先确定各部分需要哪份信号,再组合材质与模拟,性能按实际同屏负载验证。2 MIN ↗
风格化头发高光发片高光断成反向条带,常是UV发流或切线手性不一致。风格化头发用这份方向控制纵向高光,再通过偏移、遮罩和Ramp形成可读色带。几何方向稳定以后,才有依据调高光形状。3 MIN ↗风格化眼睛把虹膜和高光都画进同一张颜色图,转动视角时它们会一起移动,眼睛就像贴在球面上的图案。眼睛材质把虹膜放到表面后方,把角膜反射留在外表面,再分别处理眼睑遮挡。艺术化图案可以自由变化,这三层的空间关系仍要稳定。3 MIN ↗角色阴影刘海投影既要跟随头发,也要保持脸部可读。普通阴影贴图、专用遮罩、屏幕偏移和射线求交保存的信息不同。我们先确定投影对象和消费者,再按角色距离、平台与画面档位选择。4 MIN ↗描边给一个模型加上描边,最容易想到的做法是沿着它的外轮廓画一圈线。但真正做起来,很快就会遇到几个不同的问题:外轮廓画出来了,衣服上的结构线却没有;球体的轮廓连续,立方体的角上却裂开;近处线宽合适,相机拉远以后又显得太细。13 MIN ↗描边方向烘焙几何壳需要一份跨硬边连续的外扩方向,着色法线仍保留原有棱角。输入是网格拓扑、面法线与权重,输出是每级LOD可复现的顶点方向和存储契约。壳的像素宽度、深度与屏幕方案见描边。4 MIN ↗Face SDF鼻翼和眼窝的真实阴影很细碎,原画却常用一块连续暗面。Face SDF 把设计好的明暗边界存成可比较的灰度场,头部局部光方向决定阈值。灰度值的含义、左右通道与头部坐标对齐,明暗才会随转头连续。6 MIN ↗NPR材质与分层光照把NdotL分成亮暗两档,很快能得到卡通明暗,但多个光源、阴影和不同材质一起出现时,分界未必还是想要的形状。NPR材质先定义明暗坐标和区域规则,再决定颜色、高光与遮挡怎样组合。每项遮罩能单独显示,才能知道风格来自哪份数据。8 MIN ↗NPR与场景风格导读风格化渲染把材质、明暗、轮廓和资产运动组织成同一视觉语言。先确定目标画面的形状尺度、色板、明暗层级与线条,再选择能表达这些关系的数据和算法。2 MIN ↗
光线求交与BVH光线追踪最基础的问题是:给定一条射线,找到沿正方向最近的有效交点。加速结构的价值在于尽早排除不可能命中的几何;求交结果与逐个测试完全相同,变的是要检查多少图元。7 MIN ↗光追降噪原始光追噪声只有颜色,滤波不知道相邻样本是否来自同一表面。降噪加入深度、法线、粗糙度与命中距离,再决定历史与邻域能否复用。拒绝太松产生拖影,太严则保留噪声,诊断要看具体拒绝原因。4 MIN ↗实时光追采样一条阴影射线只返回一次可见性,半影需要多次样本的统计结果。实时光追按效果分配射线,再用重要性分布与混合追踪减少无效工作。采样和滤波分别决定估计质量,不能把稳定滤波当成正确采样的替代。4 MIN ↗ReSTIR光源很多时,一个像素只看几次候选,容易漏掉重要贡献。ReSTIR 用一个蓄水池保存代表样本及统计量,再把附近像素和历史帧的代表样本拿到当前像素重新评价。它压缩的是候选集合;要得到正确亮度,还必须补回选择概率和样本计数。13 MIN ↗ReSTIR支持域与归一化来源蓄水池可能照不到当前像素能接收的光。本文说明这种支持差异怎样影响合并,以及两遍归一化如何维护贡献乘数。源池j保存代表Yj、乘数Wj、计数Mj及源表面;当前目标为非负函数targetCurrent,当前完整贡献为f,所有量采用同一光样本测度。单像素RIS、面积到参数测度转换和A/B/C/H帧调度见ReSTIR。9 MIN ↗
渲染路径与光源组织Forward 与 Deferred 决定材质和光照在何时求值,Tiled 与 Clustered 决定哪些光源进入局部计算。先分清着色时机与灯光列表组织,再比较成本。2 MIN ↗渲染命令的组织方式渲染任务需要把资源访问和绘制操作转换为可提交的 GPU 命令。采用 Render Graph 时,图负责从依赖编译执行计划;Render Pass 表达附件使用范围,Command Buffer 承载操作记录。这些概念各自处理不同层次的组织问题。2 MIN ↗Command Buffer与帧提交CPU刚记录完一帧,就把上传缓冲拿去写下一帧,看似节省了内存,GPU却可能还在读旧内容。命令记录、队列提交和GPU完成发生在不同时间。我们沿这三个时刻追踪每个帧槽位的资源,完成值达到以后再复用,就能解释在途帧既影响吞吐也影响寿命。5 MIN ↗Deferred Rendering几十盏灯照向同一个物体时,每盏灯都需要表面位置、法线和材质参数。Deferred Rendering把这份共同输入先保存到GBuffer,再让灯光读取它。几何与材质属性生成一次,影响表面的灯仍逐盏求值;能省下多少工作,要与写入和读取这些附件的成本一起计算。15 MIN ↗Draw Call与合批Frame Debugger里的Draw数量减少了,GPU时间却没变,说明原瓶颈可能不在提交。合批改变命令与状态组织,实例化仍会为每个实例处理顶点和像素。把CPU准备、Draw、实例数据与覆盖分开计量,再比较静态、动态、SRP和实例路径。5 MIN ↗Forward Rendering与Forward+材质着色时逐盏灯计算很直接,灯一多,每个片元遍历的无关光源也变多。Forward+把筛灯提前,材质仍在前向阶段计算。先检查列表保守性和资源可见性,再看提交、像素和列表构建的总成本,才能判断这一步是否改善整帧。3 MIN ↗GBuffer布局延迟光照要从GBuffer取出表面参数。如果给每个参数单独分配通道,布局很快会变大;若过度压缩,法线、分类或遮罩的误差又会改变光照。我们先看字段由谁消费,再用编码和复用减少成本。8 MIN ↗GPU同步与屏障Compute已经写出了结果,接下来的顶点着色器却读到旧数据,这时再调用一次Draw通常解决不了问题。GPU阶段可以重叠,命令排在后面不等于写入已对读取可见。我们沿着访问阶段、资源范围与队列关系,把必要依赖写成屏障,再用帧标记检查读者拿到的是哪次结果。4 MIN ↗GPU资源绑定材质参数已经上传,着色器却采到别的纹理,问题可能出在绑定表与对象寿命。描述符告诉GPU从哪里、按什么格式读资源,它不负责上传数据,也不负责完成写后读同步。先把布局、索引和更新频率对应起来,再检查GPU尚未结束访问时哪些槽位不能复用。13 MIN ↗GPU资源生命周期纹理对象在CPU上已经析构,GPU仍可能持有未完成的读取。反过来,图内句柄结束也不意味着物理内存立刻释放。要把这几种寿命分开:内容何时有效、分配何时可复用,以及最后一条GPU访问何时完成。上传、回读、临时纹理和历史都沿这条规则管理。3 MIN ↗Pipeline State Object同一个着色器先画普通颜色,再画不同格式的目标或开启MSAA,可能需要不同的管线状态对象。PSO把编译程序与固定状态组合起来,缓存遗漏往往来自把某个状态忘进了键。我们从一次绘制需要的完整组合开始,再看创建、缓存和最后使用完成的边界。3 MIN ↗Render Graph给渲染器加一个模糊效果,算法本身可能很简单:把场景颜色降采样,模糊,再合成回最终颜色。但接入一帧时,还得回答几个问题:降采样结果什么时候才能读?临时纹理什么时候可以回收?效果关闭以后,前面的通道还要不要执行?11 MIN ↗Render Pass与附件一个全屏效果接进来以后,颜色被清掉或深度突然失效,往往不是滤波公式的问题,而是附件在通道边界怎样保留没有说清。Render Pass把这段执行范围里的颜色、深度和模板联系起来。先问开始要读什么、结束谁还要用,再确定load/store、格式和样本数。3 MIN ↗Tiled与Clustered光源剔除让每个像素遍历场景所有灯,很多计算只是排除根本照不到它的光源。Tiled和Clustered先把灯分配给屏幕区域或三维簇,材质只读取本区域的列表。列表必须保守且有容量规则,否则一次溢出或深度范围遗漏就会让灯光消失。4 MIN ↗
性能对照实验性能调查先确定可复现负载和指标,再设计能排除假设的实验。帧捕获解释执行了什么,GPU 计时解释成本;两者需要结合,单次捕获截图不能代表长期稳定收益。4 MIN ↗移动端渲染优化冷机跑得顺、持续战斗后降帧,说明设备的持续预算比短时峰值更紧。频率下降会延长同一批工作,附件往返和透明覆盖又会增加工作量与功耗。优化先确定设备能持续提供多少吞吐,再追踪一帧要求它处理什么。6 MIN ↗帧捕获与性能分析工具性能分析的目标是形成证据链:哪一帧慢、哪一侧慢、哪个事件占时间、它为什么慢、修改后是否改善。11 MIN ↗帧瓶颈诊断性能优化先看时间,不先看方案名称。60 FPS 的单帧预算约 16.67 ms,30 FPS 约 33.33 ms。FPS 是帧时间的倒数,平均 FPS 会掩盖偶发尖峰。8 MIN ↗PSO首次使用卡顿一个特效第一次出现时卡一下,再出现就正常,可能是资源加载,也可能是管线创建触发了驱动编译。PSO 调查把首次请求、编译完成与首次绘制分开记录,再判断缓存缺失、预热过晚还是组合覆盖不足。机制与缓存键见 Pipeline State Object。8 MIN ↗VFX性能粒子只有两个三角形,也可能覆盖整个屏幕很多次。VFX性能把模拟、碰撞、排序和像素混合分别测量,降级根据真正瓶颈调整。少粒子不保证低重复绘制,局部快也不保证整帧快。3 MIN ↗
编辑器工具的事务与批处理编辑器修改分为交互对象事务、批量文件发布,以及对象与文件共同提交三类问题。本文给出阅读入口;完整补丁、数例、宿主API与恢复顺序由对应专题说明。先阅读编辑手势与撤销,批处理进入批处理条件发布,跨资源操作进入跨资源编辑恢复。4 MIN ↗编辑手势与撤销拖动位置X时,面板和Gizmo连续显示2、3、9,撤销需要回到手势开始时的1。本文沿字段补丁、稳定身份与宿主事务说明一次编辑的预览、提交和补偿。跨文件批次的条件发布见批处理条件发布,对象与文件的持久共同决定见跨资源编辑恢复。8 MIN ↗程序化资产生成道路参数改了一点,如果整张地图的树都重新随机,人工调整就失去了依据。程序化资产用规则和种子建立可重复数据流,再把局部覆盖作为独立层保留。生成、验证与发布围绕稳定ID工作。4 MIN ↗大型资产版本控制二进制源文件每次修改形成独立逻辑版本,底层存储是否差分取决于系统,两人同时编辑时字节合并并不理解创作内容。大型资产版本控制需要同时安排历史、带宽、锁和文件粒度,构建验证再确认一个提交确实能生成结果。11 MIN ↗跨资源编辑恢复操作J把对象O的资产引用从V10切到V11,文件版本已经提交,宿主呈现却可能中途失败。本文定义共同提交日志、包内操作标记和条件逆操作,使每个恢复步骤都有明确前态。普通手势与宿主API见编辑手势与撤销,批次计划及回执见批处理条件发布。7 MIN ↗批处理条件发布A、B、C三个资产按GUID形成固定计划,A已经发布,B生成到一半时用户取消。本文说明计划哈希、条件发布、检查点与工具版本如何决定重跑的起点。普通对象手势见编辑手势与撤销,同时修改对象和文件时采用跨资源编辑恢复。7 MIN ↗资产构建与发布资产管线要把制作源转换成引擎可用、可追踪、可回滚的发布物。成熟流程不依赖某个人记住所有选项,而是把契约、验证、转换和状态写入工具与记录。7 MIN ↗资产构建CI构建机拿到的是LFS指针,导入器仍可能报文件损坏。资产CI先确认真实输入和工具版本,再按依赖执行验证、构建与发布。缓存键包括源、配置和依赖,才能让增量结果与干净构建一致。3 MIN ↗DCC资产交换资产交换的目标是让几何、材质、骨骼、动画、单位和依赖在不同软件之间保持可解释,“文件能打开”只是最低要求。每经过一次 Export/导入,都会发生数据模型映射,也就多一次丢失语义的机会。9 MIN ↗WFC随机放模块容易让门对墙,WFC先为每个格子保留候选集合,再用相邻兼容规则逐步缩小。选择一项会影响邻居,因此传播直到稳定;出现空集合时回退或重试,而非把非法拼接当作成功。3 MIN ↗
不可变文件发布场景7的当前清单g7指向不可变版本A。发布者P准备版本B,发布者Q同时准备版本C。本文说明文件准备、清单代次比较、持久回执与暂存保护如何共同决定正式版本。字节读取与解码见文件IO;跨进程读者和删除器的共同仲裁见文件版本代理与回收。5 MIN ↗插件关闭与卸载设插件M包含解码器A与缓存B,A→B表示A的后台工作和析构仍会访问B。界面线程T执行A的线程受限清理,W是A的工作者,Q是延迟回调。宿主协调者H推进模块阶段;单对象协调者S可以把A的唯一关闭记录CA交给H,所有权代次由3增至4。对象表、令牌及交接协议见 插件接口与对象借用。6 MIN ↗插件接口与对象借用设宿主加载插件M,先创建缓存B,再在界面线程T创建解码器A。A借用B,后台任务W及延迟回调Q访问A。本文规定接口创建、对象登记、调用保护、借用关系与单对象关闭的交接;模块整体卸载见 插件关闭与卸载。8 MIN ↗对象池弹丸反复创建销毁,可以改成租用已有实例,但上一轮速度、任务和事件必须先清理。对象池管理的是取得与释放契约,槽位复用之前还要确认旧使用者退出。3 MIN ↗对象生命周期场景里的加载对象已经消失,解码任务却还在写像素,事件发布者也还保存着它的回调。此时把包装对象交给GC,既不能说明任务结束,也不能说明原生缓冲可以释放。对象生命周期要把拥有关系、可达关系和实际使用期间分别跟踪,再确定每份资源的回收条件。4 MIN ↗进程与调度后台任务可以不阻塞界面,却未必同时占用多个核心。进程提供地址与故障隔离,线程由OS调度,协程与Task再在其上组织工作。系统调用、等待和切换各自影响延迟。6 MIN ↗空间索引所有对象两两比较会快速增长,空间索引先排除不可能相交区域。Grid、树与BVH保存不同分布,构建、更新和查询要一起比较。场景图表达语义父子,不能替代空间索引。4 MIN ↗跨语言接口C#把中文名字交给原生插件,插件返回一段缓冲。两边即使成功链接,也可能因长度单位、布局或释放方不同而崩溃。跨语言接口先固定线上或ABI上的字节契约,再安排所有权、错误和异步完成,最后才选择绑定工具。3 MIN ↗内存布局与分配设一帧更新一批粒子,CPU计算位置和速度,随后复制队列把结果送给GPU。我们先决定热字段怎样连续读取,再为这批数据分配对齐存储、构造辅助对象,最后等待CPU与GPU消费者退出后复用帧槽。总字节数相同并不意味着访问成本相同;CPU帧结束也不意味着这一批存储已经能重用。8 MIN ↗容器选择链表插入是常数时间,找到那个节点却可能遍历整表。容器选择先列出主要操作与引用稳定性,再比较数组、哈希和有序树。实际缓存和分配常常决定理论复杂度能否兑现。5 MIN ↗算法设计先建一个二维数组,不会自动得到动态规划。算法设计先定义状态、选择和重复子问题,再比较递归、分治、贪心与缓存。复杂度解释规模增长,实际布局和常数决定工程成本。5 MIN ↗算法与数据结构导读算法决定状态怎样推进,数据结构决定这些状态怎样保存与查询。工程中先写清工作负载,再在求解、容器、图和空间索引四条路线里选择。2 MIN ↗图搜索任务依赖要先于消费者,导航路线则要成本更低,两者都用图但目标不同。图搜索先固定边语义,再选择拓扑、最短路或启发式。环、负权和过期堆条目改变算法前提。4 MIN ↗文件版本代理与回收场景7的加载器通过文件服务读取不可变版本A,发布者随后把清单从g7/A切到g8/B。本文追踪服务令牌、逻辑读取与持久版本保护,直到A可以删除。文件准备、发布回执及正式版本根由不可变文件发布定义;系统请求和解码缓冲的寿命见文件IO。5 MIN ↗文件IO第一次读取慢、第二次快,可能只是同一批字节已经进入系统页缓存。文件IO需要沿着实际消费者追踪数据:文件版本给出字节身份,系统请求把字节送入应用缓冲,解码器把它变成资源,发布入口决定哪个版本开始对读者可见。某一步完成,并不意味着后面的使用者也已经结束。9 MIN ↗线程受限资源的关闭解码器A运行于插件M,借用缓存B,并在界面线程T持有窗口与COM接口I。A通过I建立订阅,窗口销毁通知还要经I归还通知令牌。因此收尾顺序是撤销订阅并排空业务回调、销毁窗口并等待同步回调退出、释放I,最后才析构A并归还B的缓存。本文沿这条资源依赖解释线程派发和异步结果对账。模块从Closing进入Draining完成准备与排空,再进入Destroying执行析9 MIN ↗线程同步一个后台线程把任务放进队列,另一个线程醒来取走它,看起来只需要一个通知。但消费者醒来时,队列仍可能为空;程序停止时,空队列里的线程又可能永远睡着。通知、共享数据和线程寿命分别解决什么问题,决定了这个队列是否可靠。8 MIN ↗虚拟内存申请很大地址区间,不一定立刻占用同样多物理内存。虚拟内存把地址与物理页分开,首次访问可能触发缺页,随机工作集又会增加TLB开销。Reserve、Commit和驻留要分别观测。3 MIN ↗帧分配器的构造与退休一批4个粒子的位置与速度各占64字节,年龄占16字节。CPU生成这144字节SoA源数据,再打包为GPU消费的192字节AoS。分配好存储后,辅助对象还需要按依赖构造,CPU任务与GPU队列全部结束以后才能析构和复用。本文给出构造登记、依赖借用和帧槽退休协议;字节布局、对齐与线性游标见内存布局与分配。示例对象A的析构需要对象B,三个帧槽按实际队列完成值轮换。6 MIN ↗C++工程边界设编辑器加载资产插件M,先创建缓存B,再在界面线程T创建解码器A。A借用B的缓存页,后台任务W处理资产,T还管理A的窗口和COM接口。用户关闭A时,W尚未退出,随后又要求卸载M。宿主要分别保证声明和字节契约、对象与模块寿命、清理线程与执行次序。4 MIN ↗C++构建与对象模型资产插件与宿主分别编译,公共头文件约定可见声明,链接器连接定义。本文沿构建产物进入对象内部,说明构建故障、布局、多态和异常保证。稳定的跨模块接口见 插件接口与对象借用。8 MIN ↗CSharp运行模型编辑器能通过反射创建类型,AOT构建却可能缺少实例或被剥离。C#运行模型先看IL如何变成本机代码,再看值类型复制、装箱、委托可达性与异步状态机。托管回收和原生资源释放有不同职责。6 MIN ↗Python宿主集成系统解释器能导入的扩展,在DCC内可能加载失败;后台计算已经完成,写回时用户又可能换了场景。Python宿主集成需要同时匹配解释器二进制环境与宿主对象的操作期间。先确认程序实际运行在哪里,再安排计算和提交的边界。3 MIN ↗
补偿隔离与冲突接管任务J创建房间R与桌子T,移动A形成挡路布局,移动B让出通道,验证尝试V2通过后进入审核。取消时依次撤销B、A与创建操作;撤销B会暂时恢复挡路状态。本文说明这类中间态的隔离、人工编辑冲突,以及残留对象的维护接管。版本游标与墓碑机制见场景补偿的版本承接。6 MIN ↗场景补偿的版本承接任务J在房间R中创建桌子T,移动A把T的局部X从0改为1,移动B再从1改为2。取消需要按B、A、创建的逆依赖顺序恢复,同时保留人工编辑。对象版本随每次写入单调增加;回到历史位置也会产生新版本。本文说明补偿如何承接这些版本。补偿期间的隔离与审核见补偿隔离与冲突接管。6 MIN ↗场景工具的条件执行场景工具接收规划器的目标后,还要防止输入过期、重复执行和旧执行者迟到写入。本文以任务J在房间R内创建桌子T、再执行移动A和B为例;R与T是稳定对象ID,r、v和c分别表示对象与集合版本。几何规则见资产布局的几何验证,这里说明宿主何时有权提交变更。8 MIN ↗扩散模型随机噪声没有清晰对象,去噪网络却能在条件引导下逐步生成结构。扩散模型根据时间或噪声等级预测状态变化,采样器按训练参数化推进。VAE、条件编码和数值精度共同决定最终图像。5 MIN ↗生成条件控制提示词能描述“抬起左手”,却很难把每个关节固定在指定像素。结构图提供位置约束,参考图提供外观特征,它们通过不同路径影响去噪网络。先追踪这两份输入进入哪一层,再调整强度,才能区分输入错误与条件竞争。3 MIN ↗视频历史重投影角色在画面中向右走,逐帧重绘却让衣服花纹留在原地;角色经过柱子,又把柱子的颜色拖到身后。前一种问题来自对应位置错误,后一种来自复用了已经遮挡的历史。固定随机种子不会提供表面对应关系,时间滤波也无法自己判断历史属于谁。8 MIN ↗视频曝光与关键帧融合历史传播可能积累亮度漂移,左右关键帧也可能传播出冲突外观。本组示例使用同一镜头的渲染序列,第0、10帧为批准关键帧,角色在第3帧被柱子遮挡、第4帧重新显露。R是当前原始渲染色,D是以米计的正向视深度,ID是稳定对象标识,W是重投影历史色,M是有效历史二值遮罩;颜色在固定色调映射后的显示线性RGB域混合,交给模型前编码为sRGB。Q表示局部历史置信度,Aanc8 MIN ↗视频生成的逐步颜色约束有效对应只提供可复用的颜色,模型还需要明确的初始化、加噪和逐步约束规则。本组示例使用同一镜头的渲染序列,第0、10帧为批准关键帧,角色在第3帧被柱子遮挡、第4帧重新显露。R是当前原始渲染色,D是以米计的正向视深度,ID是稳定对象标识,W是重投影历史色,M是有效历史二值遮罩;颜色在固定色调映射后的显示线性RGB域混合,交给模型前编码为sRGB。Q表示局部历史置7 MIN ↗视频生成任务恢复同一镜头以第0、10帧为批准关键帧,两个方向分别生成候选,再融合成最终序列。本文输入任务、前驱历史与候选结果的不可变清单,输出恢复后的任务身份、选定结果和提交指针。历史中的颜色、几何、局部置信度Q及锚点路径置信度Aanchor按视频历史重投影与视频曝光与关键帧融合定义;这里沿第4帧的两次恢复追踪它们的清单身份。7 MIN ↗视频生成时序一致性视频生成的时序一致性依赖表面对应、历史拒绝、模型条件与关键帧确认。固定随机种子支持相同任务重试,表面对应与遮挡由几何或估计光流提供;每份结果通过不可变清单连接,恢复按清单继续。3 MIN ↗资产布局的几何验证资产布局需要同时满足碰撞、通路与交互规则。本文以任务J布置房间R和桌子T为例:移动A形成验证尝试V1,通路失败后移动B形成V2。每次验证读取同一份实际场景快照;任务状态和最终发布见资产任务编排与发布。7 MIN ↗资产任务编排与发布一张餐桌放进房间后,几何检查通过了,入口到座位的通道却被挡住。规划器把桌子移开,视觉审核又要求取消这次布局。此时系统既要恢复任务自己的修改,也要保留期间发生的人工编辑;工具超时或进程中断还可能让执行结果暂时未知。7 MIN ↗Agent资产管线Agent资产管线把需求解析、资产选择、场景执行、技术验证与审核发布连接成可恢复任务。模型提出语义候选,工具提交明确状态变化,验证器读取实际产物;任务记录保存它们共享的身份、版本与回执。4 MIN ↗ComfyUI工作流节点图能连通,只证明接口类型可接,不能证明模型与潜变量语义匹配。一份可复现工作流需要把输入怎样进入节点、任务何时执行,以及哪些文件证明完成连起来。这里以自托管文生图为例,沿图、请求ID和输出清单追踪一次任务。4 MIN ↗LoRA训练少量角色图可以教会模型身份,也可能把背景和姿势一起记住。LoRA固定基础权重,学习低秩增量;训练数据和图像描述先区分目标与可变因素,验证集再检查未见视角与组合条件。4 MIN ↗
刚体物理求解实时物理不是逐帧“算出真实世界”。它在固定时间步内完成积分、碰撞检测和约束求解,并接受可控误差。稳定性、可重复性和玩法手感通常比绝对物理精度更重要。7 MIN ↗破坏系统一堵墙受到撞击以后,裂缝出现并不意味着整堵墙都应变成独立碎块。仍然连接地基的部分需要留在原处,脱离的部分需要得到质量、碰撞和速度,通道是否打开还必须与玩法判定一致。破坏系统把这些变化组织成一次从资产连接到物理状态的转换。12 MIN ↗载具物理车轮转得很快,车却没有向前走,可能是轮胎已经耗尽附着,也可能是车轮根本没有载荷。直接给车体设置速度看不到这两者的差别。载具物理先确定轮地几何,再把悬挂载荷交给轮胎,轮胎力同时改变车体运动和轮速;下一步用更新后的状态重新计算滑移。15 MIN ↗Character Controller把玩家当普通刚体推,接触响应未必符合操作意图。Character Controller以胶囊扫掠寻找最早碰撞,再沿接触面滑动;台阶、坡面和移动平台分别定义规则。位移和碰撞的单位必须一致。6 MIN ↗Ragdoll动画把骨骼摆到当前姿态,物理系统却可能还停在绑定姿态。直接开启动态刚体时,两份状态发生冲突,角色会突然跳动。Ragdoll的切换先建立骨骼与刚体的空间对应,再把速度和控制权交给物理求解器。6 MIN ↗XPBD增加普通PBD迭代次数,布料会变硬,参数难以跨时间步保持一致。XPBD把柔顺度与累计乘子加入约束更新,让柔软度有明确量纲。迭代顺序和有限预算仍影响收敛。3 MIN ↗
导航边界与坡面交接局部避障提出的速度还要让身体留在走廊内,并为坡面边界保留停车距离。本文从本步边界约束推到整段连续曲线、停车包络与跨坡面交接。输入采用移动支撑与速度反馈定义的相对速度v和坡面换算系数k;令地表速度上限为V,本地块水平上限为Vh=V/k,候选求交见局部避障。11 MIN ↗导航动作交接寻路完成后,候选走廊还要通过版本检查,取得移动器,处理到达后的站位保持,并在失效时释放控制权。本文跟踪半径0.4米的守卫:门D在查询Q7时开启为版本8,门关闭后变为版本9。目标几何见导航目标投影,路线求值见路径跟随,动作身份与计划归属见游戏AI决策模型。12 MIN ↗导航目标投影守卫半径为0.4米,靠近掩体或交互槽时,需要寻找身体、朝向、视线与接触均可成立的站位。本文从目标数据推到合法位置集合,通过连续区域与球探头数例说明合法姿态的验证。可行走表面由NavMesh提供,合法目标交给导航动作交接#查询快照与采用。8 MIN ↗计划终态与重规划行为树返回成功,只说明这次步骤结束;撤退目标是否成立,还取决于实际弹药、掩体和站位事实。本页从根终态消费展开Satisfied、Replanning和Exiting三条路径,输入是宿主回执和最新事实,输出是保持目标、登记新计划或退出模式。进入与采用的提交边界见决策计划提交,树叶清理见状态机与行为树。6 MIN ↗局部避障角色需要在短期内避开动态邻居,同时尽量接近路线给出的首选速度。本文从圆盘速度障碍构造ORCA半平面,再与速度和加速度圆求交。守卫身体半径为0.4米,角色间避让另取0.5米半径;移动支撑与速度反馈提供同一世界基下的实际步末速度。6 MIN ↗决策计划提交搜索返回步骤以后,角色还不能立即执行。调度器需要核对模式、目标与输入是否仍有效,再把执行树和首条命令共同发布。本页采用决策输入与动作交接的身份体系:模式实例拥有计划上下文,计划代次区分修订,树实例执行某次已采用的计划。Planning表示等待规划,Executing表示执行树已经安装。持久出站表与日志的前提见决策日志与恢复。5 MIN ↗决策日志与恢复进程在命令登记后、接纳前退出,恢复时必须确认原请求是否已发生。本页给出采用统一有序日志、宿主接纳账本和恢复排他边界的一种持久化架构;普通内存内NPC可以采用更轻量的状态保存策略。输入是已提交日志、世界快照和回执账本,输出是恢复后的同一动作身份及待续交请求。命令与实例的区别见决策输入与动作交接,计划安装见决策计划提交。7 MIN ↗决策输入与动作交接守卫正在追击敌人,敌人突然消失,下一帧又收到受伤事件。决策系统既要决定继续搜寻还是撤退,也要让旧移动真正停止,再把移动器交给新动作。只选对行为名称,还不能保证角色执行的是这次决定。6 MIN ↗路径跟随搜索给出相邻多边形走廊,角色还需要转向点与速度计划。本文沿门户、漏斗、转角和制动生成路线,并检查路线失效与实际进度。身体半径已由NavMesh烘焙侵蚀;目标和查询采用见导航目标投影与导航动作交接。6 MIN ↗群体战术信息敌人离开视线后,NPC仍需要记住最后位置,却不能把这份记忆当作实时坐标。群体战术信息先保存允许观测的事实,再把威胁写入空间场,按时间衰减并沿可通行邻接传播。决策查询的是带来源和时效的信息,而不是直接读玩家组件。3 MIN ↗效用评分与目标规划守卫受伤时,决策先比较继续交战、搜寻和撤退的可行性,再把选中的目标展开成具体动作。本页输入为只读事实快照、候选门禁与偏好、有限动作模型,输出为目标和有序原子步骤。执行与取消由状态机与行为树负责,候选的正式采用见决策计划提交。5 MIN ↗移动支撑与速度反馈路径速度表在水平面表示运动,身体却沿坡面和移动支撑前进。本文定义水平速度、相对支撑速度、世界速度及步末反馈的换算。输入来自路径跟随,结果供局部避障、导航边界与坡面交接与Character Controller消费。6 MIN ↗游戏强化学习训练回报增加,角色可能只是学会刷一个错误指标。游戏强化学习先定义上线可用观测与合法动作,再让奖励反映真实目标。策略训练、推理部署和权威规则校验是不同阶段。5 MIN ↗游戏AI导航导航系统把可行走空间转换为身体实际能够执行的运动。本文提供流程与专题入口;各项计算在对应主归属展开。6 MIN ↗游戏AI决策模型游戏AI决策连接事实、目标选择、计划和动作执行。守卫从巡逻进入交战,受伤后撤退;读者可以沿下面的路线理解这次决定怎样取得资源、停止旧动作并恢复未完成请求。4 MIN ↗状态机与行为树守卫从追击切到攻击时,旧移动需要停止,攻击才能取得资源。本页分别展开独立状态机和模式内行为树的生命周期;两者共享决策输入与动作交接中的命令、动作实例和取消协议。独立配置由状态直接登记动作,组合配置由模式内的树叶登记动作。7 MIN ↗MCTS四颗石子放在桌上,两人轮流拿走一颗或两颗,拿走最后一颗的人获胜。根玩家现在行动:拿一颗会留下三颗,对手无论怎样拿,根玩家都能拿完;拿两颗却允许对手立即获胜。这个小游戏可以穷举,也能让我们看清蒙特卡洛树搜索(MCTS)怎样用反复试局逐渐偏向第一个动作。6 MIN ↗NavMesh守卫半径为0.4米,导航需要先从场景几何生成容得下身体的可行走空间。本文说明空间表示、烘焙参数、世界尺度与移动支撑的数据组织;输出交给导航目标投影和导航动作交接#查询快照与采用。5 MIN ↗
对局服务器架构同一场对局的消息不能随机分给多台服务器。对局架构先确定权威实例,再安排会话路由与持久化边界。实时热状态与交易状态有不同延迟和一致性要求,故障恢复必须保持单一所有者。7 MIN ↗服务端反作弊校验客户端请求可能带合法身份,却仍给出不可能位移或伤害。服务端校验先用权威Tick和能力约束解释请求,再记录偏差与上下文。协议认证、行为统计和处罚规则分别承担职责。3 MIN ↗回滚同步格斗输入晚到几帧,系统可以暂时预测,再回到历史状态重算。回滚同步需要可恢复的完整模拟状态、确定输入顺序和受控副作用。固定时间步只是条件之一,跨平台数值与容器顺序仍要验证。3 MIN ↗客户端预测本地玩家等待往返确认才移动,会直接感到延迟。客户端预测先执行输入,服务器确认后恢复权威状态并重放剩余命令。逻辑修正立即生效,显示偏移再平滑,不能只线性插值权威碰撞位置。11 MIN ↗快照同步远端输入尚未到达,本地通常只能显示已收到的状态。快照同步保留一段历史,在两个确定快照之间插值;压缩只相对接收端已确认基线,丢失时用完整状态恢复。11 MIN ↗世界分区与AOI玩家看到的对象集合与对象由哪台服务器计算,是两份不同的状态。兴趣区域(Area of Interest,AOI)筛选玩家需要接收的实体;世界分区给服务器分配权威。玩家走过区界时,系统既要保证附近对象正确出现和移除,也要保证每条输入只由当前权威产生一次效果。两条链通过稳定实体ID相连,复制代数与权威代次分别解决客户端身份和服务器所有权的问题。10 MIN ↗延迟补偿命中射手看到目标还在门外,服务器收到射击时,目标已经走进门里。两端看到的是不同时间的目标。延迟补偿让服务器按射手所见时刻查询有限窗口内的碰撞历史,再把命中结果应用到当前权威状态。8 MIN ↗异步命中结算与恢复输入会话C的17号输入由射手实例S7、武器W3发出,服务器在Tick600消费,W3有2发弹药,开火画面瞄准T4;实际受击对象由全部合法受击体与遮挡体的最近交点决定。开火画面采用远端时刻9.820秒,服务器此时为10.000秒。延迟补偿命中确定合法查询时间、枪口和历史最近交点;本文从这份固定查询开始,说明弹药、异步结果、Tick提交与两次恢复的身份链。9 MIN ↗游戏网络传输一次send并不对应一次recv,UDP也不保证消息到达。游戏网络传输先定位端点,再根据消息有效期选择可靠性、顺序与拥塞策略。序列化长度与分帧保证接收端能安全识别完整消息。7 MIN ↗游戏网络时钟两端时钟的起点不同。客户端在本地第10秒收到“服务器第35秒”的快照,单看两个数字无法判断快照在网络上走了多久。网络时钟先估计两个时间轴的偏移,再把服务器时间换成模拟 Tick;测量的误差决定这份估计能用于多精细的判定。6 MIN ↗RPC服务端执行了请求,响应却丢了,客户端无法由超时判断是否成功。RPC需要请求ID、权限和幂等边界,重试查询已有结果,避免一次加金币变成两次。6 MIN ↗
引擎渲染扩展导读效果需要的资源和阶段,决定它应接入材质、屏幕通道还是网格绘制。先在通用帧模型中定位需求,再进入所用引擎版本的接口。2 MIN ↗Unity渲染帧组织同一个Renderer Feature在不同相机上出现两次,或者读不到预期颜色,先追踪实际渲染器与相机角色。SRP提供组织入口,URP/HDRP各有资源与通道约束。沿管线资产、相机数据、剔除、绘制与提交查源码,比只按类名猜执行位置更可靠。5 MIN ↗Unreal RDG Pass实现计算通道里确实写了纹理,结果却没显示出来,先看输出有没有被RDG的后续通道消费。RDG从参数结构读取资源关系,回调只负责执行具体工作。把输入、UAV、输出所有者和回调寿命说清以后,图才知道什么时候执行与回收。4 MIN ↗Unreal渲染帧组织游戏线程里对象已经改变,渲染帧却还用旧状态,先看更新怎样交给场景代理与渲染任务。Renderer组织可见性和通道,RDG安排资源,RHI表达后端请求。把这几个边界连起来,才能知道修改应放在哪一层,以及捕获里的命令对应哪份场景数据。5 MIN ↗Unreal自定义Mesh Pass一个效果需要筛选特定网格、选择着色器并写入独立附件时,Mesh Pass把这些规则集中成一组绘制。文章沿组件、网格描述、处理器和绘制命令展开,说明哪些状态能缓存、哪些数据必须在本帧更新。9 MIN ↗URP Render Graph自定义Pass一个全屏材质放进URP后,看不到通道,可能是没有入队,也可能是输出没有后续读者而被图剔除。RecordRenderGraph先声明资源和回调,实际绘制在执行阶段发生。我们从相机颜色到新目标,再把输出交回相机资源,沿这条路径检查每一步。4 MIN ↗
任务系统动画写姿态,渲染准备要读它,两项工作不能仅因线程池有空位就同时运行。任务系统把读写关系变成依赖,工作者只执行已就绪任务。粒度、等待与长尾决定并行是否值得。5 MIN ↗引擎世界与对象模型游戏引擎的各个模块要围绕同一套数据契约工作:平台、资源、运行时功能和制作工具都受它约束。分层的价值在于让依赖方向、对象所有权和更新时机可以被解释,目录整齐只是顺带结果。6 MIN ↗资源依赖与异步加载打开一个场景,资源文件已经读完,画面却仍要等纹理上传和对象激活。加载入口背后还有共享依赖、解压、反序列化与发布阶段,各阶段的线程和寿命不同。我们先把依赖解析成图,再按阶段调度,才能说明什么时候资源真正可用、取消请求以后谁来回收它。7 MIN ↗ECS与数据布局一批实体每帧按速度更新位置,循环只用位置、速度,却可能为名字、动画状态和其他字段加载大量内存。ECS把身份、数据和处理逻辑分开,具体存储方式决定这些访问是否连续。本页建立一个按组件组合分块的模型,沿字节地址、查询、位置更新和结构搬迁追踪一次执行。这里的布局是教学实现,具体框架可采用其他存储方式。6 MIN ↗Unity对象生命周期Unity对象比较为null时,C#包装引用仍可能存在,因为原生对象已经销毁。创建与Destroy涉及引擎注册、回调和资源引用,不等于new或托管GC。理解两层身份才能正确判断释放与复用。3 MIN ↗Unreal对象生命周期普通C++指针指向UObject,并不自然成为GC根。Unreal通过可追踪引用维护可达性,原生对象智能指针则是另一套机制。字段标记、显式引用收集和销毁状态需要沿目标版本核对。7 MIN ↗