自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 收藏
  • 关注

原创 GAMES101 P11 几何2

1 几何的显示表示 1.1Point Cloud(点云)1.2Polygon Mesh(多边形网格) 在图形学中应用最广泛的显示表示。2 Curve(曲线) 2.1 Bezeir Curve 求贝塞尔曲线上的任意一个点: 贝塞尔曲线公式: 贝塞尔曲线的性质: 1.必须过起点和终点 2.起点和终点的切线: ...

2021-11-21 17:36:28 462

原创 GAMES101 P10 几何1 笔记

1 Application Texture 纹理可以理解成一块数据,可以做不同类型的查询,所以它的应用有很多: 1.环境光/环境贴图: 用纹理描述环境长什么样,然后用环境光去渲染其他的物体: 把环境光记录在球面上: 把球面纹理展开,会发现在顶部有扭曲: 所以为了解决扭曲的办法,有了CubeMap: 把正方形展开:2.凹凸贴图(法线贴图) ...

2021-11-15 21:26:19 3000

原创 GAMES101 P9 着色3(纹理映射) 笔记

1 Barycentric Coordinates(重心坐标) 为了做三角形内的插值,需要引入一个概念:重心坐标。 为什么要在三角形内做插值? 因为很多时候我们知道三角形顶点上的值,希望在三角形内部做平滑的过渡。 想要插值得到什么? 贴图坐标,颜色,法线... 所以,想要做插值就引入了重心坐标。 在三个点A、B、C的组成平面内的任意一点(x,y),都遵守上图中的式子。而如果想再...

2021-11-10 17:28:32 391

原创 GAMES101 P8 着色2(着色,管线和纹理映射) 笔记

1

2021-11-07 18:50:57 604

原创 Astar算法

1.什么是Astar算法?Astar算法是一种图形搜索算法,常用于寻路。它是个以广度优先搜索为基础,集Dijkstra算法与最佳优先(best fit)算法特点于一身的一种算法。它通过下面这个函数来计算每个节点的优先级,然后选择优先级最高的节点作为下一个待遍历的节点。优先级函数:其中:1.g(n) 是节点n距离起点的代价。2.h(n)是节点距离终点的预计代价,也就是A*算法的启发函数。A*算法伪代码如下://使用open_set、close_set来表示待遍

2021-11-02 14:47:22 8547 1

原创 GAMES101 P7 深度缓冲、着色1(照明、阴影和渲染管线) 笔记

Visibility/Occlusion画家算法,先把远处的东西画完再把近处的东西覆盖上去: 而画家算法对于两两互相遮挡的情况,无法定义深度关系,就变得无法使用: 故引入深度缓冲Z-Buffer,在生成最终渲染结果的同时生成一张深度图: Z-Buffer例子: Z-Buffer算法: Z-Buffer算法跟处理顺序没有关系。Shading 说着色之...

2021-10-31 17:29:43 316

原创 GAMES101 P6 光栅化2 反走样 笔记+作业2

采样中会出现的一些问题,叫做Artifacts(瑕疵): 在采样之前做一遍模糊(滤波)来抗锯齿: 先做滤波后的效果: 问题: 1.为什么采样速度跟不上信号变化的速度会产生走样? 2.为什么先滤波再采样可以反走样? 为了弄清楚问题,讲了一系列频域(Frequency Domain)方面的知识,通过原理解释了这两个问题。 (具体没听太懂)总而言之,采样在...

2021-10-30 18:39:40 181

原创 GAMES101 P5 光栅化 笔记

1

2021-10-29 18:14:58 119

原创 GAMES101 P4 三维变换、观测变换 笔记+作业1

上节课内容补充: 旋转theta角和-theta角可以证明旋转矩阵的逆矩阵等于它的转置矩阵,这种矩阵称为正交矩阵。1 3D Transformations 三维缩放、平移矩阵: 三维旋转矩阵: 任意一个三维的旋转都可以拆解成绕X、Y、Z三个轴旋转的组合:2 Viewing(观测)Transformation 观测变换,在国内一般分为两步:View(视图) Trans...

2021-10-27 21:23:53 230

原创 GAMES101 P3 二维变换 笔记+作业0

