Unity血条制作全指南:从Slider到FillAmount与性能优化
很多新人在做Unity血条的时候第一个想法都是“拖一个Slider然后把value绑到血量上”但等真正接到项目里才发现问题远比想象的多血条更新不及时、换装备后属性乱跳、Boss战时同屏几十根血条直接掉帧、伤害飘字和血条不同步……这篇东西就把我做血条这几年踩过的坑和最终沉淀下来的方案一次性讲清楚。1. 血条方案选型Slider、FillAmount还是自定义网格1.1 Slider不是为展示设计的先别急着用Slider。Slider在Unity里本质上是交互组件它自带Handle、Background、FillArea这些子物体结构设计目标是为了让玩家拖动一个数值而不是为了展示一个状态。用Slider做血条最明显的三个问题结构冗余。一个Slider默认会创建好几个子物体每一层都参与Canvas合批计算血条数量一多DrawCall和重建开销立刻上来。定位困难。血条左侧固定、右侧收缩这种常见表现Slider做起来非常别扭你得改Fill的锚点和Pivot稍微一个不小心填充方向就反了。过度设计。Slider的交互事件完全没有被用到却白白背了全套交互组件的开销。我之前接过一个项目里面所有怪物血条都是Slider同屏七八十个血条时Profile一开UI Mesh重建占了CPU时间将近三分之一问题就出在Slider那一堆层级上。后来我们把所有血条换成纯Image之后重建耗时直接降了一个数量级。1.2 FillAmount的裁剪原理与灵活度真正适合做血条的其实是Image组件的FillAmount属性。它用起来简单但很多人不知道它背后的裁剪原理。FillAmount的实现基于Canvas的扇形网格填充。当你把一个Image的Type设置为FilledUnity会把它当做一个扇形来处理Amount从0到1表示扇形从起始角度到结束角度的覆盖范围。可以选Horizontal、Vertical、Radial90、Radial180、Radial360几种填充方式。这个机制的关键在于填充变化时被裁剪掉的部分不参与绘制GPU不会为看不见的像素买单。这就比用RectMask2D裁剪或者用额外的遮罩材质要高效很多。实操里的核心设置是这四步Image Type选择FilledFill Method选择HorizontalFill Origin选择LeftFillAmount由代码控制这样得到的血条左边固定、右边收缩是最常用的表现方式。1.3 分段血条与网格切割什么时候才需要动自定义网格FillAmount能覆盖80%的血条需求但有一种情况它束手无策分段血条。比如一格一格的血量角色掉血后一格一格消失或者末段有一格是高亮警告状态。这种情况通常有两种做法。第一种是九宫格循环用水平布局组件HorizontalLayoutGroup挂上N个Image每格之间设置间距和间隔。代码里根据血量百分比计算显示多少格用Mathf.CeilToInt向上取整算出应该亮哪些格子然后隐藏其他格子。int visibleCells Mathf.CeilToInt(currentHp / maxHp * totalCells); for (int i 0; i totalCells; i) { cellImages[i].enabled i visibleCells; }要注意的是频繁启停Image的enabled会触发Canvas重建所以这种方案只适合血量变化不剧烈的场景或者用CanvasGroup的alpha值配合整体控制。第二种是自定义网格自己写一个Graphic子类覆写OnPopulateMesh把血条的边框、底色、填充色、还有内部的警告条纹全部画在一个网格里。这是性能最好的方案但代码量也最大一般用于需要花哨表现比如边缘发光、动态裂纹且同屏数量多的场景。1.4 我的选型结论方案表现力性能开发成本推荐场景Slider中较差最低临时Demo、原型验证Image FillAmount中优秀低90%的常规血条网格分割布局较高尚可中一格一格的血量条自定义Mesh最高最高高高端表现、同屏大量血条我的实际建议是默认使用Image Filled方案然后把血条的填充颜色、背景边框、渐变贴图做到两个独立Image里——一个是底条不参与FillAmount一个是填充条参与FillAmount。这样既能灵活控制表现又不用为每个血条付出过高的性能代价。2. 数据层解耦让血条被动响应而不是主动查询2.1 Update轮询为什么是万恶之源刚入行的时候我写的血条是这样的void Update() { hpBar.fillAmount player.hp / player.maxHp; }这个写法在单机Demo里没问题但到了真正的项目里就是灾难。原因有三层。第一每一帧都在赋值但血量九十帧里可能只变一次。赋值本身不是大开销但它会让Image的填充网格标记为脏触发Canvas顶点重建。哪怕数值没变你还是白白重建了。第二血条和角色逻辑强耦合。血条需要持有player引用如果角色被销毁血条还得判空逻辑一多就乱。第三多来源更新时顺序不可控。比如角色受到了治疗和伤害同时发生两套代码都在写fillAmount最后谁生效完全看执行顺序这给Bug埋了雷。正确的思路是事件驱动。血条根本不主动去问你现在多少血而是等着有人告诉它血变了。2.2 事件驱动的最小实现在角色这边定义一个带参数的事件。我用的是C#的event关键字搭配一个结构体传变化信息public struct HealthChangeInfo { public float CurrentHp; public float MaxHp; public int Delta; // 变化量正数加血负数扣血 public bool IsCritical; // 是否暴击/是否大额伤害 public Vector3 HitPoint; // 受击位置可以用来触发飘字 } public class HealthComponent : MonoBehaviour { public event ActionHealthChangeInfo OnHealthChanged; public void TakeDamage(int amount, bool isCritical false, Vector3 hitPoint default) { hp - amount; OnHealthChanged?.Invoke(new HealthChangeInfo { CurrentHp hp, MaxHp maxHp, Delta -amount, IsCritical isCritical, HitPoint hitPoint }); } }血条这边只需要在Start里订阅这个事件void Start() { health.OnHealthChanged HandleHealthChanged; } void HandleHealthChanged(HealthChangeInfo info) { SetHp(info.CurrentHp / info.MaxHp); }这样血条不关心血量是怎么变的只负责收到消息以后做表现。伤害系统、治疗系统、场景里的机关扣血只要调TakeDamage所有监听者自动同步。后面再接伤害飘字、屏幕震动、音效都往同一个事件上挂就行。2.3 延迟白条动画分段的算法设计很多游戏里血条是两段的后半段是白色或半透明的延迟条角色掉血之后白条缓慢跟上。这个表现的核心价值是让玩家直观感知这次掉了多少血以及大概几秒能回复到危险线以下。实现思路也不复杂我在血条组件里放了两个Imagepublic Image whiteBar; // 延迟白条放在底层 public Image redBar; // 即时红条放在上层 float displayHp 1f; float targetHp 1f; float whiteHp 1f; float lerpSpeed 2f; void Update() { // 红条立即追目标 displayHp Mathf.MoveTowards(displayHp, targetHp, Time.deltaTime * 8f); redBar.fillAmount displayHp; // 白条缓慢追上红条只有红条落后的时候才移动 if (whiteHp - displayHp 0.001f) { whiteHp Mathf.MoveTowards(whiteHp, displayHp, Time.deltaTime * lerpSpeed); whiteBar.fillAmount whiteHp; } else { whiteBar.fillAmount displayHp; } }MoveTowards和Lerp的区别要讲清楚MoveTowards是匀速移动Lerp是减速接近。我实际项目中掉血的跟手感和回血的跟手感完全不同掉血条要快、要果断所以用匀速回血白条要快、要线性也用的MoveTowards但速度不一样。如果是Boss战那种缓慢腐蚀的毒雾效果才改用Lerp模拟开始时快、接近时慢的粘滞感。2.4 事件里携带什么数据很多教程教人只用百分比做事件参数比如OnHealthChanged(float percent)。实际项目里这不够用原因很简单飘字需要具体数值闪白需要知道是否暴击死亡场景需要知道剩余血量是否归零。所以我建议在事件里传完整信息而不是只传百分比也就是上面那个HealthChangeInfo结构体。每一次变化只触发一次事件所有表现层共享这次事件的数据。你不需要为飘字单独写一个OnDamageNumber事件也不需要为闪白再写一个OnHitFlash事件一个事件走天下。如果担心结构体每次Invoke会产生GC可以改用带参委托配合类池但对血条这种低频事件一秒最多不超过十几次结构体传递完全够用别过早优化。3. 状态联动闪白、伤害飘字与死亡归零3.1 受击闪白的双重触发原理血条变化的同时通常会配一个受击闪白效果让玩家在被攻击的瞬间看到视觉冲击。实现上有两个层级的做法。第一个层级是整个血条闪白把血条根节点的CanvasGroup的alpha瞬间调到0.2再调回1配合稍微的位移晃动。这段我用协程写因为要精确控制时间线IEnumerator FlashBar() { rect.anchoredPosition new Vector2(4f, 0f); canvasGroup.alpha 0.4f; yield return new WaitForSeconds(0.06f); rect.anchoredPosition Vector2.zero; canvasGroup.alpha 1f; }第二个层级是填充条颜色的高光脉冲从亮白色向正常颜色回弹。这个用协程或者Tween都行我推荐Tween库做省去手动写插值循环。真实项目里闪白不能只用一次原因在于不同伤害类型要给不同反馈。普通伤害闪白暴击要闪红轻微屏幕抖动毒伤是绿色脉冲。如果只用血条组件一个协程冲突会非常混乱。我的做法是做一个HitFlashController持有多个协程槽每种状态互不干扰。3.2 同一事件驱动飘字与屏幕震动前面的事件设计在这里就体现出威力了。伤害飘字只需要监听OnHealthChanged检查Delta 0之后生成一个飘字文本。飘字的初始位置可以用info.HitPoint通过Camera.WorldToScreenPoint转成屏幕坐标也可以直接用血条锚点作为基准点。一个我被坑了很久的点飘字不要挂在角色层级下也不要挂在血条层级下。因为两者都可能被整个销毁或者SetActive(false)飘字会跟着消失。飘字应该挂在一个常驻的Overlay Canvas下由独立的UIManager管理。屏幕震动同理。监听同一个事件比较Mathf.Abs(info.Delta)和info.IsCritical震动力度和时长由事件参数决定不需要额外写一个接口去查伤害值。这样设计的好处是伤害流程里你只需要调一次TakeDamage剩下的飘字、闪白、震动、音效全部自动响应。不会出现飘字调用了但震动没触发这种同步性问题。3.3 死亡时血条不要立刻消失刚开始做血条很多人血量归零就把血条直接隐藏这是体验上的一个失误。玩家需要一个确认它死了的感知过程尤其是Boss、精英怪这类重要单位。我常用的死亡表现是三步红条瞬间归零白条缓慢跟随至归零这个过程大约0.5秒。血条整体变灰比如把颜色改成灰色调表示单位已经死亡。延迟0.8到1.2秒后整体淡出再交给对象池回收。死亡状态在事件里已经携带了info.CurrentHp 0就是条件。需要额外注意死亡后应该取消后续的所有动画协程否则可能出现角色死了血条还闪白的诡异表现。还有一个跟死亡相关的常见Bug单位销毁时血条还挂在场上。解决方法是血条组件在OnDestroy时主动取消订阅事件void OnDestroy() { if (health ! null) { health.OnHealthChanged - HandleHealthChanged; } }这个问题在Unity里很隐蔽——如果你用的事件发布者HealthComponent先销毁血条后销毁血条里调用health时不会报错但会拿到一个已经Destroy的实例引用此时取消订阅不会执行。更稳妥的写法是在HealthComponent的OnDestroy里把事件清空由发布者兜底。4. 世界空间血条跟随单位移动的三个关键细节4.1 世界空间Canvas与屏幕HUD的取舍怪物血条、NPC血条一般用世界空间Canvas来做好处是可以跟随角色一起移动、旋转、缩放天然贴合游戏世界。但世界空间Canvas有个性能问题它每次位置变化都会触发Canvas重建。所以怪物血条一定要独立分层不要和UI主界面混在同一个Canvas里。具体做法是创建一个专门的WorldSpaceCanvas使用ScreenSpace - Camera还是World Space模式取决于你的项目。如果是URP管线注意这个Canvas的EventCamera设置不设置的话鼠标事件穿模。同屏数量超过50个血条时我建议考虑屏幕空间HUD方案所有血条仍放在一个ScreenSpaceCanvas下用Camera.WorldToScreenPoint把角色脚下位置投影到屏幕坐标每帧更新血条的anchoredPosition。这个方案绕开了世界空间Canvas的层级变换开销但代价是代码复杂度和一些边缘情况角色出屏幕时投影坐标会反。实际项目里我的经验是10到20个血条用世界空间Canvas没问题超过这个量切屏幕空间方案。4.2 Billboard朝向处理LookAt的坑世界空间血条需要始终面向摄像机新手最常见的写法是hpBar.transform.LookAt(Camera.main.transform);这个写法在大多数情况下会歪。原因是LookAt会把物体的Z轴朝向目标然后如果血条本身的正面指向Z轴那就没问题。可如果你的血条是画在XY平面上的Unity UI默认正面是Z轴正方向那LookAt之后血条确实正对相机但旋转过程中血条的Y轴不再朝上整体会歪斜。正确的Billboard做法是只修正Y轴旋转忽略俯仰角Vector3 dir Camera.main.transform.position - hpBar.position; dir.y 0f; hpBar.rotation Quaternion.LookRotation(dir);这样血条始终正对相机但保持在水平面上不会因为相机抬头或低头而翻转。如果你的游戏视角俯仰角很大比如俯视角可以不做dir.y 0f这一步改成完全朝向相机。还有一个容易忽略的细节血条不要放在角色的根节点下而是放到角色头顶偏前方的独立节点。否则角色转身时血条也会跟着转做朝向处理时会有额外误差。4.3 距离缩放与动态显隐远距离的怪物血条也会正常显示这既是性能浪费也是遮挡问题。我常用的规则是距离小于showRange比如15米时显示血条距离大于hideRange时隐藏血条且立刻禁用CanvasGroup的raycastTarget中间区间用距离做缩放距离越远血条越小缩放的具体实现是给血条根节点挂一个ScaleFactor脚本在Update里根据Vector3.Distance设置transform.localScale。注意不要直接设置lossyScale那会影响子物体。还有一个特效处理血条边缘到屏幕边缘时做一个简单的吸附偏移让血条始终在屏幕内而不是被半截裁掉。用Camera.WorldToScreenPoint算出来屏幕坐标后用Mathf.Clamp限定在安全区内即可。5. 性能红线合批、对象池与GC控制5.1 Canvas合批是血条性能的核心很多人不知道Unity UI的DrawCall不是跟Image数量直接对应的而是跟Canvas重建批次对应。同一Canvas下如果相邻UI元素的贴图可以合进同一张图集就会进入同一个批次。血条资源如果用图集管理同屏50根血条可以只占2到3个DrawCall。真正的性能杀手是重构。任何UI元素的尺寸、位置、旋转、颜色、填充值发生变化都可能导致它整个Canvas重新生成网格。这跟显卡绘制是两回事CPU上的工作量非常大。实际表现是如果50根血条每帧都在更新FillAmountCanvas每一帧都在重建。优化方案有两种思路。第一种是把血条按刷新频率分层。比如把底条、边框这些几乎不变的元素放在一个固定Canvas下把填充条放到另一个Canvas下。这样填充条频繁变化时只有那个Canvas在重建底条和边框的网格完全复用。第二种是减少更新频率。血量并不是每帧都在变血条不需要每帧刷新。实测中我把血条更新频率限制在每秒10次玩家肉眼几乎察觉不到差异但UI重建量直接降到原本的十分之一float nextUpdateTime; void LateUpdate() { if (Time.time nextUpdateTime) return; nextUpdateTime Time.time 0.1f; // 每0.1秒刷新一次 ApplyHpBar(); }这在Boss战大量血条同时受击的场景里收益非常明显。5.2 血条对象池的必要性游戏里怪物会不停地生成和死亡血条也是。如果每次生成怪物都实例化一套血条UI会产生大量GC和Canvas初始化开销。正确做法是做一个简单的对象池。QueueHpBarRoot pool new QueueHpBarRoot(); public HpBarRoot Get() { if (pool.Count 0) { var bar pool.Dequeue(); bar.gameObject.SetActive(true); return bar; } return CreateNewBar(); } public void Recycle(HpBarRoot bar) { bar.ResetBar(); bar.gameObject.SetActive(false); pool.Enqueue(bar); }这里有两个必须注意的点第一血条对象池不要和怪物对象池混用因为血条的层级归属不一样塞到一起会让层级管理混乱第二回收时一定要调用ResetBar把FillAmount复位到满值、颜色复位、所有协程停止否则下一只怪物头上会出现上一只的血条残留。5.3 伤害数字的GC灾难血条做得再好如果伤害飘字系统做得烂整体体验照样拉胯。最常见的问题是伤害数字的字符串拼接产生大量临时字符串触发频繁GC。我早期写过的烂代码numberText.text damage.ToString() 点伤害;这个写法每一行都会ToString分配一个字符串再拼一个新字符串又触发一次分配然后事件还带着这个字符串被到处传递。在海量飘字场景下一秒钟几百次伤害GC压力爆炸。正确做法有几种用Unity的TextMeshPro它自带字符缓存机制。预设几个预格式化字符串槽位通过string.Format也不够最稳的是用StringBuilder复用。数字如果变化范围有限比如伤害最多万元以内可以直接用查表法把1万以内每个数字的字符串预存好。最简单的方案是还是规规矩矩用池化复写var sb new StringBuilder(16); sb.Clear(); sb.Append(damage); sb.Append(!); numberText.SetText(sb);配合TMP的SetText这个路径不会产生新的GC分配。5.4 用Profile定位血条性能瓶颈如果做完以上优化仍然觉得卡不要靠猜用Unity Profiler。重点看Canvas.SendWillRenderCanvases和Canvas.BuildBatch这两个耗时项。具体操作步骤是打开Profiler选择CPU Usage模块。进入游戏压满屏幕上血条数量。观察UI模块下的Canvas.SendWillRenderCanvases耗时。如果耗时高点进Hierarchy面板定位具体是哪个Canvas在重建。我遇到过一个奇怪的情况血条本身不卡但每次有怪物生成时掉帧。最后查出来是血条对象池里的血条实例化了过多的Image组件初始化时机集中在同一帧。解决办法就是对象池预加载在游戏加载阶段把常用的血条预先实例化好而不是等需要时现创建。血条这种东西看起来简单但越是高频复用的UI组件越考究设计。我现在的习惯是项目一开始就建好一套HealthBarBase的抽象基类把事件订阅、对象池回收、性能刷新策略都封装在基类里。后续接新游戏模块只需要继承这个基类改改表现层就够了数据层几乎不需要再动。这样开发效率高也不会在项目后期为了血条性能去返工。

