- 博客(74)
- 资源 (20)
- 收藏
- 关注
原创 UGUI动静分离,哪些部分(顶点,颜色,材质)改变会导致重绘
摘要:Unity UGUI中,动静分离是优化UI性能的关键策略。重点在于识别触发Canvas重绘的属性变化,包括顶点数据、颜色、材质等。优化方案包括:1)将动态元素与静态元素分离到不同Canvas层级;2)控制更新频率;3)使用MaterialPropertyBlock修改材质参数。通过工具检测性能,最终实现静态UI零重绘,动态区域重绘频率降低50%-90%。(150字)
2025-09-11 16:47:57
398
原创 Unity中 半透明物体的渲染原理
半透明物体的渲染需要从远到近排序,避免遮挡错误。Unity通过渲染队列(如Transparent队列)和深度管理顺序。Shader需关闭深度写入(ZWrite Off),设置混合模式。动态调整渲染队列或手动排序可优化复杂场景。常见问题包括渲染错乱和叠加失真,需检查队列标签、混合模式,或减少重叠物体。合理配置能平衡效果与性能。
2025-09-11 16:44:56
398
原创 Lua的rawget/rawset方法
Lua中的rawget和rawset是绕过元表拦截的底层操作。rawget直接从表获取值,不触发__index元方法;rawset直接修改表数据,避开__newindex限制。它们用于特定场景如性能优化、元表调试或内部数据操作。与常规读写不同,这两个方法直接访问原始数据,不经过元表处理机制。使用时需谨慎,仅在需要绕过元表时使用。
2025-09-11 16:30:58
215
原创 Unity 资源打包流程
Unity资源打包通过AssetBundle实现,支持动态加载和热更新。打包流程包括标记资源、编写脚本生成AssetBundle文件。热更新通过版本号比对下载差异文件,使用UnityWebRequest实现断点续传。需注意资源依赖、多平台兼容及版本回退机制,关键步骤包含版本管理、差异下载和资源替换。
2025-09-11 16:26:32
160
原创 Unity大世界地图资源处理与场景管理
开发初期建立资源规范(命名规则、LOD标准、内存预算),结合Addressables和SceneManager构建模块化加载系统,通过渐进式优化迭代方案。
2025-09-11 16:20:02
852
原创 Unity中实现红点系统
Unity红点系统实现指南 红点系统是游戏UI中提示未读内容的常见设计,通过数据层、逻辑层和UI层协同工作。核心实现步骤包括:1)创建红点预制体;2)编写RedDotManager单例脚本管理状态和事件;3)使用RedDotBinder将红点绑定到具体功能;4)在游戏逻辑中触发状态更新。采用事件驱动架构提升性能,支持持久化存储和多级红点扩展。优化建议包括使用对象池、复合键设计和ScriptableObject存储状态,最终实现模块化、易维护的红点提示系统。
2025-09-11 16:11:38
462
原创 封装的类与对象池结合使用,与直接使用结构体
对象池复用已分配的对象,避免频繁内存分配/回收(GC开销),适合高频创建/销毁的场景(如子弹、特效)。在Unity中,将封装的类与对象池结合使用,与直接使用结构体相比,各有优劣。类可封装方法、继承、接口等,适合需要逻辑交互的对象(如AI状态机、技能系统)。连续内存布局(如结构体数组),对CPU缓存友好,适合批量处理(如粒子系统)。值类型分配在栈上(或嵌入父对象),无垃圾回收问题。传递对象引用而非拷贝,避免大结构体的复制开销。无需管理生命周期,减少代码量。
2025-09-11 15:57:43
422
原创 在Unity中实现玩家能看到不在AOI(兴趣区域)范围内的NPC
此方案确保NPC始终可见且性能可控,实际数值需根据场景规模调整。创建调试面板,实时调整可视距离和LOD阈值。
2025-09-11 15:53:41
186
原创 Unity中动态图集的使用方法
Unity的URP(Universal Render Pipeline)和HDRP(High Definition Render Pipeline)内置了动态图集功能。以上方法适用于Unity 2019.4及以上版本,具体实现可能因版本差异需要调整。对于2D项目,可结合Sprite Atlas和Dynamic Atlas获得最佳性能。动态图集(Dynamic Atlas)是Unity中一种运行时合并小纹理为大纹理的技术,用于减少Draw Call,提升渲染性能。
2025-09-11 15:45:54
301
原创 unity中如果我在监听的回调里把自己移除了就会发生异常,这时候应该怎么处理规避
在Unity事件回调中直接移除监听器会导致InvalidOperationException异常。本文提供三种解决方案:1)使用协程延迟到帧结束移除(推荐);2)通过标志位在Update中安全移除;3)创建委托副本避免迭代冲突。核心原理是避免在事件遍历过程中修改集合。最佳实践包括使用事件中心管理、观察者模式解耦和对象池优化。示例展示了带待移除队列的事件中心实现,建议优先采用延迟移除法确保线程安全。这些方法能有效解决迭代器失效问题,同时保持代码稳定性。
2025-09-11 15:41:08
274
原创 LZ4压缩算法的实现
LZ4是Unity中用于资源压缩的高性能无损算法,基于LZ77改进,通过滑动窗口和哈希表实现快速解压。Unity优化了其实现,包括内存管理(预分配缓冲区)、SIMD加速和线程安全设计。相比LZMA和Deflate,LZ4在压缩/解压速度和内存开销上表现更优,特别适合AssetBundle压缩和实时网络传输。Unity默认使用LZ4HC模式,支持跨平台差异处理,并通过CRC校验确保数据完整性。该算法可使资源包体缩小30-50%,同时保持极低的处理延迟。
2025-09-11 15:17:25
646
原创 unity中碰撞检测与分离轴定理
Unity默认的物理引擎(Nvidia PhysX)内部使用优化后的SAT算法处理凸碰撞体(如MeshCollider设置为Convex时)。系统提供多种碰撞器组件(如BoxCollider、SphereCollider等),通过物理引擎实时计算对象间的重叠或接触。核心思想是:若存在一条轴线使得两个形状在该轴上的投影不重叠,则它们不相交;若在所有潜在轴上投影均重叠,则发生碰撞。对于两个凸形状,检查所有可能的分离轴(包括各边的法向量)。中设置不同层的碰撞关系,减少不必要的检测。上计算两个形状的投影区间。
2025-09-11 15:12:10
385
原创 点乘和叉乘在Unity中的应用
点乘(点积)和叉乘(叉积)是向量运算的核心概念。点乘计算两个向量的标量积,用于判断方向相似性和夹角计算,公式为a·b=|a||b|cosθ。叉乘则生成垂直于原向量的新向量,用于求法线、旋转轴等,公式为a×b=|a||b|sinθ。在Unity中,Vector3.Dot和Vector3.Cross方法分别实现这两种运算,广泛应用于角色控制、物理模拟、光照计算等领域。点乘适用于方向判断,叉乘适用于生成法向量和扭矩计算。使用时需注意向量归一化以确保准确性。
2025-09-11 15:09:56
474
原创 AssetBundle的组成
AssetBundle是Unity中用于动态加载和管理资源的机制,主要由资源数据、资源索引表、头部信息、压缩数据块、清单文件和资源包变体组成。资源数据包含序列化的Unity资源,索引表记录资源路径和依赖关系,头部信息包含元数据和压缩方式,压缩数据块支持LZMA/LZ4等格式。清单文件独立存储资源列表和依赖关系图,资源包变体允许同一资源的不同版本共存。AssetBundle支持运行时动态加载、依赖链解析和内存管理,可用于资源热更新、减小安装包体积和优化内存使用。
2025-09-11 13:50:24
267
原创 Unity中Assetbunle.Unload传入true和false的区别
Unity AssetBundle.Unload方法参数详解 AssetBundle.Unload方法通过布尔参数控制卸载方式: true:完全卸载AssetBundle及所有实例化对象,适合彻底清理资源,但可能导致引用丢失; false:仅卸载AssetBundle容器,保留已加载对象,适用于频繁调用的公共资源。 使用建议: 短期资源用Unload(true) 长期资源用Unload(false)结合引用计数 可配合Resources.UnloadUnusedAssets优化内存 提示:Unity 201
2025-09-10 20:59:28
233
原创 AlpahTest和Blend的区别
Unity中AlphaTest与Blend的区别: AlphaTest通过阈值二值化处理透明度(如clip(col.a-0.5)),完全保留或丢弃像素,适合硬边透明(如树叶),但可能浪费计算资源。Blend则通过颜色混合公式实现平滑半透明(如玻璃),需从后往前渲染且消耗带宽。关键差异:AlphaTest产生锯齿状硬边,Blend实现渐变效果但依赖渲染顺序。现代管线推荐使用AlphaClip或AlphaToMask优化。选择依据:硬边选AlphaTest,平滑透明用Blend。
2025-09-10 20:54:42
750
原创 什么是内存对齐
摘要 内存对齐是优化Unity性能的关键机制,要求数据地址符合其大小的整数倍(如4字节类型需4的倍数地址)。Unity中需注意结构体布局(避免填充浪费)、NativeArray显式对齐及Shader数据对齐。不同平台对齐要求差异显著(如ARMv7未对齐会崩溃)。优化策略包括手动填充、内存布局属性及对齐检测工具。在ECS或高频计算中推荐16字节对齐以提升SIMD效率。
2025-09-10 20:24:01
277
原创 unity中把场景中的一个物体渲染到屏幕上,经过了哪些坐标空间的转换
Unity中3D物体渲染需经历6步坐标转换:1)本地空间(物体自身坐标系);2)世界空间(通过模型矩阵转换到全局坐标系);3)观察空间(通过视图矩阵转换到相机坐标系);4)裁剪空间(通过投影矩阵标准化);5)NDC空间(透视除法归一化坐标);6)屏幕空间(映射为2D像素坐标)。这一系列矩阵变换(模型-视图-投影矩阵)确保了3D物体正确投影到2D屏幕,是渲染管线的核心处理流程。
2025-09-10 20:12:05
870
原创 Unity中协程和线程的区别
Unity中协程(Coroutines)和线程(Threads)的主要区别:协程运行在主线程上,适合轻量级异步任务(如动画、延时),可直接访问UnityAPI;线程能并行执行耗时操作(如文件I/O、复杂计算),但不能调用UnityAPI。建议优先使用协程,必须用线程时需注意线程安全和主线程回调。关键差异包括执行环境、API安全性、性能开销和适用场景。
2025-09-10 19:57:20
694
原创 Unity 中事件(Event)与委托(Delegate)
Unity中委托(Delegate)与事件(Event)的核心区别在于封装性和安全性。委托是公开的函数指针,支持多播绑定但外部可随意修改;事件通过封装委托限制外部仅能订阅/取消订阅,触发权保留在声明类内部。Unity中事件支持Inspector序列化绑定,更适用于模块通信,而委托适合局部回调。设计原则:优先使用事件确保代码安全,高频调用或简单回调时可选用委托。
2025-09-10 19:46:51
702
原创 Unity中的拆装箱概念详解
Unity开发中C#的拆装箱机制会显著影响性能:1)装箱将值类型转为引用类型,在堆内存分配空间;拆箱则是反向转换,需显式类型匹配。2)性能问题主要体现在GC压力和CPU开销上,高频逻辑中可能导致帧率波动。3)优化方案包括:使用泛型集合、接口约束、方法重载及合理设计结构体。4)Unity特定建议:避免在Update()使用非泛型集合,利用Profiler检测GC分配,优先使用值类型。核心原则是保持值类型栈分配,通过泛型消除意外拆装箱。
2025-09-10 19:38:23
853
原创 Unity中的内存泄漏
摘要:Unity内存泄漏主要发生在托管堆(C#)和本机堆(引擎资源)两个层面。托管堆泄漏常见于未取消事件订阅、静态引用和闭包捕获;本机堆泄漏多因资源未卸载、组件残留引用或协程未终止。检测工具有Unity Profiler、dotMemory等,解决方案包括规范的资源生命周期管理、对象池模式和安全事件处理。建议开发早期建立内存检测流程,监控关键指标如托管堆增量(ΔH)和本机内存增长率(r>5MB/min需排查)。通过工具检测与代码规范结合,可解决90%以上泄漏问题。(150字)
2025-09-10 17:29:57
884
原创 C#强引用和弱引用的区别
C#中强引用保持对象存活(默认引用类型),而弱引用(通过WeakReference类实现)允许对象被垃圾回收器回收。强引用直接访问对象,弱引用需检查IsAlive后再访问Target。强引用适合长期持有的核心对象,但可能导致内存泄漏;弱引用适合缓存等临时数据,能自动释放内存但对象可能随时失效。代码示例显示强引用对象在GC后仍存活,而弱引用对象可能被回收。实际开发中应根据场景选择:优先强引用保证可靠性,仅在需要内存优化时使用弱引用。
2025-09-10 17:25:31
248
原创 Unity中GC产生的原因及避免方法
在Unity游戏开发中,垃圾回收(GC)会导致性能卡顿。GC产生的主要原因是频繁对象分配(如Update中创建临时对象)、装箱操作、Unity特定API调用(如Instantiate/Destroy)和字符串操作等。优化策略包括:使用对象池复用资源、缓存组件、避免装箱、优化集合类型、用StringBuilder处理字符串、减少闭包使用,以及手动控制GC触发时机。建议通过Profiler工具监控GC分配,遵循减少堆分配、资源复用和预分配内存的原则,以提升游戏性能。
2025-09-10 17:19:41
462
原创 C#值类型和引用类型的区别
C#中值类型和引用类型的主要区别在于内存存储和赋值行为。值类型(如int、struct)直接存储数据在栈上,赋值时创建独立副本;引用类型(如class、array)在堆上存储数据,变量仅存储引用地址,赋值时共享数据。值类型内存自动回收,访问速度快;引用类型由GC管理,适合大型对象。选择时需权衡性能与功能需求。
2025-09-10 17:15:30
865
原创 Unity开发中的常见优化思路
本文总结了Unity游戏开发的常见优化思路,涵盖渲染、内存、CPU等多方面。渲染优化建议减少DrawCalls、使用LOD和光照烘焙;内存管理推荐对象池技术和资源卸载;CPU优化包括简化物理计算和异步操作。其他策略涉及UI批处理、音频压缩和平台适配。强调使用Profiler工具分析性能瓶颈,在视觉质量与运行效率间寻求平衡,通过系统优化提升应用流畅度。
2025-09-10 15:34:14
870
原创 unity项目开发中常用设计模式
本文介绍了Unity游戏开发中常用的7种设计模式及其应用场景:单例模式(全局管理)、观察者模式(事件处理)、状态模式(状态管理)、工厂模式(对象创建)、命令模式(输入操作)、组件模式(Unity核心架构)和对象池模式(性能优化)。重点对比了状态模式的两种实现方式(接口vs枚举),分析了各自的优缺点和适用场景。文章通过具体代码示例说明每种模式的实现方法,并给出模式选择建议,旨在帮助开发者构建更清晰、可维护和高效的Unity项目架构。
2025-09-10 15:30:17
1015
原创 C#二叉树的基本结构、排列顺序?
C#中二叉树是一种递归数据结构,每个节点最多有两个子节点。其基本结构通过TreeNode类实现,包含节点值、左右子节点引用。二叉树的排列顺序包括三种遍历方式(先序、中序、后序)和二叉搜索树(BST)的排序特性。BST中节点值满足左<根<右的关系,中序遍历可得到升序序列。在Unity开发中,二叉树可用于空间划分、AI决策树、数据管理优化等场景,平均时间复杂度为O(logn)。实现时需注意可能退化为链表的情况,建议优先使用Unity内置组件,仅在需要优化时自定义二叉树结构。
2025-09-10 15:11:53
908
原创 C#中的List是如何扩容的
C# List<T>采用动态扩容机制,初始容量为0,首次添加元素扩容至4。当容量不足时按2倍扩容,超过2048后改为1.5倍扩容。扩容涉及数组复制,时间复杂度O(n)。最佳实践是预估容量提前初始化,避免频繁扩容。TrimExcess()方法可在元素数量稳定后释放多余容量,但仅当元素数小于容量90%时生效。该设计平衡了内存使用和操作效率,适合处理动态集合场景。
2025-09-10 12:32:25
530
原创 C#(/unity)中的闭包
C#闭包指函数捕获外部变量的机制,编译器会生成闭包对象延长变量生命周期。闭包可能导致内存问题,可通过局部变量复制值、参数传递、命名方法替代匿名函数来避免。在Unity中尤其要注意,避免事件和协程中捕获this引用,可使用WeakReference或参数化方法防止内存泄漏,并记得在OnDestroy中清理事件订阅。合理使用闭包能提升代码灵活性,但需注意性能优化和内存管理。
2025-09-09 21:33:50
913
原创 C#中的浅拷贝与深拷贝
摘要:浅拷贝仅复制对象顶层结构,共享引用成员;深拷贝递归复制所有层级,生成完全独立的对象。C#中浅拷贝通过MemberwiseClone实现,深拷贝需手动递归或序列化处理。Unity中浅拷贝适用于共享部分数据的场景,深拷贝用于需要独立副本的情况。注意深拷贝性能开销,且Unity原生类型需特殊处理。示例展示了通过ICloneable实现深拷贝组件的方法。
2025-09-09 20:54:02
191
原创 CLR的GC机制
CLR的垃圾回收机制详解:.NET框架采用分代式GC,将堆分为Gen0、Gen1、Gen2三代及大对象堆(LOH)。GC通过标记-清除-压缩三阶段自动回收不可达对象,采用并发和后台GC减少暂停时间。关键特性包括终结器处理非托管资源、工作站/服务器两种GC模式选择。优化建议包括减少短命对象分配、慎用大对象、优先实现IDisposable接口。该机制在自动内存管理和性能间取得平衡,但需注意GC暂停和LOH碎片化问题。开发时应结合监控工具,根据应用场景配置最佳GC策略。
2025-09-09 17:41:55
870
原创 线程与进程的区别
线程和进程的区别在于:进程是资源分配的基本单位,拥有独立内存空间,相互隔离但开销大;线程是进程内的执行单元,共享资源且切换高效,适合高并发但需防范竞争。进程提供安全性,线程提升性能,实际应用中需根据任务需求选择。
2025-09-09 16:11:30
784
原创 UDP与TCP的区别
TCP与UDP协议对比摘要:TCP是面向连接的可靠协议,通过三次握手建立连接,提供数据确认、重传和流量控制,适合网页、文件传输等场景,但效率较低。UDP是无连接的轻量协议,直接发送数据包,不保证可靠性但延迟低,适用于实时音视频、在线游戏等。在Unity中,TCP用于回合制游戏和登录验证,UDP适合实时动作游戏的位置同步。TCP通信需四次挥手断开,而UDP无明确结束流程。开发时需注意TCP避免阻塞主线程,UDP需自行处理丢包问题。
2025-09-09 15:58:58
447
原创 C#(链表创建与原地反转)
摘要:本文介绍了C#中链表的实现与反转操作。通过自定义ListNode类构建链表,详细讲解了三指针反转链表的迭代方法,包括指针移动、节点引用修改等关键步骤。文章提供了完整的链表实现代码示例,包含节点追加、反转和打印功能,并对比了不同反转方法的时间/空间复杂度(迭代法O(n)/O(1)、递归法O(n)/O(n))。最后通过Main函数演示了链表创建和反转的实际应用过程。
2025-09-09 15:46:25
630
原创 C#(基本语法)
C#是一种强类型编程语言,主要特点包括:基本数据类型(整型、浮点型、布尔型等)和引用类型(类、接口等);变量声明与常量定义;丰富的运算符和控制流语句;面向对象特性(类、对象、方法);异常处理机制;集合类型管理数据组;命名空间组织代码。C#要求变量必须先声明类型,支持多种运算符和流程控制,提供类与对象实现面向对象编程,并通过异常处理增强程序健壮性,同时使用命名空间解决命名冲突问题。
2025-07-25 21:46:26
407
原创 C#(数据类型)
C#数据类型分为值类型和引用类型两大类。值类型包括整数、浮点、布尔、字符等简单类型,以及枚举、结构和可空类型,直接存储数据于栈内存。引用类型包含类、接口、数组和委托,存储数据地址于堆内存。系统还支持特殊类型如动态类型(dynamic)和指针类型(需unsafe上下文)。二者关键区别在于存储位置、赋值行为和内存管理方式。最佳实践建议优先使用值类型提升性能,需要复杂对象时使用引用类型,并避免频繁装箱/拆箱操作。
2025-07-25 21:43:40
705
原创 Lua(数据库访问)
摘要:Lua自身不包含数据库功能,但可通过多种第三方库实现数据库交互。主要方法包括:1)使用LuaSQL支持MySQL、PostgreSQL等关系型数据库;2)通过lsqlite3操作SQLite嵌入式数据库;3)利用lua-resty-redis连接Redis;4)采用LuaSQL的ODBC驱动连接各类数据库;5)使用LuaORM等ORM框架简化操作。关键注意事项包括连接池管理、错误处理、防止SQL注入和性能优化。开发者可根据项目需求选择适合的数据库访问方案。
2025-07-25 21:32:27
388
原创 Lua(面向对象)
Lua通过表和元表模拟面向对象编程,主要实现继承、多态和封装。继承利用__index元方法构建原型链,子类继承父类属性和方法;多态通过方法重写实现,子类可覆盖父类方法;封装则通过闭包或命名约定实现数据保护。示例展示了父类与子类的创建、方法重写及父类方法调用。Lua的OOP实现灵活,可根据需求选择表+元表或闭包方案。
2025-07-25 21:26:36
419
Bluetooth LE for iOS tvOS and Android
2021-05-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人