一、为什么要变换二、2D变换:rotation、scale、shear

2021-10-26 20:47:33 98

原创 资源框架XAsset阅后总结

上个月花时间把XAsset这套资源框架的代码看了一遍且写了一遍。XAsset官网:https://xasset.github.io/#/compare-plans。我看的是它的7.0体验版本,所以功能上并不完整,不过尽管如此还是学到了很多的东西。 XAsset框架的代码量很少,架构很清晰,我认为作为一个学习的目的来看这个框架是非常不错的选择(老实说在这之前我去看Addressable的代码,是没能看下去),它也让我对这一部分知识的理解有了提升,并且在此基础上我回头再次看了一遍项...

2021-09-16 20:46:23 2065

原创 LuaProfiler

Unity自带的Profiler能对C#的Cpu和内存使用状况进行比较好的分析,但是无法涵盖lua部分,而LuaProfiler就是一个很好的工具,能够对内存消耗情况和lua和mono的GC进行很好的监测。github地址: https://github.com/ElPsyCongree导入工程后可以通过菜单Windows/LuaProfilerWindow打开LuaProfiler性能分析窗口。顶部菜单栏开启DeepLua运行游戏便可看到Lua代码的...

2021-08-05 10:56:48 1439

原创 XLua源码学习:Lua中调用CS

在使用lua代码开发的过程中,一个非常重要的部分是对C#代码的调用,接下来就结合源码分析理解它的实现:在lua中,使用诸如以下代码便可以调用C#的代码:CS.UnityEngine.Debug.Log('hello world')CS是一个全局的Table,所以CS.UnityEngine可以当做是在一个名为CS的Table中查询名为UnityEngine的值。在调动虚拟机也就是LuaEnv的创建时,会调用以下代码对CS表进行初始化:D...

2021-08-05 10:51:35 2324 2

原创 Lua GC机制浅析

lua的GC采用的是Mark&Sweep算法。根据之前的介绍可知,Mark&Sweep算法它是一种需要Stop the world的算法,其GC操作是不可打断的,那下面首先来分析一下为何会不可打断并且在lua中是如何解决这个问题的:把不可达对象看做白色,可达对象看做黑色,那Mark&Sweep算法的伪代码如下:每个新创建的对象的颜色为白色//初始化阶段遍历root链表中的对象,并将其加入到对象链表中//标记阶段当对象链表中还有未扫描...

2021-08-05 10:23:19 1222

原创 详解GC(二)实战篇

目录2.1 字符串拼接2.2 可变参数2.3 装箱2.4 常用容器及增长方式2.4.1 List、Stack、Queue:2.4.2 Hashset、Dictionary:2.4.3 LinkedList:2.4.4 容器操作产生的装箱2.5 匿名方法2.6 UnityAPI2.7 UGUI2.8 协程2.9 对象池2.1 字符串拼接C#的string是一旦生成就不可变的,.每次拼接或修改字符串都会生成一个新字符串,旧的字符串就...

2021-07-30 18:02:42 471

原创 详解GC(一)理论篇

一、理论篇GC全称Garbage Collection,垃圾收集,是一种自动管理堆内存的机制,负责管理堆内存上对象的释放。在没有GC时,需要开发者手动管理内存,想要保证完全正确的管理内存需要开发者花费相当大的精力。所以为了让程序员把更多的精力集中在实际问题上,GC诞生了。而GC世界里的对象,与我们常规理解的对象不同,它由头和域组成:简单的理解,GC将原本对象使用的内存空间包装成了域,又添加了一块头的区域用来存储对象本身的信息和GC所需要的信息,不同的GC算法它使用的信息也不同。一般来说,头中

2021-06-02 11:40:22 1921

转载 结构体对齐规则

先介绍三个概念:自身对齐值、指定对齐值、有效对齐值。自身对齐值:数据类型本身的对齐值,例如char类型的自身对齐值是1,short类型是2;指定对齐值:编译器或程序员指定的对齐值,32位单片机的指定对齐值默认是4;有效对齐值:自身对齐值和指定对齐值中较小的那个。对齐有两个规则:1、不但结构体的成员有有效对齐值,结构体本身也有对齐值,这主要是考虑结构体的数组,对于结构体或者类,要将其补齐为其有效对齐值的整数倍。结构体的有效对齐值是其最大数据成员的自身对齐值;2、存放成员的起始地址.

