- 博客(21)
- 收藏
- 关注
原创 虚函数的代替方案
之前在牛客的面经中看到这样一题:虚函数会增加内存开销,有什么替代方案?在C++中,虚函数通常会通过虚函数表(vtable)来实现多态性,这就需要为每个包含虚函数的类添加一个指向虚函数表的指针。这一额外的指针会增加每个对象的内存开销。
2025-02-19 12:19:37
235
原创 C# Dictionary的实现原理
是一个基于哈希表(Hash Table)实现的键值对集合。它提供了高效的插入、删除和查找操作,平均时间复杂度接近。,确定应该存放的桶。
2025-02-13 12:59:16
951
原创 C# struct, class的区别
特性class(引用类型)struct(值类型)内存分配堆栈生命周期管理垃圾回收器管理自动销毁(超出作用域时销毁)是否支持继承支持继承不支持继承默认值null所有字段初始化为零值是否实现接口可以实现多个接口可以实现多个接口赋值与传递传递引用(引用类型)传递值(复制数据)适用场景适用于较复杂的对象,涉及共享数据和继承的场景适用于小型数据结构,要求高效的复制与传递的场景内存效率内存分配较慢,需要垃圾回收内存分配较快,不涉及垃圾回收在选择使用class还是struct。
2025-02-12 16:24:26
996
原创 C#中的GC机制简析
在C#中,是 .NET 框架的一部分,负责自动管理内存。垃圾回收机制的目标是识别和清理不再使用的对象,从而避免内存泄漏,并帮助开发者避免手动内存管理的复杂性。
2025-02-12 15:28:38
1241
原创 Unity中频繁调用SetActive导致的性能问题
SetActive方法的调用涉及跨越和之间的通信,这比单纯在 C# 层内进行的操作要慢一些。因此,频繁调用SetActive可能会导致性能下降,尤其是在大量对象需要频繁被激活或禁用的情况下。
2025-02-11 13:09:56
956
原创 shader中if语句的性能问题以及Unity中的解决策略
现代 GPU 采用 SIMD(Single Instruction Multiple Data)或 SIMT(Single Instruction Multiple Threads)架构,即多个像素/顶点同时执行。这种方法避免了分支跳转,但仍然可能导致不必要的计算,降低效率。语句导致分支跳转,会打破指令流水线(Pipeline),增加执行延迟。语句让 warp 内的线程执行不同的分支,GPU 可能需要。),编译器可能无法优化它,导致运行时必须实际执行分支跳转。,然后丢弃无用结果,降低效率。
2025-02-05 20:27:55
618
原创 C#的dynamic
在 C# 中,dynamic是一种动态类型,用于在编译时绕过类型检查,并将类型检查推迟到运行时。这种特性可以用来简化与动态对象或需要高度灵活性的代码的交互,例如处理反射、COM 对象、IronPython 等。dynamicdynamic关键字声明的变量会在运行时根据赋值的实际类型进行操作,而不是编译时确定类型。
2025-01-23 16:37:56
374
原创 shared_ptr所管理的对象被释放时,weak_ptr会怎么样
当一个所管理的对象被释放时(即shared_ptr的引用计数变为0),所有指向该对象的会变为。但需要注意的是,本身不会直接持有对象的所有权,因此它不会阻止对象被释放。
2025-01-18 15:22:50
256
原创 C++中的模板特性(Traits)
C++中的模板特性(Traits)是一种常见的技术,用于在编译时提取或操作类型信息。Traits类提供了一种灵活且可扩展的方法,用于实现类型特定的行为和元编程。
2024-08-01 17:13:09
811
原创 C++静态内存池
在我们为对象分配内存时,我们的编译器会自动在对象对应的内存上下各分配一个cookie,用来描述对象的大小信息,方便我们进行释放。在我们大量进行内存分配是时候,过多的这些cookies会影响我们的性能。所以,我们希望对于一种对象,我们先分配一大块紧凑的内存(chunk),然后将大量的同种对象存储在这大块内存chunk中。每次需要一个这种对象时,我们不需要再次new一个(这样会创建新的cookie),而是直接从之前申请的那个大块内存中拿就可以。这样,我们就避开了cookie。这个大块的内存,就是我们的“池”
2024-08-01 17:11:53
470
原创 基于各向异性高光的头发卡通渲染尝试
资源地址:https://assetstore.unity.com/packages/3d/characters/humanoids/sci-fi/chinese-cyborg-warrior-free-287098。之前我在资源商店上发了一个免费资源,内容是一个中国角色模型,其中还包含了头发,皮肤,眼球渲染的shader。现在,我想尝试做做卡通风格,而对于本例中头发卡通渲染,我打算原来各向异性高光的基础上弄弄。要想渲染出卡通的效果,主要是改变diffuse项的计算方法。偏移tangent如下得到。
2024-07-12 23:52:58
261
原创 Unity瞳孔折射渲染详细解析
瞳孔的折射模拟是眼球渲染中的一大难点,当然,关于眼球的渲染,还有很多需要实现的难点,但是其中,瞳孔中的折射模拟是涉及细节最多,最复杂的一个。在本文中,我将具体讲解基于物理的瞳孔折射的计算原理,以及从建模和Shader编写的一些细节。注意,本文只讨论眼球渲染中的瞳孔折射部分。
2024-06-27 17:16:22
1699
原创 C++多态简析
按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。或者可以理解为可以简单地概括为“一个接口,多种方法”,相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。再说白了,多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。
2024-05-28 22:26:21
628
原创 Unity Stencil模版测试的简单应用
通常情况下,Stencil值在绘制对象时被设置,然后在随后的绘制步骤中用来决定哪些像素应该被绘制,哪些像素应该被忽略,或者以不同的方式处理。在我们的屏幕上,每一个像素都有自己的stencil值,默认是0。在实际应用中,我们可以通过stencil test来改变像素的stencil值,也可以通过stencil test来剔除一些像素的渲染。在创建一个一样的,命名为Stencil2,Stencil的Value设为2,其他一样。这里填的是Replace,代表通过之后,用Ref的值替换当前缓冲的值。
2023-08-28 18:10:11
483
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人