- 博客(14)
- 收藏
- 关注
原创 什么情况下drawcall会被打断
在 UI 渲染中,不同层次结构的 UI 元素可能会导致 Draw Call 被打断。启用 Instancing 的对象可以共享一个 Draw Call,而不启用的对象则不能。Unity 中的渲染队列决定了对象的渲染顺序。如果对象位于不同的渲染队列中,也会导致 Draw Call 被打断。如果连续的渲染对象使用了不同的材质或着色器,Draw Call 会被打断。例如,使用不同光照模式或光照贴图的对象会导致 Draw Call 被打断。即使使用相同的材质,不同的纹理也会导致 Draw Call 被打断。
2024-12-01 19:29:31
581
原创 游戏编程有哪些设计模式
原型模式,组件模式,单例模式,享元模式,策略模式,状态模式,装饰器模式,观察者模式,工厂模式,命令模式,对象池模式。策略模式:定义一系列算法,将每个算法封装在独立的类中,使得算法可以互换,客户端无需关心具体实现。组件模式:把功能拆分成多个组件,可以动态添加,移除,或者替换 比如说角色手里头拿的刀枪。观察者模式:定义一对多的依赖关系,当一个对象状态变化时,所有依赖它的对象都会自动更新。状态模式:将对象的状态封装成独立的状态类,通过状态的切换来改变对象的行为。对象池模式:管理对象生成,回收。
2024-12-01 19:28:16
221
原创 智能指针与指针困境
两个或者多个对象互相持有对方的共享指针,导致对象的引用计数永远不会降到0,即使没有外部指针引用对象,也不会被销毁。通过一个look方法获得一个共享指针,如果对象存在,则返回一个有效的共享指针。弱指针由于并没有增加对象的引用计数,因此不会导致引用的对象无法被销毁。
2024-11-07 16:54:58
298
原创 不同语言回收的区别和联系
特点C#LuaTypeScriptC++内存管理方式自动垃圾回收自动垃圾回收自动垃圾回收手动管理,智能指针辅助垃圾回收算法标记-清除 + 分代回收增量式标记-清除标记-清除 + 引用计数手动释放 (new/delete),智能指针引用计数增量回收否是否否分代回收是否否否循环引用处理垃圾回收器自动处理增量回收自动处理标记-清除处理智能指针或手动管理手动控制垃圾回收可以通过可以通过不可手动控制完全手动控制各语言的垃圾回收机制根据其使用场景和需求各有不同。
2024-11-07 16:49:37
1257
原创 观察者模式个人理解
文章目录观察者模式个人理解定义和优缺点个人理解个人实现代码 观察者模式个人理解 定义和优缺点 观察者模式:当一个对象发生改变时,会自动通知依赖它的对象 定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 优点:使观察者之间相互独立,耦合性低 建立了一套触发机制 缺点:通知所有观察者会花费时间 如果存在观察者和被观察者之间的循环关系,则会进行循环调用导致系统崩溃 观察者只是知道被观察者发生了变化,但并不知道为何变化,发生了怎样的变化 个人理解 观察者模式
2021-11-23 17:31:48
224
原创 塔防类游戏实现(一)
文章目录游戏设计前言具体实现地图的设置与生成 游戏设计前言 场景中生成地面网格,每一个格子中可以拥有内容属性,和箭头指向(箭头指向可以关闭) 内容属性主要有:空,出生点,墙,终点等等,默认设置为空 出生点会产生怪物,墙能阻挡怪物 具体实现 地图的设置与生成 新建空物体命名为GameBroad 新建Quad面片,放在GameBroad下,命名为Ground 新建Material,放一张格子图作为贴图 新建GameBroad脚本 //生成地图 GameBroad.cs中 [SerializeField]
2021-11-17 22:48:58
2832
原创 动态编程和Lua热更新
文章目录前言动态读取程序集实现热更新Lua和Untiy的交互Lua脚本的热更新 前言 计算机语言有动态和静态之分,静态语言主要是像C和C++之类的语言。 特点:需要预先编译为目标机器代码,CPU才能正确执行其指令。 动态语言,通常称为脚本。 特点:运行在其他语言实现的程序中,不需要预先编译,而是在程序运行的过程中实时编译,因此具有很强的灵活性 C#和Java是比较特殊的语言,需要编译,但不是编译成机器代码,而是一种中间语言,在程序运行时,再由运行时程序将其编译成为目标代码。 特点:性能上略有一定损失,但更加
2021-11-17 00:05:45
3683
原创 面试题个人简答(可能不准确)
面试题个人简答(可能不准确) 协同程序一般放在monobehavior中的哪个函数中? StartCoroutine函数中开启协程,协同程序,顾名思义就是用来协助主要程序的,就好像一个额外的Update函数一样。 yield就像是一个红绿灯,在不能满足yield后面的条件时,协程会被挂起,把使用权交回调用它的父函数。 暂停游戏time.scaletime==0时,内置函数有什么变化 不会影响Update和LateUpate的执行速度,只会影响FixedUpdate的执行 简述StringBuilder的用途
2021-11-12 14:01:43
3221
原创 Lod技术的实现
Lod技术的实现 Lod,多层次细节,其实就是同一个物体,制作多个不同精度的模型,根据物体的重要性和位置来显示不同精度的模型。思想是空间换时间。 实现过程,在3Dmax 中制作三个不同分段数的球体。 导入Unity,给上不同颜色的材质,红色精度最高,蓝色次之,紫色最低 新建空物体,绑上Lod Group 组件 点击Add,把不同的模型挂载到不同百分比的Lod上,再把所有模型Reset复位 使用鼠标滚轮改变视口离物体的距离,近处物体是红色高精度模型,远处是紫色低精度模型 打开Stats面板可以看
2021-11-09 22:33:59
2354
原创 Unity面试知识点
Unity面试知识点 反射 动态获取类型信息,动态创建对象,动态访问成员的过程。 作用:在编译时无法了解类型,在运行时获取类型信息,创建对象,访问成员 托管堆 是一段内存,由项目脚本运行时的内存管理器自动管理,托管代码中创建的所有对象必须在托管堆上分配内存 Unity 的GC是非代数和非压缩的,表明GC的时候必须扫描整个堆,堆扩展越大,性能会越低,非压缩是内存中的对象不会重新定位,会产生间隙 特殊目录 隐藏文件夹:以 . 开头的文件会被unity忽略 Standard Assets: 这个文件夹的脚本最先被
2021-11-06 16:59:52
393
原创 经典排序代码一览
经典排序代码一览 插入排序 for(int i=0;i<n-1;i++)//插入排序 { int end=i; int tem=arr[end+1]; while(arr[end]<tem) { arr[end+1]=arr[end];//后移一位 --end; } arr[end+1]=tem; } 冒泡排序 while (n)//冒泡排序 { int flag = 0; for (int i = 0;
2021-11-05 23:02:26
166
原创 C#和C++的区别
C#背记(面试整理) C++给开发者的选项更加底层,C#不具备这些选项,但更安全 C#基于CLR【公共语言进行时】 数据类型的作用 1,存储指定长度的数据,向系统申请指定长度的内存 2,存储指定类型的数据(一个字节包括8个bite位) C#中的整形 (有符号整形) int 2的31次方~2的负31次方 short 2的15次方~2的负15次方 Sbyte 2的7次方~2的负7次方 long 2的63次方~2的负63次方 (无符号整形-都是正数) uint 2的31次方 ushort 2的15次方 byt
2021-11-05 22:59:37
550
原创 内存池的实现
内存池的实现 (Memory Pool)是一种内存分配方式,又被称为固定大小区块规划(fixed-size-blocks allocation)。通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能,同时调用库内的内存分配函数,十分耗时。 解决办法是使用内存池技术,大小固定,提前申请,重复利用。 因为内存的申请和释放是很低效的,所以我们只在开始时申请一块大的内存(在该块内存不够用时在二次分配),然后每次需要
2021-11-05 22:45:51
151
原创 C++文件结构
C++文件结构 C++程序主要包括两个文件,即头文件和源文件 头文件 以.h为扩展名,包括三部分内容,版权与版本的声明、宏定义和函数、类信息的声明。 //版权和版本的声明 #ifndef MAIN_H_ #define MAIN_H_//宏定义 class Node//类信息的声明 { int a; }; int Add(int a, int b);//函数声明 #endif // !MAIN_H_ 宏定义的目的是为了防止头文件被反复引用。当编译器编译头文件时,如果宏未被定义,则定义宏,并编译
2021-09-03 00:04:56
1394
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