- 博客(71)
- 资源 (11)
- 收藏
- 关注
原创 Unity优化之Drawcall
一、什么是Drawcalls在Unity中,每次CPU准备数据并通知GPU的过程就称之为一个DrawCall。这个过程会指定一个Mesh被渲染,绘制材质。二、Drawcalls有什么影响为了CPU和GPU可以进行并行工作,需要一个命令缓冲区,由CPU向其中添加命令,然后由GPU从中读取命令,这样就实现了通过CPU准备数据,通知GPU进行渲染。在每次调用DrawCall之前,CPU需要向GPU发送很多内容,主要是包括数据,渲染状态,命令等。所以如果DrawCall数量过多就会导致CPU进行大
2022-09-20 22:48:19 7397
原创 彻底搞懂递归的时间复杂度
笔者编码10载,面过很多程序员简历上写着熟悉数据结构和算法,但是对于时间复杂度稍微深入点的问题,都回答的不怎么样,其实还是没懂搞懂算法时间复杂度是一个优先程序员的分水岭先来看letcode一道题,泰波那契序列 Tn 定义如下:T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。示例 1:输入:n = 4输出:4解释:T_3 = 0 + 1 + 1 = 2.
2021-09-15 00:25:58 12787 10
原创 C#委托事件的区别
在C#中,委托(delegate)和事件(event:委托是一个引用类型,它可以引用一个或多个具有特定签名的方法。简单地说,你可以将其视为一个类型安全的函数指针。:事件基于委托来实现,但它添加了一层封装,使得对象的其他部分不能直接调用或修改事件,除非是那些声明了这个事件的类。事件通常用于在类之间通信,一个类可以发布一个事件,而其他类可以订阅这个事件。
2023-08-14 13:39:04 684
原创 一图了解前向渲染与延迟渲染
延迟渲染 (Deferred Rendering) 的主要特点是它首先将场景的几何信息和材料属性渲染到几个不同的纹理(称为G-buffer)中,然后在一个单独的步骤中计算最终的光照。这意味着他们可能会首先使用延迟渲染处理不透明的物体,然后使用前向渲染来处理半透明物体。这种方法结合了两种渲染技术的优势,允许场景中的不透明和半透明物体都被正确和高效地渲染。在延迟渲染的第一阶段(几何/材质阶段)中,我们并不真正计算最终的像素颜色,所以这一步无法处理混合。:G-buffer中的深度值通常仅存储最前面的表面深度。
2023-08-11 12:46:48 382
原创 说说我理解的ECS
总体来说我觉得ecs最大的优势是带来,内存的有序分配,不会形成很多零碎的内存碎片,性能是一个比较重要的指标,还有就是可扩展性,需要用到哪个组件就去加载哪个组件,而不是之前的面向对象的继承,但是这个其实没啥,面向对象也能做到目前,最大的优势还是性能的提高。通过将游戏对象分解为实体和组件,以及使用系统来处理这些组件,可以更好地管理游戏的复杂性,并实现高性能的游戏系统。3. **可维护性:** 由于组件和系统是独立的,不同的开发人员可以专注于不同的部分,使得代码更易于维护。好了,我们下面来说说ECS的优缺点。
2023-07-21 11:39:30 259
原创 C++ 几种类型转换
d. 动态转换(dynamic_cast): 动态转换通常用于在继承体系中进行向上或向下的类型转换。c. 重新解释转换(reinterpret_cast): 重新解释转换用于不同类型之间的位模式转换,如将指针转换为整数类型或反之。b. 常量转换(const_cast): 常量转换用于去除常量性(const)或添加常量性(const)。a. 静态转换(static_cast): 静态转换通常用于较为直接的类型转换,如数值类型之间的转换。在C++中,有几种类型转换方法,允许您在不同类型之间进行转换。
2023-07-20 23:22:56 292
原创 Unity基础-Vector3.Lerp的使用给一个简单的实例
当按下space键的时候,正方形从开始点到结束点平滑移动,lerp函数不断生成中间经过的点。
2023-06-28 12:08:01 442
原创 《软件架构之道》c#实现依赖反转
接口定义了模块的行为,而不是实现细节,这样高层模块就可以依赖接口,而不是依赖具体的实现。依赖注入是一种将依赖关系从代码中移除的技术,它允许组件在运行时通过构造函数或属性来接收依赖项,而不是在组件内部创建它们。在上面的代码中,我们使用依赖反转原则,将 Document 类从具体的 Printer 类解耦,使得我们可以在运行时动态地替换打印机实现,从而使代码更加灵活和可扩展。通过应用依赖反转原则,可以提高代码的可维护性和可测试性,因为它使得代码更容易进行修改和扩展,而不需要修改其他部分的代码。
2023-05-10 16:34:20 123 1
原创 《深度工作》一书摘抄
转换任务之后处于注意力残留状态 的人,在下一项任务中的表现通常很差而且残留量越大,表现越糟糕。进入深度工作最好的状态就是断网,远离一切网络相关,手机仍到一个你够不着的地方的。书籍资料可以随意拿到,但是做事的经验和思考这种是宝贵的,经验拿不到的。他不是工薪族,他没有赚钱的顾虑;无限的,从而极大提升你所获的奖励。中矩,你就会陷入困难,因为你的受众很容易在网上找到更好的替代品。,你的处境都和想要超越弗洛伊德的荣格一样,又或是与想要在创业新。,促使公司将关键岗位外包给行业中的翘楚,本地人才的失业率便会极。
2023-05-10 03:00:43 505
原创 《软件设计的哲学》第三章 工作代码是不够的
Facebook 作为一家公司已经取得了令人瞩目的成功,但是由于该公司的战术方法,其代码库受到了影响。随着时间的流逝,该公司意识到其文化是不可持续的。最终,Facebook 改变了座右铭,即“以坚实的基础架构快速移动”,以鼓励其工程师在良好的设计上进行更多的投资。要考虑的另一件事是,公司成功的最重要因素之一就是工程师的素质。降低开发成本的最佳方法是聘请优秀的工程师:他们的成本不会比普通工程师高很多,但生产率却高得多。好的设计不是免费的。幸运的是,好的设计最终会收回成本,而且比您想象的要早。
2023-04-29 16:31:44 67
原创 从C++角度讲解C#Out和ref的区别
out:out参数类似于ref参数,但有一个重要的区别,即在调用方法之前不需要为out参数初始化变量。这意味着当您将参数传递给一个使用ref参数的方法时,方法可以修改原始变量的值。,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,在C++中,没有像C#中那样的out参数,但可以通过引用(ref)来实现类似的功能。透过两种语言,我们更容易理解一些基础的比较绕的概念,这样的学习方法希望你也能学会。
2023-04-05 14:50:59 715
原创 彻底搞懂洗牌算法
这个算法使用了 Random 类来生成随机数,然后使用 for 循环来遍历整个数组,每次循环将当前元素与一个随机位置的元素交换。注意,由于数组下标是从 0 开始的,因此在生成随机数时需要将上限设为 i + 1。洗牌算法可以通过 Fisher-Yates 算法实现。这个算法的思路是从数组的最后一个元素开始,依次将其与一个随机位置的元素交换,直到遍历整个数组。洗牌算法是面试过程中经常会问到的一个题,如果你没看过,可能一开始还想不出来。
2023-03-28 15:40:02 172
原创 从C++的角度讲解C#容器
C# 中的 Stack 和 Queue 分别是后进先出(LIFO)和先进先出(FIFO)的数据结构,类似于 C++ 中的 std::stack 和 std::queue。C# 中的 HashSet 是一个无序的集合,其中不允许重复的元素,类似于 C++ 中的 std::unordered_set。C# 中的 SortedSet 是一个有序的集合,其中不允许重复的元素,类似于 C++ 中的 std::set。好了,希望对转Unity,学习C#的你有帮助。
2023-03-27 10:53:19 614
原创 c# 泛型约束
例如,如果您编写一个需要使用“+”运算符的方法,但是类型参数 T 并不一定包含此运算符,则可以使用 where T : IAddable 约束来限制 T 必须实现 IAddable 接口,该接口定义了“+”运算符。在这个例子中,方法使用 where T : IAddable 约束,以确保 T 实现了 IAddable 接口,该接口定义了“+”运算符。where T : struct - 此约束指定 T 必须是值类型。where T : class - 此约束指定 T 必须是引用类型。
2023-03-27 03:25:05 540
原创 c# 引用类型还是值类型代码解析
需要注意的是,C# 中的一些类型(如字符串)虽然是引用类型,但是它们的行为更像值类型,因为它们的实例在不可变时可以被重用,而不需要在堆上创建新的实例。生命周期:值类型的实例的生命周期与其所在的作用域相同,而引用类型的实例的生命周期可能会超过其所在的作用域,因为引用可能会被传递到其他作用域中。比较方式:值类型的比较是按值比较的,而引用类型的比较是按引用比较的(即比较两个引用是否指向同一个对象)。传递方式:值类型的实例在传递时是通过值拷贝传递的,而引用类型的实例在传递时是通过引用拷贝传递的。
2023-03-25 00:28:15 98
原创 unity ECS简介
组件是Unity ECS中描述游戏对象属性的基本单元,每个组件只描述一个属性。实体是游戏对象的标识符,组件是游戏对象的属性,系统是对实体和组件的操作。Unity ECS是Unity引擎中的一种高性能游戏开发架构,它采用了基于数据的设计思路,与传统的面向对象编程不同。面向数据:ECS是一种基于数据的编程模型,它着重于描述游戏对象的属性和行为,而不是游戏对象本身。内存布局:ECS使用紧凑的内存布局,使得游戏对象的数据可以更快地被访问,从而提高了游戏的性能。创建实体后,可以通过实体管理器给实体添加组件。
2023-03-07 08:34:43 4975
原创 游戏通用解决方案之红点设计
管理红点状态:每个节点需要维护一个红点状态,表示该节点的红点是否需要显示。例如,当任务完成时,需要更新任务节点的红点状态,并递归更新其父节点的红点状态,直到根节点。例如,根节点可以代表游戏主界面,子节点可以代表不同的游戏模块或功能,进一步的子节点可以代表具体的任务或邮件等。可以通过Unity的UI组件来实现红点的显示和隐藏,例如通过SetActive()函数控制红点图标的显示和隐藏。监听数据变化:为每个节点添加一个数据监听器,当该节点所依赖的数据发生变化时,会触发相应的监听器,从而更新红点状态。
2023-03-06 10:59:56 900
原创 《Clean Code》读书笔记
优秀的源文件也要像报纸文章一样,名称应当简单并且一目了然,名称本身应该足够告诉我们是否在正确的模块中。最理想的函数参数形态是零参数,其次是单参数,再次是双参数,应尽量避免三参数及以上参数的函数,有足够的理由才能用三个以上参数。编写代码的难度,取决于周边代码的阅读难度。想要快速实现需求,想要快速完成任务,想要轻松的写代码,请先让你书写的代码整洁易读。重复的代码会导致模块的臃肿,整个模块的可读性可能会应该重复的消除而得到提升。带有少量注释的整洁而有力的代码,比带有大量注释的零碎而复杂的代码更加优秀。
2023-03-04 23:34:38 277
原创 使用Unity在材质球上实现绘画:详细解释每一行Shader代码!
sampler2D是一种表示纹理的类型,_MainTex、_BrushTex是两个纹理变量,_MainTex_ST、_BrushTex_ST表示纹理的缩放和偏移量,_BrushScale、_BrushColor分别表示画笔的缩放和颜色。在片段着色器中,我们首先获取当前像素的纹理坐标uv。然后,我们将画笔大小转化为纹理坐标系统中的大小,计算出当前像素到画笔中心点的距离,如果距离小于画笔大小,则将该像素的颜色设置为画笔颜色。在Shader中添加绘画函数:在Shader中添加一个绘画函数,用于在材质球上绘画。
2023-02-24 03:17:57 1128
原创 重读《DOOM启世录》
许多游戏开发者都是网瘾少年,抱着对游戏的热爱进入游戏行业,在经历996的加班加点,买房的压力,浮躁同样跟随着我们,我们是否还热爱着自己的事业,我们不是天才,也成不了卡马克,但是我们最起码要有自己的作品,自己的一点点小成就,这样说起来我们也是不枉此生。
2023-02-22 21:20:41 658
原创 Unity UGUI如何计算drawcall
UGUI在合批之前,会根据ui的Depth、MatID 、ImgID、RendererOrder进行排序,之后对相邻的UI进行检测,判断ImgID和MatID是否相同,如果相同则可以进行合批处理,如果这两个UI的MatID和ImgID都相同,但是不连续,中间有其他不同MatID或ImgID的UI则会打断合批。深度排序之后,就会根据matID进行排序,如果材质相同则对ImgID进行排序,如果也相同,那会根据inspection面板上的RendererOrder,最后真正进行UI的合批。
2022-10-09 19:41:56 769
原创 《unity游戏优化》第8章内存优化
8.闭包很危险,匿名方法和lambda表达式可以是闭包,但不能总是闭包,取决于方法是否使用了它的作用于和参数列表之外的数据。7.协程会消耗少量内存,直到调用yield,避免产生太多短信时间的协成。4.通过引用传递引用类型,可以修改原始的引用的对象数据集。4.对字典键使用obj.GetInstanceID();3.通过值传递引用类型,就可以修改原始引用的对象。1.struct是指类型,class是引用类型。2.通过引用传递值类型,可以修改传入的原始数据。1.通过值传递值类型,只能修改其数据的副本值。
2022-10-07 11:55:15 897
原创 《unity游戏优化》第六章读书笔记
优化移动设备的渲染性能避免alpha测试,消耗资源,利用alpha混叠来避免最小化drawcall最小化材质数量最小化纹理大小 1024*1024确保纹理是方形且大小为2的幂次方着色器尽可能使用最低的精度格式
2022-10-07 10:22:26 936
原创 《unity游戏优化》第一章读书笔记
5.Update,Coroutines 和InvokeRepeating。从GameObject中检索字符串属性是另一种意外跨域本机-托管桥接。7.避免从GameObject取出字符串属性。当然,只有这些计算都生成相同的结果,才有效。多个对象共享某些计算结果,可节省性能开销。6.更快的GameObject空引用检查。1.使用最快的方式获取组件。2.移除空的回调定义。
2022-09-26 20:58:30 347
转载 Unity Dotween使用优化,1ms优化
最近在继续做性能优化,后续空下来尽量总结一些小的优化点分享出来。这些都不是大的优化,只是积少成多的改善。
2022-09-23 00:20:12 991
原创 子线程渲染技术和AC自动机
原因:在玩家较多,且时装坐骑等差异化较大时,客户端帧率低,卡顿明显思路:将渲染放在子线程进行,使逻辑处理和渲染可以同时进行,提高并行处理能力,提高客户端运行效率,提升帧率,缓解卡顿
2022-09-22 11:23:53 218
原创 python 批量修改文件夹的后缀名
# -*- coding:utf8 -*-import osimport randomdef rename(path): oldpath = path pos1 = path.find('.luac') # pos2 = path.find('_', pos1+5) newpath = path[:pos1]+'.lua' os.rename(path, newpath) # 对文件进行重命名def test(path): file...
2022-04-23 13:40:16 625 1
原创 lua拼接字符串性能分析
-- local str= '1';-- local result = table.concat("2");-- print(result);-- local tt = string.sub(str, 1, -2) -- print(tt);-- local strs = {};-- for i = 1, 30000, 1 do-- strs[i] = "helloworld";-- end-- local result = "";-- local s.
2022-03-27 00:38:29 804
原创 最近面试点记录总结
1 红黑树属于平衡二叉树。它不严格是因为它不是严格控制左、右子树高度或节点数之差小于等于1,但红黑树高度依然是平均log(n),且最坏情况高度不会超过2log(n),通过左字数红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决。这一点是AVL所不具备的。2.hash碰撞的解决方式是开放寻址法和拉链法。hash碰撞的解决方式是开放寻址法和拉链法。开放寻址法指的是,当前数组位置1被占用了,就放到下一个位置2上去,如果2也被占用了,就继
2022-02-14 17:18:45 444
原创 两道智力题
1。m*n的各自蚂蚁只能向右向上爬,问下一共有多少条路线这有一道排列组合题目m*n的大小的网格,在不重复走的情况下,有m步往下走,n步往右走,才能到达终点,总共m+n步,所以在m+n步选出m步往下走,剩下的往右走就行了,所以递推公式是排列组合c(m,m+n)=(m+n)!/(m!*n!)2。计算时针A和分针B的夹角,要了解角的性质并注意钟表类类问题的性质用公式表示时针A走过1小时,经过的角度是360/12= 30°分针B走过1分钟 角度是360/60= 6这块还有一个
2022-02-12 15:24:25 312
原创 高手和普通人的本质区别的两条
你用小米手机,穿凡客T恤,泡贝塔咖啡听创业讲座,宅家看耶鲁公开课,知乎果壳关注无数,36氪每日必读,BAT大格局了如指掌。肉夹馍只吃西少爷,约饭局去雕爷,喜欢罗永浩胜过乔布斯,逢人便谈互联网思维——如果你高度符合上述描述,那你应该还在每天挤地铁这是个段子,但是深挖下会发现,其实很多人都装的很上进,记住一句话,你能看到的知识,都是这个商业社会想让你看到的罢了作为一名合格的程序员,必须有窥探到事物的本质的能力,我发现在自己领域有建树的人,很多常识,或者最近发生的热点,他们都不知道,或者慢半拍的这
2022-01-16 01:14:40 155
原创 如何面试一个程序员
笔者编码十载,面试过很多人,也被很多人面试过我其实发现很多企业不太懂怎么面试程序员,要么算法八股文,要么就纯项目经验,其实这些都是可以靠短期包装的我面程序员,其实就一个问题,你除了工作中做的项目,业余时间做过什么软件,什么游戏,有没有提交过开源软件的代码过?因为如果你不爱意见事情,你不可能把它做的真正优秀,要是你热爱编程,你就无法避免的会去开发你自己的demo或者项目言简意赅是我的风格,希望对你有用...
2022-01-16 00:50:22 177
原创 面试的一道算法题-最多有多少个1是连续的
const arr = [ [1, 0, 1, 1, 0], [1, 0, 0, 1, 1], [0, 0, 1, 0, 1], [1, 0, 1, 0, 1], [1, 0, 1, 1, 0],];function getNumber(arr, i, j) { let num = 1; arr[i][j] = 0; // console.log(i, j); // console.log(arr[i - 1]); .
2021-09-13 21:34:44 319
敏感词过滤软件
2012-12-12
vc6.0 win7兼容第二个分卷
2010-07-21
win7 vc6.0完全兼容
2010-07-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人