- 博客(37)
- 收藏
- 关注
原创 UnityUI优化
摘要:本文分析了Unity UI性能优化的关键点。主要涉及Canvas.SendWillRenderCanvases(UI元素更新耗时)、Canvas.BuildBatch(网格合并耗时)、CanvasRenderer.SyncTransform(变换同步耗时)和EventSystem.Update(事件处理耗时)等核心函数的优化方案。优化建议包括:动静分离、降低网格复杂度、合理设计Canvas层级结构、使用图集、控制UI元素更新频率等。特别强调要注意UI合批条件,避免层级穿插导致的合批失败,可通过Fram
2025-11-29 16:09:36
651
原创 关于游戏程序发展方向的浅浅思考
作为游戏开发行业的新人(还算吧),经常会思考自己的发展方向是什么,以前经常会看 boss 或者其他招聘平台对人员的需求,看到各种 GamePlay 向,工具向,TA 向等等类的岗位,但是从来没有总结过。这篇文章就是总结我对游戏程序发展方向的思考~
2025-10-29 17:50:47
331
原创 关于OOP到组件式到ECS的思考
本文对比了面向对象开发中的继承方式与组件式开发模式,指出继承会导致复杂的类层次结构,而组件式开发虽优于继承但仍存在CPU缓存命中率低和组件管理混乱的问题。为此提出ECS架构,通过实体作为组件标识符、组件仅存储数据、系统统一管理逻辑的方式,实现了更新顺序可控、数据聚合和并行化等优势。最后通过代码示例和图示展示了ECS结构中调度器协调系统执行、统一更新实体状态的运作机制。
2025-10-29 17:48:11
1054
转载 Dots之路-核心包_JobSystem_01_WaveCube示例
本文对比了Unity中实现波浪方块效果的两种方式:基于GameObject的传统方式和基于Job System的并行计算方式。传统方式直接在Update中遍历处理每个方块,而Job方式通过TransformAccessArray和Burst编译优化性能,使用IJobParallelForTransform实现并行计算。后者利用BurstCompile标签提升执行效率,适合处理大规模对象变换,但需要注意管理TransformAccessArray的生命周期。文章提供了两种实现的具体代码示例,并简要说明了相关技
2025-09-27 08:14:53
39
转载 Dots之路-核心包_JobSystem_01
本文介绍了Unity Jobs System的基本概念和使用方法。Jobs System包含C#和C++两种实现,能够利用多核平台安全高效地执行多线程代码。重点讲解了C# Jobs System的特性:通过数据拷贝或NativeContainer避免竞态条件,支持Blittable类型实现C#/C++内存兼容,以及NativeContainer的内存管理机制。最后介绍了三种Job调度方式:Run(主线程顺序执行)、Schedule(单工作线程执行)和ScheduleParallel(多线程并行执行,性能最佳
2025-09-27 08:12:44
38
原创 CSharp多线程之RaceCondition
当多个线程同时读写共享数据时,可能会导致Race Condition(竞态条件),造成数据不一致。在C#中,常见的解决方法包括:1)使用lock锁定共享资源,确保原子操作;2)Interlocked提供轻量级的原子操作;3)Monitor实现更底层的同步控制;4)ReaderWriterLockSlim适用于读多写少的场景,提高并发性能。合理选择同步机制可有效避免Race Condition问题。
2025-09-27 08:08:23
309
原创 Blittable_and_Non-Blittable_Typs
本文介绍了C#中的Blittable Types和Non-Blittable Types。Blittable Types是指托管和非托管内存中内存布局完全一致的类型,可以直接在两者间传递而无需转换,包括基本数值类型、指针等。判断一个类型是否为Blittable的条件是:必须是值类型,所有字段都是Blittable,不包含引用类型和托管指针。这些概念在C#与C/C++互操作时非常重要,确保数据在内存中的一致性。
2025-09-27 07:55:34
269
原创 重学C# - 泛型
泛型是一种支持算法重用的机制,允许开发人员定义可操作不同数据类型的通用算法,使用时可指定具体类型。泛型的优势包括:保护源代码隐私、确保类型安全、减少类型转换使代码更清晰,以及提升性能(避免值类型的装箱拆箱操作)。示例展示了List<int>相比ArrayList在处理整数时更高效,避免了不必要的装箱拆箱开销。泛型在CLR和编程语言中实现了算法与数据类型的高效解耦。
2025-09-22 16:08:32
363
原创 YooAsset源码阅读-资源加载卸载
本文分析了YooAsset资源加载系统的核心架构与实现机制。系统采用分层设计,ResourcePackage作为入口提供四种加载方式:单资源(AssetHandle)、子资源(SubAssetsHandle)、全资源(AllAssetsHandle)和原生文件(RawFileHandle)加载。各Provider通过ResourceManager协调工作,实现了异步加载、优先级控制等功能。这种设计既保证了灵活性,又确保了资源管理的统一性,适用于各种资源加载场景。
2025-08-06 14:46:12
1300
原创 YooAsset源码阅读-Downloader篇
本文分析了YooAsset资源管理系统中两种下载器创建方法:CreateResourceDownloaderByAll和CreateResourceDownloaderByTags。前者通过GetDownloadListByAll方法遍历所有Bundle资源,检查NeedDownload状态后创建下载列表;后者则通过GetDownloadListByTags方法,支持按标签过滤资源,特别适用于DLC场景。两种方法最终都返回ResourceDownloaderOperation实例,文章通过清晰流程图展示了完
2025-08-05 09:36:09
1036
原创 YooAssets源码解读 - 初始化
本文解读YooAssets资源管理系统的初始化流程,主要包含三个核心部分:1) YooAssets全局初始化,涉及YooAssetDriver和OperationSystem的联动更新机制;2) 资源包创建过程,通过CreatePackage生成ResourcePackage实例;3) 运行模式初始化,详细分析四种不同模式(编辑器模拟/离线/主机/Web)的初始化流程。文章通过多张Mermaid流程图直观展示类关系与调用链,特别解析了异步操作系统的Update机制,包括OperationSystem如何管理
2025-07-31 19:51:21
786
原创 ClaudeCode使用RIPER-5提升编码可控性
本文介绍了RIPER-5 AI工作流模式及其应用。RIPER-5代表研究、创新、计划、执行、回顾五种模式,主要解决AI使用中的上下文记忆和操作控制问题。其核心是将任务拆分为三个阶段并记录单独文档,通过Memory-MCP工具增强索引记忆。优点包括任务管理清晰、操作可控,适用于复杂任务;缺点是会延长任务时间且需人工审查。文章提供了作者修改后的RIPER-5提示词版本,特别针对Unity开发优化,强调严格的开发流程规范、低GC要求和文档优先原则。工作流分为需求澄清、设计、任务分解等阶段,每个阶段都需要用户明确批
2025-07-28 09:35:26
1039
原创 如何加快ClaudeCode效率
本文分享了优化Claude Code编码速度的两个实用方法:一是通过多窗口并行处理任务,将自己置于任务分配者角色;二是利用MCP(上下文补全)技术加速单个对话,推荐了repomix、serena等高效MCP工具。虽然Claude Code处理速度为分钟级较慢,但其出色的准确率和任务完成度使其成为作者的首选AI编码工具。这些优化技巧能有效提升使用体验,帮助开发者更高效地完成编码任务。
2025-07-23 11:46:28
1437
原创 unity实现简易的跟随相机
这篇文章介绍了一个简易的Unity相机跟随系统实现。作者在开发游戏时需要简单相机跟随功能,但之前主要使用复杂的Cinemachine方案,因此自行编写了这个轻量级解决方案。代码提供了平滑跟随目标、视角朝向和FOV调整功能,通过LateUpdate确保相机移动在角色移动之后执行。系统包含防抖动优化,检测目标微小移动以避免不必要的更新,并使用SmoothDamp和Slerp实现平滑过渡。该控制器支持动态更改跟随目标、偏移量、速度等参数,适用于基础3D游戏的相机需求。
2025-07-14 15:41:00
184
原创 ClaudeCode如何配置MCP
本文介绍了如何配置Claude的MCP(Model Context Protocol)服务器。MCP允许Claude与外部服务器通信,扩展其功能。配置方法包括使用命令行工具(推荐)或简单命令添加服务器。文章详细说明了五种常见MCP服务器的配置方式:Memory MCP(内存管理)、Repomix(代码分析)、Tavily MCP(网络搜索)、GitHub MCP(GitHub操作)和Context7(文档查询)。还介绍了环境变量设置、服务器管理方法以及常见问题解决方案。配置时需要获取相关API密钥并确保环境
2025-06-17 11:49:47
6180
原创 GameFramework生命周期
本文分析了GameFramework框架的生命周期管理机制。与Unity原生生命周期相比,GameFramework通过GameFrameworkModule抽象类统一管理模块生命周期,解决了执行顺序不确定、初始化销毁顺序混乱等问题。核心机制包括:通过Priority属性控制模块执行顺序;使用Update和Shutdown方法统一管理更新和销毁;通过GameFrameworkEntry实现模块的创建、获取和有序管理(高优先级先更新,后销毁)。该设计体现了依赖倒置原则,通过接口获取模块,确保模块间的正确依赖关
2025-05-25 11:14:29
866
原创 软技能-代码之外的生存指南_其三
每个人都希望自己很重要,一旦你贬低他人,削弱他们的成就感,在某种程度上就如同切断了他们的氧气补给,获得的回馈就是愤怒和敌意。在与人打交道时,要认识到模式是存在的,如果你能够时时刻刻把主导模式抓在自己手中,那你就可以说服人们相信你对现实的感知。所谓你的模式就是你如何看待世界, 你相信什么是事实. 所谓他的模式就是他们对现实世界的感知。每当你与另外一个人对话时, 你的模式和他的模式发生激烈的交锋, 其中一人会胜出。每当你与另外一个人对话时,你的模式和他的模式发生激烈的交锋,其中一人会胜出。
2025-05-25 11:10:45
908
原创 MCP踩坑记录-关于windows配置报错-NoToolFound
在Windows系统配置MCP(Model Context Protocol)时,用户可能会遇到“No tool found”错误。官方推荐使用npx @modelcontextprotocol/server-memory命令来启动服务。然而,如果此命令无效,可以尝试以下两种解决方法:第一种是直接使用Node运行服务器目录中的index.js文件,如node C:\Users\user\AppData\Roaming\npm-cache\_npx\15b07286cbcc3329\node_modules\
2025-05-22 07:54:09
660
原创 Unity网格重建
在 UGUI 中,如果要渲染一个 UI 元素(Image,Text 等),需要经过 CPU 阶段将渲染所需要数据如:顶点,位置,纹理等信息传递给 GPU 进行渲染。在运行时,UI 元素外观或布局发生变化时,UGUI 会重新计算这些数据并传递给 GPU,这个过程称为网格重建(Mesh Rebuild)。
2025-05-06 23:52:44
543
原创 StartForce学习1(ProcedureMenu)
通过脚本名,我们进 ProcedureMenu 看到脚本重写了 OnEnter、OnLeave、OnUpdate。通过继承我们找到 ProcedureBase 脚本可以看到他们的调用时机(OS:着看函数名也知道吧…,所以我们这里面所显示的流程因该都是继承与 ProcedureBase 的脚本。根据官方文档整个游戏的流程因该都是由。回到 ProcedureMemu。在 Start 执行了两行函数。根据作者在流程介绍中所说。
2023-06-05 21:29:28
201
原创 跳跃游戏-力扣
从题目我们维护一个整数end,并让end一直保持在当前可以到达的最远位置,如果遍历到end位置结束后end值依然小于最后一位下标,则返回false,若end大于或者等于最后一位下标返回true。给定一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。
2022-11-23 01:31:28
570
原创 unity AssetBundle 详解
Unity AssetBundleAssetBundle.LoadFromMemoryAsyncAssetBundle.LoadFromFileWWW.LoadfromCacheOrDownload(已弃用)UnityWebRequestAssetBundle 和 DownloadHandlerAssetBundle
2022-05-30 01:58:12
6170
原创 团体程序设计天梯赛-练习集
L1-019 谁先倒 (15 分)(java) import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int Al = in.nextInt(); int Bl = in.nextInt(); int c = in.nextInt(); int a = 0; int b = 0;
2021-03-07 22:05:51
119
原创 团体程序设计天梯赛-练习集
L1-017 到底有多二 (15 分)(java)1、将字符串转换为字符数组2、使用for循环与if语句求出2的个数3、使用if语句判断情况,并使用相应公式进行计算import java.util.Scanner;public class ptacs { public static void main(String[] args) { int count = 0; Scanner in = new Scanner(System.in); String str = in.next
2021-03-06 19:54:52
193
原创 团体程序设计天梯赛-练习集
L1-015 跟奥巴马一起画方块 (15 分)(java)用两个for循环分别控制行数与列数进行输出换行import java.util.Scanner;public class ptacs { public static void main(String[] args) { Scanner in = new Scanner(System.in); int num = in.nextInt(); String ch = in.next(); //第一个for控制行数,方便进行换
2021-03-06 19:42:27
105
原创 团体程序设计天梯赛-练习集
L1-013 计算阶乘和 (10 分)(java)1、定义两个数值分别用于阶乘和累加阶乘结果2、使用两个for循环实现逐个数阶乘3、输出import java.util.Scanner;public class ptacs { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); //定义两个数分别用于求和与阶乘 int sum
2021-03-06 19:33:27
130
原创 团体程序设计天梯赛-练习集
L1-010 比较大小 (10 分)(java)1、定义一个数组将数据储存2、使用for循环将数组进行由大到小排列3、输出import java.util.Scanner;public class ptacs { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] a = new int[3]; for (int i = 0; i < 3; i++) {
2021-03-05 22:10:00
172
原创 团体程序设计天梯赛-练习集
L1-008 求整数段和 (10 分)(java)题目:解题思路:1、先使用for循环穷举出两个数之间的数字,并用String.format()进行格式化输出。2、使用计数器进行换行操作。3、使用if()语句进行判断是否需要换行。import java.util.Scanner;public class ptacs { public static void main(String[] args) { Scanner in = new Scanner(System.in); in
2021-03-05 21:47:04
194
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