- 博客(58)
- 收藏
- 关注

原创 【源码Inside】Unity中函数调用流程
1、当包含Awake和Start的Script文件被Enable的时候---就是挂在在GameObject(Active)上的脚本前面被勾选时: 这时Awake和Start都会在一载入脚本的时候进行执行,且只执行一次。存在先后顺序且,且都在物体被初始化完毕后执行,Awake的先于Start函数前被执行2、当包含Awake和Start的Script文件被Disa...
2019-09-24 14:39:44
397
原创 UE4 动画
动画的更新入口:TickPose(USkeletalMeshComponent)调用位置:TickCharacterPose(UCharacterMovementComponent)保证位置的更新在TickPose之后; 可能的原因是RootMotion(先猜测)TickPose:void USkeletalMeshComponent::TickAnimation(float DeltaTime, bool bNeedsValidRootMotion){ ...
2022-01-11 00:06:53
312
原创 对象构造流程SpawnActor
相关函数:AActor* UWorld::SpawnActor( UClass* Class, FTransform const* UserTransformPtr, const FActorSpawnParameters& SpawnParameters ) 函数分析: 内部仍然调用NewObject接口来实例化一个Actor, 看流程仅仅根据static_class来获取Allocate的空间大小, 且设置相...
2021-11-16 21:58:00
640
原创 GAS GameplayEffect
UGameplayEffect相关:1.UGameplayEffect 作为效果的基类, 可以继承从而开发自己的效果类2.FGameplayEffectSpec 首先F开头(多用于结构体), 不继承自UObject因此不会进行垃圾回收; 作用:聚合UGamplayEffect类对象, 然后附加运行时的一些数据和Context上下文。 例如Level , FGameplayEffectContextHandle3.FGameplayEffect...
2021-10-16 13:46:24
444
原创 Ue4 GAS
GamePlayTags: 核心数据结构:AbilitySystemComponent::FGameplayTagCountContainer主要用于区别Object以及描述Object的状态了;例如如果角色被Stun(眩晕)了,那么在Stun期间,我们可以给角色一个GamePlayTag:State.Debuff.Stun 使用FGameplayTag::RequestGameplayTag(FName("Your.GameplayTag....
2021-09-07 15:37:55
449
原创 Ue4 UMG
1.视口变动导致受锚点控制的Widget位置变化出现的问题 在播放UI特效的时候,发现Widget的位置不对;第一反应是因为canvasPanel不带有自动计算位置,所以以为是这个问题(根本没搞懂缩放以及锚点控制,以及自动的位置排布计算之间的不同)。 DPI(每英寸像素密度)device_solusion/design_solution,缩放是针对整个屏幕的分辨率来做的缩放调整,各控件的相对位置都是不变的;当像素密度大于设计分辨率时,进行放大;小于设计分辨率时进行缩小...
2021-08-25 16:40:22
483
原创 游戏所需的三维数学
1.四元数 把单位四元数视为三维旋转;单位四元数可以视觉化为三维矢量加上第四维的标量坐标,矢量部分qv是旋转的单位轴乘以旋转半角的正弦;而标量部分qs是旋转半角的余弦。 其中a为旋转轴方向的单位矢,而θ为旋转角度。旋转方向使用右手法则:使右手拇指朝向旋转轴的方向,正旋转轴角则是其余4只手指弯曲的方向。 万向锁: 翻滚角不会影响 y z维度方向 俯仰角不会影响...
2021-08-13 13:40:54
396
原创 Ue4 UI优化文档整理理解
1.名词解释User Widget:对应一个用户界面。Widget Tree:每一个 User Widget 都是存储成树状结构。Panel Widget:不会渲染出来,用于对 Child Widget 进行布局,如 Canva Panel, Grid Panel, Horizontal Box 等。Common Widget:用于渲染,会生成到最后的 Draw Elements 中,如 Button, Image, Text 等。2.渲染流程...
2021-08-05 16:26:57
1072
原创 unity 2017 Game Optimization[capture2]:Scripting Strategies
1.使用更快的速度获得Component
2021-08-04 15:03:16
296
1
原创 STL源码剖析:【4】Sequence Containers-List
List特性概述: 1.对于任意位置的插入或者删除,List常数时间 2.类比Vector,内存不再连续,通过指针进行连接List数据结构: list的数据本身与list的节点是不同的结构,需要分开设计 以下是Stl list的节点结构: 以下是迭代器iterator的数据结构: 以下是List的数据结构: ...
2021-08-02 11:04:40
93
原创 Ue4 RenderPipline:渲染流程
1.初始化视口阶段:主要进行可见性剔除;剔除过程分三步:1)预设值可见性 2)可见性计算 3)完成可见性计算2.PrePass预处理阶段:主要是为了降低BasePass的渲染工作量;通过渲染一次深度信息,如果某个像素点的深度检测失败,即不符合当前深度值,那么将不会进行工作量最大的像素渲染器计算。(个人认为其实就是early-z) 进行PrePass:有两个限制:1)不是基于分块的GPU,即Tiled-GPU , 例如很多ARM移动平台就是 2)渲染器的EarlyzPassMod...
2021-07-29 11:09:48
420
原创 Ue4 RenderPipline:渲染基本概念
11.1 渲染线程虚幻中的渲染系统,使用单独的线程去工作:即渲染线程 其中Slate系统本身也借助虚幻引擎RHI渲染11.1.1 渲染线程的启动11.1.2 渲染线程与游戏线程与RHI线程
2021-07-28 11:33:26
269
原创 Lua设计与实现:Table
Table的数据结构: Table查找操作分析: 首先是Lua查找,如果Key是Int数值,将会在数组中进行查找,如果没有找到则到Hash表中去进行查找;其他情况直接根据Key的散列值到Hash表中进行查找 Table插入操作分析: 如果数值Key大于数组容量大小,则到Hash表中进行插入 , 否则在数组中插入; 如果非数值Key则到...
2021-07-27 17:53:45
308
原创 [游戏引擎架构]第三部分:动画系统(4)动画
元通道 许多游戏容许在动画中加入额外的“元通道”数据,这些通道可以把游戏专用的信息编码,能够同时和动画同步,而又无须把这些信息以骨骼姿势存储 较常见的一种特殊通道是在多个时间点上存储事件触发器(Event Triggle);当动画的局部时间索引经过这些触发器时,触发器的事件便会交由游戏引擎进行处理。...
2021-07-22 17:45:51
280
2
原创 Ue4 Slate 渲染以及Merge流程
1.DrawIndow//绘制2.DrawWindowAndChildren3.Paint //唯一函数swidget4.OnPaint // 虚函数,多槽点的将孩子加入到DrawElement中5.DrawWindow //渲染6.AddElement //将DrawElement包装成RenderBatchElement7.DrawWindow_RenderThread //通过渲染线程进行渲染8.1 BuildRenderBuff------>MergeBat...
2021-07-22 11:54:21
651
原创 Ue4 GC
GC入口://CarbageCollection.cpp 2144void CollectGarbage(EObjectFlags KeepFlags, bool bPerformFullPurge){ // No other thread may be performing UObject operations while we're running AcquireGCLock(); // Perform actual garbage collection CollectGarbag.
2021-07-21 13:55:32
354
原创 Ue4 反射系统
原文:InsideUe4总结 :类型系统 强调的是程序运行期间内建立起来的类型信息树组织反射则强调运行时通过类型系统提供的信息创建对象,读取对象属性以及方法的一种能力为什么要是用反射 1.通过反射能够更通用的调用类对象函数,而不需要判断对象类型(例如Unity通过反射调用Updat、FixUpdate) 2.为数据序列化提供支持 TODOC++中提供基础的RTTI主要通过typeid以及dynamic_cast typeid:这...
2021-07-20 15:47:39
687
原创 Unity UGUI合批流程
UGUI基本渲染流程1.以Canvas为单位进行渲染组2.渲染顺序以hierarchy中UI元素由上往下进行渲染 ,下面的会遮挡上面的简单遮挡效果遮挡效果由上即下合批处理合批处理不会影响显示效,仅仅会打包相同材质以及Texture(即相同渲染状态)的UI元素,从而减少DrawCall1.正常合批状态根据TextureId 以及Material Id导致顺序发生变化一个DrawMesh Draw出三个UI元素二、出现UI元素交叉(重叠)(Bonds非Rec...
2021-07-15 18:35:25
1129
原创 UE开发日志20210706
1.完成简单的状态机 + BlendSpace 实现转向前进2.完成Run/Crouch Blend Slot播放3.完成简单的天气系统4.完成简单的草地交互5.完成Npc
2021-07-06 11:49:46
138
原创 Unity Shader入门精要-渲染优化技术
造成性能瓶颈的原因主要以下几个方面:(1)CPU过多的DrawCall复杂的脚本逻辑或者物理模拟(2)GPU顶点处理:过多的顶点、过多的逐顶点计算片元处理:过多的片元(过高的分辨率,或者由于OverDraw造成)、过多的逐片元处理(3)带宽使用了尺寸很大且未压缩的纹理分辨率过高的帧缓存解决以上问题的途径:(1)针对 减少DrawCall处理:i:动态批处理-每一帧把可以进行批处理的模型网格(使用同一个材质)进行合并,再把合并后的模型数据传递给GPU。优
2021-07-05 21:08:09
175
1
原创 标准光照模型
标准的光照模型只关心直接光照(direct light)将光照部分分为四个:自发光、高光反射、漫反射、环境光一、环境光 Cambient = Gambient二、自发光 Cemissive = Memissive三、漫反射 漫反射是完全随机的,因此视角的方向不是重要的,但是入射光线的角度很重要。 定律:兰伯特定律(Lambert's Law) Cdiffuse = (Clight * Mdiffuse)max(0...
2021-07-05 16:27:38
334
原创 Font
1.点阵字体 : 以一组16x16或者25x25的二维像素信息表示2.矢量字体:每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连接的导数等信息。字体的渲染引擎进行一定的数学运算来进行渲染;这类字体的优点是:字体实际尺寸可以任意缩放而不变形变色。...
2021-04-28 14:27:42
140
原创 Unity的阴影
在实时渲染中,采用ShadowMap来进行阴影的渲染在前向渲染中,如果平行光开启了阴影,Unity就会为光源计算它的阴影映射纹理(shadowmap),ShadowMap本质上也是一张深度图(以光源为相机原点)因为在BasePass(一个平行光的逐像素光照计算 + 全部的顶点级光照计算+全部的SH光照计算) + AdditionalPass(可多次调用的其他光源的逐像素光照)中往往涉及很多复杂的光照模型计算,而我们需要的仅仅是深度信息因此在UnityShader中使用一个额外的Pass来专门更新
2021-04-22 14:22:50
566
原创 什么是游戏内全局光照
什么是全局光照: 全局光照,指的就是模拟光线是如何在场景中进行传播的,不仅会考虑那些直接光照的效果,还会计算光线被不同的物体表面反射而产生的间接光照。 Unity使用实时+预计算的方式来模拟场景中的光照:其中实时光照用于那些直接光照对场景的影响,物体移动式光照也会随之发生变化;因为实时光照无法模拟光线被多次反射(间接光照)的效果,因此采用预计算来模拟反射等间接光照。 其中预计算包括常见的光照烘焙:将光源对场景中的静态物体的光照效果提前烘焙到一张光照纹理当中,然后把这...
2021-04-15 14:27:41
1670
原创 UnityShader-13.3全局雾效
基本Shader制作雾效 1.在Shader中添加 #pragma multi_compile_fog 以及 内置宏 UNITY_FOG_COORDS、UNITY_TRANSFER_FOG、UNITY_APPLY_FOG实现,可移植性不高,需要在场景中所有物体添加相关渲染代码基于屏幕后处理制作雾效 1.方法1:在FragShader中,获取采样 SAMPLE_DEPTH_TEXTURE纹理(_CameraDepthTexture由Unity传递给我们的深度纹理)的深度值dep...
2021-04-14 20:38:13
341
原创 auto_ptr与unique_ptr与shared_ptr对比
来源C++PrimerPlus 第16章包含于头文件memory中auto_ptr 从C++98开始,C++11已经摒弃。声明格式:auto_ptr<double> pd(new double) ; 原理:将指针包装成一个对象,由对象的生命周期来自动释放指针问题:auto_ptr<double> pd(new double) ;auto_ptr<double> pd2 = pd; 存在多次引用指针同一个指针时,造成delete同一个指针多次 为了解...
2021-04-07 17:20:58
183
原创 C++ Primer Plus_6th第九章内存模型和名称空间
9.1单独编译1."coordin.h"与<coordin.h>的区别:后者1仅在存储标准头文件的主机系统的文件系统中进行查找,而前者首先查找当前的工作目录或者是源代码目录,如果没有找到,然后再进行方式1中的搜寻...
2021-03-27 17:34:19
204
原创 [Lua设计与实现]2:字符串
内化概念:内化字符串,实际上每个字符串变量存放的并不是一份字符串的数据副本,而是对这份字符串的引用。Lua中字符串是被内化掉的。这就导致了两个问题:字符串是以什么方式进行存储的? 这份字符串是否已经被存储?第一个问题: Lua中 lua_State->strt 作为一个全局表来(数据格式是散列桶)进行存储字符串,内部有LuaS_resize来进行重新散列(翻倍扩容或者进行缩减),防止数据过多导致的线性查找问题第二个问题: 在lstring.c 中 LuaS_newlstr...
2020-08-18 14:19:24
209
原创 【C++Primer Plus 6th】C++11新特性
C++11数据类型特性1.新增加了类型 longlong 与unsigned long long 以支持对64 Int 类型的支持;新增加了char16_t与char32_t来支持char类型的16位与32位的字符表示 ; 新增加了auto关键字,让编译器根据初始值的类型推断变量的类型2.右值引用 传统的左值是一个表示数据的表达式(如变量名以及指针等),左值可以放于赋值表达式的左边; 右值仅仅是一块数据(返回值,表达式结果值),右值一般可以放到赋值表达式的右边 右值...
2020-08-11 20:39:43
272
原创 [游戏引擎架构]第三部分:动画系统(5)蒙皮及生成矩阵调色板
11-5蒙皮及生成矩阵调色板 求蒙皮矩阵的诀窍: 了解在变换的过程中:顶点Mesh在关节空间的相对位置是不变的(对应于父与子关系);因此,将在绑定姿势(初始状态)下,将顶点从模型空间变换到绑定关节空间(仅讨论单关节条件)下,然后将绑定关节变换到当前姿势(此时作为父子关系的顶点自动完成变换),再将顶点还原到模型空间下即可。...
2020-08-10 12:00:53
405
原创 [游戏引擎架构]第三部分:动画系统(2)姿势Pose
11.3 姿势 Pose:组成动画的基本单位;动画以时间为播放依据,将30或60个姿势(帧)每秒的速率显示这些姿势,就能令角色看上去产生动感 绑定姿势: 即T-Pose;网格正常,没有蒙皮的(完全不涉及三角形网格渲染的姿势)姿势 ,又称参考姿势 局部姿势:描述相对于父的姿势 全局姿势:描述模型空间或者时间空间的关节姿势称为全局姿势...
2020-08-08 21:16:06
346
原创 [游戏引擎架构]第三部分:动画系统(1)
11.1角色动画的种类 1)Cel Animation(赛璐璐动画):始于2D游戏兴起,电子版成为精灵动画 2)刚性层阶式动画(rigid hierarchical animation): 层级骨骼系统的雏形,角色由一堆刚性部件建模组成-比如分拆成骨盘、躯干、上臂、下臂、大腿、小腿及头部 ,它们以层级形式相互约束,这种直接以关节进行动画,容易出现裂缝。毕竟单位太大了,以关节为基本单位3)蒙皮动画:在蒙皮动画中,骨骼由刚性的关节所构建而成(这点类似于2));但是关节不再作为动画的最基本单位,...
2020-08-08 21:03:53
644
原创 [游戏引擎架构]第三部分:渲染引擎(3)
10-3:高级光照与全局光照阴影渲染部分:两个最流行的阴影渲染技巧为阴影体积和阴影贴图阴影体积 : 1)从产生阴影光源的位置观察每个投射阴影的的物体,在那个视角判断物体的轮廓边缘,这些边缘延光线方向伸出,产生一个立体几何,这个空间立体几何即是阴影体积。2) 然后从相机方向观察阴影体积,核心流程是根据像素处对应片段所属三角形的朝向,正则在模板缓冲像素点处+1,否则-1,这样可以抵消两面都存在的位置,只有一面的情况即模板缓冲中该像素点为+13)将像素点为+1的位置进行涂抹阴影阴影贴图:两步走。.
2020-08-08 16:15:08
275
原创 [游戏引擎架构]第三部分:渲染引擎(1)
10-1:采用深度缓冲的三角形光栅化基础 笔记:深度冲突以及W缓存一文中:因为裁剪空间的深度为pHz = 1/pVz, 所以在会产生精度上的问题,造成画面上的穿插 在Shader中,一般传入PixelShader的是齐次裁剪空间的坐标而不是除以w后的归一化坐标,所以猜测是否因为这个原因。 通过比较准确的z坐标,来进行深度的辅助检测,从而避免深度冲突的问题...
2020-08-07 22:06:27
443
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人