2021-04-25 17:31:01 1014

原创 关于UGUI的网格重建与动态分离

关于描述网格重建看了很多,几篇不错的文章: https://blog.csdn.net/PS_show/article/details/100525280 https://zhuanlan.zhihu.com/p/128546981 https://zhuanlan.zhihu.com/p/24160619大概总结一下(个人理解): 首先UGUI进行网格重建的单位是Canvas。 一个Canvas下的元素发生布局变化、顶点变化、材质变化时(具体是哪...

2021-03-24 20:55:52 199

原创 Shader入门精要之Unity中的渲染优化技术

影响性能的因素分3块1.CPU(1)过多的DrawCall(2)复杂的脚本或者物理模拟2.GPU(1)顶点处理->过多的顶点->过多的逐顶点计算(2)片元处理->过多的片元->过多的逐片元处理3.带宽(1)使用了尺寸很大且未压缩的纹理(2)分辨率过高的帧缓存一、减少DrawCall数使用的技术:批处理 (在playerSetting中有相应的开关)公共条件:使用同一个材质注意:1.批处理需要把多个模型变换到.

2021-03-06 11:55:40 260

原创 AVProVideo PC无法播放的问题

如图,只见进度条在走,视频没有播放,但是我测试在手机是可以播放的。后来查了API文档,找到这个:原来是因为API不支持PC端的OPENGLES3.0。那我们在PlayerSetting里把API改成DX11就可以了。

2020-09-29 15:56:58 3118

原创 UnityShader入门精要4.6.2坐标空间变换矩阵

今天看了UnityShader入门精要里4.6.2节讲解的坐标空间变化矩阵的时候,发现逻辑挺绕,故此记录加深印象与理解。首先Mc->p变换矩阵:"|"表示是按列展开的,Xc,Yc,Zc,Oc 分别代表坐标空间C的XYZ轴和原点在P坐标空间的表示。这个就不多说了,书上推导过程非常清晰。这里面绕的是一些性质和反推:1.首先如果你得知了坐标空间C的XYZ轴及原点在坐标空间P的表示,那么这个Mc->p的转换矩阵直接就出来了,那么反过来,如果你有了这个矩阵,你也可以知道坐标空间C的XYZ轴

2020-09-26 18:28:55 310

原创 UML五种常见类关系

UML类图中有五种常见的类关系:1.泛化2.依赖 3.关联 4.聚合 5.组合1.泛化泛化就是继承,继承就很熟悉了,一般两个类之间硬要使用继承关系的话,一定要保证 A is B,翻译过来也就是子是父。举个例子牙刷、牙缸是洗漱用具,那么牙刷牙缸的类就可以继承洗漱用具类。如果不满足于这种关系,最好使用聚合的方式。2.依赖依赖代表的是一种弱耦合关系,常见的比如方法内的局部变量,方法的参数等等临时使用的这种关系。3.关联关联代表一种强引用关系,是长久的稳定的关系,两者的关系是平等的。常见的.

2020-09-10 16:47:32 1151

转载 UGUI 优化总结

转自:http://www.jianshu.com/p/061e67308e5fUnity GUI(uGUI)使用心得与性能总结背景和目的小哈接触Unity3D也有一段时间了,项目组在UI解决方案的选型一直是用的原生的uGUI,因此本人也是使用了一段时间的uGUI,在uGUI的使用方面积累了一些自己的经验,在此进行一个记录与总结。本文接下来将会对uGUI的Runtime性能进行着重讨论,其它的因素也很多而且很重要,但是一篇文章讲清楚一件事就好了,文后会提供uGUI的最佳实践与一些使用技巧,.

2020-08-31 21:13:19 287

原创 分治法、动态规划、贪心算法区别

1.分治法字面意思就是分而治之,将原问题分解为多个子问题,然后其规模若还没有小到可以直接解决,则再次分解。最后将子问题的解合并成为原问题的解。特征:1.子问题小到一定规模就可以直接解决2.子问题之间是相互独立的,即子问题之间不包含公共子问题3.原问题可以分解为规模较小的相同问题,即具有最优子结构性质4.子问题的解合并可成为原问题的解第2条影响着分治法的效率,若子问题之间包含公共子问题,那么将重复很多计算,这时候使用动态规划会比较好。分治法求解的经典案例有:快速排序,归并排序,二分