相关新闻

Chaste细胞群体动力学仿真实操:从项目搭建到结果可视化

Chaste细胞群体动力学仿真实操:从项目搭建到结果可视化

上一篇文章讲完 Chaste 的安装和基础概念,后台不少同行留言说:环境装好了,可真正打开一个仿真项目时还是很懵,不知道从哪里下手。这篇我就把自己用 Chaste 跑细胞群体动力学仿真的完整操作路径梳理一遍,从项目结构到核…

2026/10/18 22:46:51 阅读更多 →
Python技术报告:多端协同与全局记忆架构的实现路径

Python技术报告:多端协同与全局记忆架构的实现路径

随着人工智能技术的快速发展,智能体(Agent)在办公场景中的应用日益广泛。然而,当前跨系统数据协同的使用率仅为14.3%,远低于B端用户对其长期价值的预期。本报告深入探讨多端协同与全局记忆成为重要趋势的背景&#xff…

2026/10/18 22:46:51 阅读更多 →
数据结构——选择排序

数据结构——选择排序

1. 引言 上篇博客我们聊了插入排序,那种像打扑克牌一样,把新牌一张张插到合适位置的感觉,相信大家还记忆犹新。今天,我们换个思路,来聊聊另一种同样经典的基础排序算法——选择排序。 如果说插入排序是"边摸牌边整…

