- 博客(6765)
- 收藏
- 关注
原创 用贴图“假装“高模细节:3D界最伟大的骗术
法线 = 表面"朝向"的箭头想象每个点都插了一根针,垂直于表面:平面:所有针朝同一方向 ↑↑↑↑↑凹凸面:针朝各个方向 ↗↑↖↑↗光照计算就靠这些"朝向"决定明暗眼睛判断凹凸,靠的是光影明暗;光影明暗,靠的是表面朝向(法线);那我用一张贴图伪造朝向,就能伪造凹凸!高模的百万级细节,烘焙成一张法线贴图,贴到几千面的低模上,性能省99%,效果几乎不变!核心口诀:真凹凸太费,假法线来凑,烘焙搬细节,平面变立体!
2026-08-14 04:08:58
11
原创 游戏角色面数计算全攻略:从标准到公式
单角色面数 = (GPU吞吐率 ÷ 帧率 × 效率系数 × 角色占比) ÷ 同屏角色数有多少性能预算,要显示多少角色,反推每个能用多少面!核心口诀:预算除以数量,同屏越多越省,高模烘成贴图!
2026-08-14 03:44:31
13
原创 游戏模型优化终极指南:性能提升25倍!
3D模型 = 无数个小三角形拼起来的一个球:低面数:粗糙的多边形球 ⚽ (几百面)高面数:光滑的球 🔵 (几万面)面越多 → 越光滑 → 但越费性能把高面数模型 → 减到低面数同时尽量保持外观不变50万面 → 优化到 2万面外观几乎一样,性能提升25倍!同一个物体,准备几个不同精度版本:LOD0: 20000面 (近处,全高清)LOD1: 5000面 (中距离)LOD2: 1000面 (远处)LOD3: 200面 (超远,几乎看不清)根据距离自动切换!
2026-08-14 03:37:54
86
原创 游戏内存爆炸?Mipmap Streaming拯救你
别把整套"俄罗斯套娃"都摆出来占地方,需要哪个大小,才拿出哪个!远处物体看不清,就只加载模糊的小Mip;走近了需要高清,才动态加载大Mip。在内存预算内智能调度,让内存不爆炸!核心口诀:远处用低清,近处用高清,按需加载省内存!
2026-08-14 03:30:31
72
原创 灰度图为何只用.r通道?揭秘RGB等值奥秘
灰度图:从纯黑到纯白的过渡0 128 255纯黑 灰色 纯白它没有"红""绿""蓝"的区别只有"明暗"的区别灰度图没有颜色,只有明暗,所以它的 R、G、B 三个通道数值完全相同。既然三个值一样,取.r.g.b结果都一样,习惯上就取第一个.r,简单直接!mPixels[i].r // 灰度图取R = 取G = 取B,随便哪个都行。
2026-08-14 03:17:11
171
原创 GPU性能优化:通道打包技术详解
一张纹理有RGBA 4个"格子",别浪费!把4张只需要灰度信息的贴图(金属度、粗糙度、AO、高度)分别塞进这4个格子,4张图变1张,内存省75%,采样次数也省75%!口诀:灰度图别单独存,塞进RGBA四通道,省内存又省采样!环节不用图集使用图集纹理绑定× 100× 1绘制调用× 100× 1顶点数据100个独立缓冲1个合并缓冲UV处理各自0~1映射到图集不同区域DrawCall1001。
2026-08-14 03:12:34
5
原创 图集优化:如何减少DrawCall提升性能
环节不用图集使用图集纹理绑定× 100× 1绘制调用× 100× 1顶点数据100个独立缓冲1个合并缓冲UV处理各自0~1映射到图集不同区域DrawCall1001。
2026-08-14 03:02:21
8
原创 Unity Sprite Atlas 完全指南:从“一盘散沙“到“整齐拼图“
如果两张图挨得太近:图A [红色] │ [蓝色] 图B↑采样时可能"串色"红图边缘出现蓝色杂边!😰Sprite Atlas 就是把一盘散沙(分散的小图)变成一整块拼图(合并的大图),让 GPU一次画完而不是反复切换是 2D 游戏和 UI 优化的必备神器!核心口诀:同框的放一起,不同框的分开,别忘了压缩!
2026-08-14 02:52:29
142
原创 2048血条浪费1600倍内存?5大问题详解
用 2048 纹理做 50×50 的血条,就像开着火箭去楼下买菜——不仅浪费燃料(内存),还制造噪音污染(发热掉帧),最后可能连车位都停不下(显存爆炸闪退)。核心原则:纹理尺寸要匹配它在屏幕上的实际显示大小!
2026-08-14 02:46:14
147
原创 Unity纹理优化实战:内存省80%的7大绝招
压缩要用,尺寸够用,无用关闭,能合就合,按需加载。纹理优化没有魔法,就是把这些原则逐条落实。用 Profiler 找出最大的那几张纹理,优先处理,往往能立竿见影!
2026-08-14 02:40:26
227
原创 透视投影的数学魔法
【核心思想】我们最终只关心 2D 屏幕上的画面↓3D 空间里的几何形状"正不正确"根本不重要↓只要 2D 投影的结果正确即可↓【P 矩阵的设计】故意"扭曲"3D 几何↓但扭曲的方式,恰好让透视效果自动生成↓2D 投影结果完全正确↓【收获】所有后续操作(裁剪、深度、光栅化)极致简化硬件可以最快执行↓【代价】裁剪空间/NDC 空间里的 3D 形状是"假的"光照、物理等需要真实几何的操作,必须在世界/观察空间做↓所以我们保留多个空间,各司其职。
2026-08-12 02:50:19
214
原创 揭秘OpenGL状态机:绑定点的秘密
/ GL 对象定义(仓库里的原料)// 实际存储的数据// 采样时的过滤方式等参数// 简化的采样实现// 这个 Program 的所有 uniform 当前值// uniform 名字 -> location 的映射// GL 上下文 —— 核心中的核心// 这就是那台"机床",所有工位都在这里// ========== 工位区(Binding Points)==========// Buffer 工位:每个 target 有一个"当前绑定的对象 id"
2026-08-11 03:23:00
145
原创 GPU多工位机床:OpenGL状态机解析
OpenGL 上下文就是一台带很多工位的机床。你的所有工作分两种:“往工位上摆原料” 和 “按加工按钮”。摆原料是慢的,加工按钮本身很快。所以性能优化的核心 = 少摆几次原料,多按几次按钮。为什么和要分两步调用,不能合成一个?一个 Buffer 对象 id=5,同时和,会冲突吗?Shader 里两个sampler2D都通过设成了 0,会怎样?为什么 VAO 能"打包一堆状态"?它到底记录了哪些工位?
2026-08-11 02:58:53
123
原创 OpenGL 状态机模型:一场“厨房做菜“的奇妙之旅
想象你走进一家非常特别的餐厅——你不需要每次点菜都说:“我要一份牛排,五分熟,黑胡椒酱,配薯条,用瓷盘装,不要洋葱…”你只需要提前告诉服务员“我今天想吃五分熟的”(状态 1)“我喜欢黑胡椒酱”(状态 2)“用瓷盘装”(状态 3)“上菜!🍽️厨房会记住你所有的偏好,按照当前设定做菜。这就是 OpenGL——一个记忆力超好的餐厅。你:"启用深度测试!" → 餐厅记下了你:"用这个着色器!" → 餐厅记下了你:"绑定这张纹理!" → 餐厅记下了你:"画三角形!" → 按上述配置画一个。
2026-08-11 02:41:20
201
原创 Unity UI性能优化:避免Canvas重建的5大技巧
原则做法动静分离频繁变化的 UI 单独放一个 Canvas按需更新只在数据变化时更新 Text降低频率计时器等用协程/InvokeRepeating消除 GC用 TMP 的 SetText 或 StringBuilder事件驱动用事件代替轮询 Update。
2026-08-11 00:10:49
188
原创 Unity UGUI性能优化:Canvas.SendWillRenderCanvases全解析
当 Canvas 上的任何一个 UI 元素发生变化触发事件重新构建整个 Canvas 的顶点数据(Rebuild重新合批(Rebatch提交给 GPU 渲染关键点:Canvas 是整体重建的,即使只有一个元素变化,整个 Canvas 都会重建!
2026-08-11 00:04:55
195
原创 Unity工作线程池深度解析
是 Unity 引擎启动时预先创建的一批 CPU 线程,组成一个线程池。它们不像主线程和渲染线程有固定职责,而是待命,随时接受任务分派。是把线程绑定到特定 CPU 核心上,避免线程在核心间切换。Layer 1:概念层Worker Threads 是一群待命的"打工人",Unity 启动时招聘好,一直待命。Layer 2:机制层通过任务队列 + Work Stealing 实现负载均衡,配合 Job System 提供安全的多线程编程。Layer 3:优化层。
2026-08-10 20:59:25
15
原创 为什么主线程“看到“的 GPU 状态是 2-3 帧前的?—— 深度剖析
假设当前是第 100 帧// 当前帧号 = 100// 100// 尝试读 RenderTexture 的像素// 读到的是什么?层级状态主线程当前Frame 100 的逻辑渲染线程当前正在处理 Frame 99 的命令GPU 当前正在渲染 Frame 98GPU最近完成的渲染Frame 97所以ReadPixels读到的是 Frame 97 的内容(3 帧前)。玩家角度:按键 按键效果显示在屏幕↓ ↓内部时间线:│。
2026-08-10 20:20:38
75
原创 GPU异步执行导致CPU阻塞的三大原因
GPU 是异步的、有延迟的、独立的处理器,而某些 API 需要 CPU 立即"看到" GPU 的状态或结果 —— 这就必须打破异步性,让 CPU 等 GPU 追上来。强制同步的本质是:CPU 不能容忍 GPU 的 2-3 帧延迟,必须立即知道结果。这打破了双线程流水线,让主线程从"生产者"变成"等待者",性能从"并行"退化为"串行"。优化的核心思路是:让 CPU 学会等待,用异步 API 或 GPU 端处理绕开同步需求。
2026-08-10 20:15:25
79
原创 Unity渲染线程深度解析
渲染线程(Render Thread)是 Unity 引擎自动创建的一条独立的原生线程接收主线程的渲染命令将这些命令翻译为具体图形 API 调用提交给 GPU 驱动执行默认情况下,只有渲染线程一条线程处理图形 API 调用。开启 Graphics Jobs后,多个 Worker 线程并行生成图形命令,再由渲染线程提交。
2026-08-10 20:05:01
56
原创 揭秘Unity主循环PlayerLoop核心机制
PlayerLoop是 Unity 每一帧的执行入口,位于引擎 C++ 侧的最外层循环。从 Unity 2018 开始,PlayerLoop 可以被C# 层查看和修改// 找到 Update 阶段 for(int i = 0;i ++) {// 插入自定义系统 var subs = loop . subSystemList [ i ] . subSystemList . ToList();break;// 每帧执行,插入到 Update 阶段 }
2026-08-10 18:48:14
11
原创 Unity渲染架构深度解析
将生成渲染命令关闭 Graphics Jobs:[Main] 生成所有 RenderCommand → [Render] 消费开启 Graphics Jobs:[Main] 触发 → [Worker×N] 并行生成命令 → [Render] 消费生产命令 执行命令 消费命令CPU逻辑 图形API翻译 实际渲染优化方向:├─ 主线程满 → 减脚本、Job化、剔除├─ 渲染线程满 → 减 SetPass、开 Graphics Jobs。
2026-08-10 17:51:18
9
原创 Unity多线程渲染瓶颈深度解析
高不一定是 GPU 瓶颈,可能是 VSync;高说明渲染线程在等,CPU 瓶颈居多;一定要用"关 VSync + 降分辨率"两个测试来确认真正瓶颈。
2026-08-10 17:40:12
195
原创 一个完整的 Activity 泄漏定位实操案例
泄漏类型触发点修复方案1Handler 延迟消息静态类 + 弱引用 + removeCallbacksAndMessages2单例持有 Context使用 ApplicationContext3EventBus 未反注册onDestroy 中 unregister4监听器未反注册对应的 removeXxxListener。
2026-08-10 02:04:56
11
原创 LeakCanary 泄漏报告逐行解读
LeakCanary 是 Square 公司开源的 Android 内存泄漏检测库,能够自动检测 Activity、Fragment、View、ViewModel 等对象的内存泄漏,并生成详细的泄漏引用链报告。解读retained(保留内存):由于此次泄漏,无法被 GC 回收的内存大小156 bytes:本次泄漏占用 156 字节数值越大,泄漏越严重(Activity 泄漏可能达到几 MB)解读Signature:本次泄漏的唯一签名(基于泄漏引用链生成的 hash)
2026-08-10 01:37:05
376
原创 Android ANR 全解析与优化指南
ANR 是什么?→ 主线程被阻塞超过阈值,系统弹出"无响应"对话框阈值:核心原因:→ 主线程做了耗时操作、等锁、等 IO、等 Binder、死锁分析方法:→ 拉 /data/anr/ 里的 trace,看主线程调用栈和状态避免方法:→ 耗时操作放子线程、用异步 API、优化锁、优化布局、延迟初始化监控方案:→ ApplicationExitInfo(线上)、WatchDog、Choreographer、Matrix一句话主线程只做界面相关的轻量工作,其他一切耗时操作都扔到子线程去。
2026-08-09 22:41:16
63
原创 一招精准抓取Android应用日志adb logcat | grep -F “com.example.myapp“
意思是:实时读取 Android 设备日志,并且只显示包含这段固定文本的日志行。
2026-08-09 20:27:09
121
原创 ADB Logcat 完全指南 —— 基础命令、职责与原理
① 应用调用 Log.d()↓② liblog.so 封装消息↓③ Unix socket 发送到 logd↓④ logd 存入对应 Ring Buffer(main/system/...)↓⑤ adb logcat 请求 logd 读取↓⑥ 通过 ADB 通道传输到 PC↓⑦ 终端显示 / 保存到文件核心要点Logcat 本质是内存中的环形缓冲区由logd 守护进程统一管理分为5 个独立 bufferAndroid 4.1+ 普通应用只能看自己的日志Buffer 满会自动覆盖。
2026-08-09 20:13:09
128
原创 Android 真机连接的详细配置(USB调试 / WiFi / IP)
Android真机连接Profiler配置:1. 三种方式:├── USB:最稳最准,首选★├── WiFi:无线,手持测试用└── IP直连:手动输IP,特殊网络2. 前置(所有方式必做):├── 关于手机→点版本号7次→开发者选项├── 开发者选项→开启USB调试└── 品牌特殊开关(USB安装/ADB安全设置)3. USB连接:数据线连接(非充电线)→手机弹框授权"允许"→选USB传文件模式→adb devices验证(显示device)→。
2026-08-09 14:09:48
204
原创 Unity性能优化:Hierarchy视图全解析
CPU Hierarchy 定位瓶颈:1. 视图本质:按调用层级聚合成树,同名合并定位CPU瓶颈的主战场2. 各列含义:├── Total:含子调用总耗时%├── Self:自身耗时%(不含子)★├── Calls:调用次数├── GC Alloc:分配的堆内存★└── Time/Self ms:毫秒3. Total vs Self(核心)★:├── Total高Self低 → 耗时在子调用,展开继续找├── Total高Self也高 → 这函数自己慢,找到瓶颈了。
2026-08-09 03:02:59
233
原创 Unity Profiler全解析:性能优化必看
Profiler界面展示的内容:1. 三大区域:├── ①顶部工具栏:录制/连接目标/DeepProfile/帧导航├── ②模块图表区:左模块列表+右时间轴曲线(每列一帧)└── ③详情区:选中帧的详细分解(随模块变化)2. 图表区看点:├── 横轴=帧,纵轴=数值├── 尖峰=卡顿帧(重点排查)★├── 颜色分层=各类耗时占比└── 点某帧→白线标记→详情区展开3. CPU详情区(最核心):├── Hierarchy视图:函数层级树。
2026-08-09 02:26:58
171
原创 Unity 性能分析工具全面指南
(内置)—— 基础必备(内置)—— 渲染分析(Package)—— 内存分析(Package)—— 数据对比RenderDoc—— GPU 帧调试神器。
2026-08-08 23:44:21
133
原创 Unity性能优化全攻略:CPU到GPU的极致提速
1. 测量 → 定位瓶颈(Profiler)2. 分析 → 判断 CPU/GPU/内存/IO3. 优化 → 有针对性处理4. 验证 → 真机对比数据5. 迭代 → 循环改进🎯优化的核心先真机测量,再针对性优化,避免过早优化。
2026-08-08 23:24:40
168
原创 Unity为何硬编码jar:file://前缀?
问题答案谁加的?Unity 引擎的 C++ 层,在的 Android 实现中硬编码添加来源规范?Java 官方的 JAR URL Scheme(RFC 定义)为什么加?① 遵循 Java/Android 生态规范 ② 明确"这不是普通路径"的语义 ③ 让 Unity 内部协议分发器能识别处理方式能不能不加?技术上可以,但会造成语义混乱、API 无法自动分发、生态不兼容。
2026-08-08 22:54:54
10
原创 Android APK路径为何如此奇怪?深度解析
开头的路径 = “这不是一个普通的文件路径,而是一个指向 APK 压缩包内部某个文件的特殊 URI”,只有理解 JAR 协议的 API(比如 UnityWebRequest)才能读取它。理解了这个,你就能明白为什么 Android 上读取 StreamingAssets 需要用特殊方式了 😊。
2026-08-08 22:11:24
158
原创 Unity StreamingAssets完全指南
A: APK 是压缩包,文件不在真实文件系统中,必须用 UnityWebRequest。Android 上的 StreamingAssets 位于 APK 压缩包内,A: 不会,原样保留,容易被解包查看,不要放敏感内容。是 Unity 中一个特殊的文件夹,位于。A: 不会,Unity 不会识别里面的资源。由于 StreamingAssets。读取(热更后的资源),若无则回退到。
2026-08-08 20:00:56
180
空空如也
it界所谓的35岁门槛
2025-07-03
5年Unity引擎游戏客户端月薪统计
2025-06-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