2020-07-19 12:28:18 1209

转载 哈夫曼编码

哈夫曼树的应用很广,哈夫曼编码就是其在电讯通信中的应用之一。广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。在电讯通信业务中,通常用二进制编码来表示字母或其他字符,并用这样的编码来表示字符序列。例:如果需传送的电文为 ‘ABACCDA’,它只用到四种字符,用两位二进制编码便可分辨。假设 A, B, C, D 的编码分别为 00, 01,10, 11,则上述电文便为 ‘00010010101100’(共 14 位),译码员按两位进行分组译码,便可恢复原来的电文。能否使编.

2020-07-19 11:10:32 12511

原创 Lua 负数取余的问题

关于编译器对负数取余的问题是一个很有意思的问题:假如对 -21% 5 ,则会有两种算法:1. -21% 5 = 5 *(-4) - 1 = -12. -21 % 5 = 5 *(-5) + 4 = 4常理来说,两种算法都对,那么编译器究竟是怎么算的呢。这里在lua语言中有一个规律,那就是看后面的数字,比如对5取余,5是正数,那么得到的结果也会是整数;如果对-5取余,得到的结果就会是一个负数,那这时候编译器的算法就是:-21 % (-5)= (-5) * 4 - 1 = -1...

2020-07-17 17:40:54 1286

原创 哈夫曼树(HuffmanTree)