2026/10/18 22:46:51 阅读更多 →

最新新闻

artcraft 项目实战:从零搭建创意工具的技术选型与核心模块拆解

artcraft 项目实战:从零搭建创意工具的技术选型与核心模块拆解

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是“艺术”加“手艺”的组合词。直觉告诉我,这不是一个纯技术框架的名字,也不是某个具体产品的品牌名,它…

2026/10/19 0:24:02 阅读更多 →
前端登录密码加密实战:RSA-OAEP与Web Crypto API全解析

前端登录密码加密实战:RSA-OAEP与Web Crypto API全解析

这是一个几乎所有前端开发都绕不开的需求:登录页的密码加密。我自己刚工作那会儿接手过一个老系统,接口直接把明文密码放在请求体里,当时觉得“内网没事”,结果有一次在公共Wi-Fi环境下联调,抓包一看,密码完…

2026/10/19 0:24:02 阅读更多 →
Flutter HitTestBehavior 深度解析:从点击穿透到手势竞技场

Flutter HitTestBehavior 深度解析:从点击穿透到手势竞技场

1. 从一个点击穿透的诡异 Bug 说起做过 Flutter 开发的朋友大概率都遇到过这种场景:你在一个Stack里叠了两层 Widget,上面那层是个半透明的遮罩或者一个带GestureDetector的容器,下面那层是个按钮。你满心以为点击遮罩的时候事件会被遮罩吃掉…

