1k words
Desc:…. GC的优化降低GC操作的方法: 1. 减少GC的运行次数 2. 减少单词GC的时间 3. 将GC的运行时间延迟,避免在关键时间触发,如加载场景的时候调用GC 实现策略: 1. 对游戏进行重构,减少堆内存的分配和引用的分配。更少的变量和引用会减少GC操作的检测个数 (栈中的内存也是通过虚拟机进行释放的,栈内存存放的遍历有着确定的释放时间(生命周期),在调用方法时,会在内存中分配对应的一块空间(栈帧),当方法调用结束后,对应的栈帧就会被释放掉) 引用 2. 降低堆内存分配和回收的频率,尤其是关键时隔 3. 分析GC操作和堆内存拓展的时间,使其按照可预测的顺序执行 减少内存的方法: 1. 缓存变量: 重复利用(减少重复获取组件的操作) 2. 减少逻辑调用: 堆内存分配最坏的情况是反复调用的函数中进行堆内存的分配,可以考虑增加时间间隔,或者属性值变化的时候执行(监听特定的属性值) 3. 清楚链表: 进行链表分配得到时候清楚链表,而不是不停的生成新的链表(结合对象池)...
12k words
Desc:记录战斗系统的实现 AOI主要解决游戏中多人同屏的问题 目标离你的距离远超你九宫格的距离,你依然要将他显示出来。那这个时候该怎么办呢?所以,我们顺其自然地有了一个新的概念——“关注者“,AOI搜寻到的列表并不能就完全等同于关注者列表。而客户端显示的就是关注者列表里面的内容。AOI搜寻到的列表只是用来获得关注者的手段 AOI并不需要双向连接 以游戏场景为例的话,假如周边有很多玩家的话,你不一定需要严格按照位置远近来排序,而是需要把跟你关联度最高的玩家加到你的关注者列表中 AOI的信息需要立即更新吗?不一定需要,我们未必需要时时刻刻关注离我最近的目标,附近的人这个功能里面的用户列表更新频率慢一点也没关系 技能系统一个完整的技能系统逻辑层主要包括三个模块:技能模块,buff模块,projectile(子弹)模块 技能系统中,所有的技能里面不包含任何具体技能效果及逻辑,每个技能根据其类型提供若干抽象接口,具体执行效果由策划去配置 技能类型:被动技能\主动施法技能\开关类技能\激活类技能 被动技能一般会在技能初始化时生效,技能初始化时会有抽象行为接口Ablilty::OnAlil...
3.5k words
Desc:记录阅读 build in 中关于BRDF的笔记 法线分布项 多次表面反射微表面BRDF不考虑从微表面多次反射(“反弹”)的光。 这种简化会导致一些能量损失和过度暗化,特别是对于粗糙金属 薄膜干涉常见的是用MatCap方式实现波动光学BRDF模型ShaderToyShaderToy如何在UE5中做出带薄膜干涉的油污地面 - 落月满江树的文章 反射项:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687// 法线分布函数(各向同性)inline float GGXTerm (float NdotH, float roughness){ float a2 = roughness * roughness; float d = (NdotH * a2 - NdotH) * Ndot...
9.4k words
代码 代码 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980half3 ShaderGI(ToonSurfaceData surfaceData,ToonLightingData lightData){ half3 averageSH=SampleSH(0); averageSH=max(_IndirectLightMinColor,averageSH); return averageSH;}half3 ShadeSignleLight(ToonSurfaceData surfaceData,ToonLightingData lightData,Light light,bool isAdditionLight){ half3 N=normalize(lightData.nor...

SRP

8.3k words
Desc:可编辑渲染管线,可以据此自定义修改管线内容,也可以学习渲染管线中实现 UniversalRenderPipelineAsset渲染管线资源继承自 RenderPipelineAsset 类 RenderPipelineAsset.CreatePipelineRP 资产的主要目的是为 Unity 提供一种方法来获取负责渲染的管道对象实例.资产本身只是一个句柄和一个存储设置的地方该函数返回一个管道对象实例 UniversalRenderPipeline渲染管线实例继承自 RenderPipeline RenderPipeline.Render此方法是可编写脚本的渲染管道 (SRP) 的入口点。此功能与内置渲染管道不兼容。 Unity 会自动调用此方法。在独立应用程序中,Unity 每帧调用一次此方法来渲染主视图,每帧调用一次Camera.Render。在 Unity 编辑器中,对于每个可见的场景视图或游戏视图,Unity 每帧调用一次此方法,如果场景摄像机预览可见,则每帧调用一次,对于每个摄像机每帧调用一次Camera.Render URP实现 12345678910111...

C#

C#
7.8k words
Desc:记录阅读源码中笔记 字符串优化:引用 ArrayList:原文 实现了 IList、ICloneable 接口 代码 12345678910111213141516171819202122232425262728public virtual void CopyTo(Array array) { CopyTo(array, 0);} // Copies this ArrayList into array, which must be of a // compatible array type. //public virtual void CopyTo(Array array, int arrayIndex) { if ((array != null) && (array.Rank != 1)) throw new ArgumentException(Environment.GetResourceString("Arg_RankMultiDimNotSupported"));...
11k words
Desc:在看实时渲染中做的记录,根据QianMo翻译后的文章进行学习,链接引用, https://github.com/QianMo/Real-Time-Rendering-3rd-CN-Summary-Ebook 图形渲染管线分为四个阶段: 应用阶段、几何阶段、光栅化阶段、像素处理阶段(RealTimeRenderer4th中的提出) 应用阶段通过软件的方式实现的阶段,开发者能够对该阶段发送的情况完全控制,改变实现方法来改变实际性能。其他阶段,全部或部分建立在硬件基础上,改变实现过程会非常困难 虽然不能分为若干个子阶段,但是可以在几个并行处理器上同时执行。超标量体系结构,可以在同一阶段实现不同的几件事 通常实现的方法: 碰撞检测、加速算法、输入检测、动画、力反馈以及纹理动画,变换仿真、几何变形,以及一些不在其他阶段执行的计算(层次视锥裁剪等加速算法) 主要任务: 末端,将需要在屏幕上显示出来绘制的集合体(图元:点、线、矩形)输入到绘制管线的下一个阶段 将摄像机位置、光照、模型的图元输出到管线的下一个阶段 几何阶段细分的功能阶段管线: ...
14k words
Desc:Unity中渲染的物体都是由网格构成的,而网格的绘制单元是图元(点、线、三角面)。绘制信息都存储在VertexHelper类中,除了顶点外还有法线、UV、顶点色、切线以及相关函数 代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475/// <summary>/// A utility class that can aid in the generation of meshes for the UI./// </summary>/// <remarks>/// This class implements IDisposable to aid with memory management./// </remarks>/// <example>/// <code>///...
776 words
Desc:略 向量细节 矩阵细节 四元数在游戏中,往往用于插值运算物体的旋转,相对于矩阵的运算,能够减少运算量并且只用存储四个浮点值link 加速度A=(v1-v0)/tv=v0+(a*t) Vector3 acceleration = new Vector3(playerInput.x, 0f, playerInput.y) * maxSpeed;velocity += acceleration * Time.deltaTime;Vector3 displacement = velocity * Time.deltaTime; 应用角色移动 贝塞尔曲线源 GPU的有界Bezier 通过判断函数的正负值,可以判断像素位于曲线内部(<0),还是在曲线外部(>0) 分段 Bezier 曲线 通过让连接处的切线相互平行且长度相等来改善连续性 优点: 可以使用一些低阶曲线来表示,并且最终曲线将会经过一组控制点 曲线艺术编程 coding curves 第八章 贝赛尔曲线(Bézier Curves)...
16k words
DescCore目录下的多个核心模块,Culling(裁剪)、Layout(布局)、MaterialModifiers(材质球修改器)、SpecializedCollections(收集)、Utility(实用工具)、VertexModifiers(顶点修改器) Culling(裁剪)对模型裁剪的工具类,大都用在了Mask遮罩上,只有Mask才有裁剪的需求 代码 12345678910111213141516171819202122232425262728293031323334353637383940414243Clipping.cs传入 RectMask2D 列表,计算出他们重叠部分的区域/// <summary>/// Find the Rect to use for clipping./// Given the input RectMask2ds find a rectangle that is the overlap of all the inputs./// </summary>/// <param name="rectMa...