1.基本概念首先给出定义哈夫曼树所要用到的几个基本概念:(1)路径(Path):从树中的一个结点到另一个结点之间的分支构成这两个结点间的路径。(2)路径长度(Path Length):路径上的分支数。(3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。(4)结点的权(Weight of Node):在一些应用中,赋予树中结点的一个有实际意义的数。(5)结点的带权路径长度(Weight

2020-07-15 21:29:36 877

原创 动态规划

动态规划思想动态规划的基本思想是把问题拆分成一个个相互联系的子问题,先求解子问题,最后将子问题合并形成最终的求解。其实质上是通过开辟记录表,记录已求解过的结果,当再次需要求解的时候,可以直接到那个记录表中去查找,从而避免重复计算子问题来达到降低时间复杂度的效果。实际上是一个空间换时间的算法。动态规划,通常可以把指数级的复杂度降低到多项式级别。动态规划的两个重要性质:1.子问题重叠性质:解决冗余,它对于重复出现的子问题,会在第一次求解后使用一个表储存下来,供之后使用,本质上也是一个空间换时间的思想

2020-07-15 11:21:10 757 1

原创 Dijkstra算法

Dijkstra 算法找到了从任意指定顶点到任何其他顶点的最短路径,而且证实可以到达图中的所有其他顶点。它使用了通常被称为贪心的策略或算法。贪心算法把问题分解成小块或步骤,并且在每一步中确定最优解,用这些最优解合并生成最终的解。Dijkstra 算法的思想就是首先把起点到所有点的距离存下来找个最短的,之后把这个距离最短的点作为中转站再来遍历一遍更新所有点的距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。

2020-07-13 18:35:47 136

转载 求最小生成树的两种算法(Kruskal算法和Prim算法)

关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。 生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条

2020-07-13 16:19:57 315

原创 图的搜索---深度优先搜索和广度优先搜索

确定从一个顶点能到达哪些顶点是在图上经常执行的一种操作。人们可能需要知道在地图上哪些路可以从一个 城镇到达其他城镇,或者从一个机场到其他机场可以走哪条航线。 在图上执行这些操作都用到了查找算法。图上可以执行两种基础查找:深度优先(depth-first)搜索和广度优先 (breadth-first)搜索。本小节会研究这两种算法

2020-07-12 16:18:48 502

转载 邻接矩阵和邻接表

图的存储结构主要分两种,一种是邻接矩阵,一种是邻接表。1.邻接矩阵邻接矩阵的存储方式是用两个数组来表示图。一个一维数组储存图中顶点信息,一个二维数组储存图中的边或弧的信息。无向图这里右图是把顶点作为矩阵内行和列的标头罗列出来。如果在两个顶点之间存在一条边,那么就把 1 放在这个位置上。如果边不存在,那么就赋值为 0。从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是n阶矩阵的元满足aij = aji。即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都

2020-07-05 19:30:41 13248 1

原创 跳跃表(C#代码)

AVL 树和红黑树在数据搜索和排序方面都是有效的数据结构,但是这两种数据结构都需要重新平衡操作来保持树的平衡,这就导致大量费用和复杂性。还有另外一种数据结构可以使用,它特别适用于查找。这种数据结构提供了树的功效且不需要担心重新平衡问题。这种数据结构叫做跳跃表。跳跃表提供了一种基于树结构的可替换选择。大多数程序员发现它们更容易实现且效率和类树结构相当。如果在处理一个完全或几乎有序的数据集合,那么跳跃表可能是比树更好的一种选择。跳跃表的原理推荐一篇文章:https://blog.csdn.net/qp

2020-06-30 17:42:47 611

原创 图文详解红黑树及代码实现

1红黑树介绍AVL 树并不是处理不平衡二叉搜索树的唯一方法。另一种可以用到的数据结构就是红黑树。红黑树根据一系列规则把树上的节点指定为红色或者黑色。通过对树中节点适当的染色,就可以使得树处于近乎完美地平衡。一个红黑树实例如下:1.1红黑树特点1)树中的每个节点标记成不是红色就是黑色。 2)把根节点标记为黑色。...

2020-06-27 01:39:49 486

原创 图文详解AVL树

AVL树(平衡二叉树)详解

2020-06-25 22:52:36 673

转载 二叉树的高度和深度的区别

高度和深度是相反的表示,深度是从上到下数的,而高度是从下往上数。我们先来看看高度和深度的定义,某节点的深度是指从根节点到该节点的最长简单路径边的条数,而高度是指从该节点到叶子节点的最长简单路径边的条数。注意:这里边的条数是规定根节点的深度和叶子节点的高度是0;所以树的深度和高度是相等的,而对其他节点来说深度和高度不一定相等。如 B和C节点深度都为1,因为从根节点到到该节点的边数为1,B的高度为2,而C的高度为1。当然树的深度是3高度也是3。树的高度和深度是相等的。原文:https

2020-06-25 18:30:24 2990

原创 详解二叉搜索树(BinarySearchTree)

I 二叉搜索树特点每个结点有唯一的值,且每个结点的值均不相同; 若它的左子树不为空,则它的左子树的所有结点均小于根节点的值; 若它的右子树不为空,则它的右子树的所有结点均大于根结点的值; 它的左右子树均为二叉搜索树。II 二叉搜索树的操作二叉查找树由节点组成,所以需要一个 Node 类public class Node{ public int Data; public Node left; public Node right; public void.

2020-06-24 17:51:15 869 1

原创 四个高级排序算法

一、希尔排序希尔排序是插入排序算法的一个改进,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲。希尔排序是通过自定义控制增量来将一组数据分成若干组,对每个组内元素先进行插入排序,然后再控制增量变小使每个组内的元素越来越多,当增量减小至1时,算法终止,排序就完成了。比如[5,4,3,2,1]如果直接用插入排序,外层循环会从4开始以增量1一步步扩大有序序列。而使用希尔排序,我们可以控制增量gap = arr.length/2 = 5/2 = 2 . 那么 最终会将此数据分

2020-06-23 21:23:01 501

原创 完美二叉树、满二叉树、完全二叉树

一、完美二叉树一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树。二、满二叉树如果一棵二叉树只有度为 0 的结点和度为 2的结点,则这棵二叉树为满二叉树。三、完全二叉树三者对比完美(Perfect)二叉树一定是完全(Complete)二叉树,但完全(Complete)二叉树不一定是完美(Perfect)二叉树。 完美(Perfect)二叉树一定是满(Full)二叉树,但满(Full)二叉树不一定是完美(Perfect)二叉树..

2020-06-23 17:05:26 1814

原创 三大基础排序算法

最容易理解和实现的基础排序算法

2020-05-28 22:41:13 246

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除