2026/10/19 0:24:01 阅读更多 →
Java Swing飞翔的小鸟游戏实战:课设高分与完整源码解析

Java Swing飞翔的小鸟游戏实战:课设高分与完整源码解析

简介:飞翔的小鸟游戏Java实现源码及配套详细教程,面向Java初学者与需要完成期末大作业、课程设计或毕业设计的学生,提供一套可直接运行、便于二次开发的完整小游戏项目,个人手打九十八分并获导师认可。资源共四十五个文件&#xf…

2026/10/19 0:23:01 阅读更多 →
中文教育场景下的AIGC检测:原理、应用与教师实操指南

中文教育场景下的AIGC检测:原理、应用与教师实操指南

1. 从“AI代写泛滥”到“检测刚需”:中文教育场景的需求拆解一个学期末,某高校的A老师连续收到三篇“风格突变”的课程论文。第一篇措辞工整但缺乏个人视角,第二篇引用了大量教材原文却没有任何延伸思考,第三篇连标点符号都规范得…

2026/10/19 0:23:01 阅读更多 →
Spring Boot单体商城源码:从扣库存到JWT鉴权的电商后端实战解析

Spring Boot单体商城源码:从扣库存到JWT鉴权的电商后端实战解析

简介:面向Java中高级开发者与商城系统学习者的单商户商城小程序项目源码包,基于Spring Boot、MyBatis、Thymeleaf、Redis及Maven构建,并融入微服务拆分、小程序接口对接、数据库设计、OAuth2安全认证、Docker部署与监控测试等电商开发核心知识…

2026/10/19 0:23:01 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →