React Native 鸿蒙化图片性能优化:解码策略与缓存机制实战
先聊一个很多团队踩过的坑把 React Native 应用从 Android/iOS 平移到 OpenHarmony 后功能都正常跑起来了但图片一多、列表一长滑动就开始掉帧内存也跟着往上飙。很多人第一反应是“OpenHarmony 的 Image 组件性能不行”但实际上问题往往出在 RN 适配层对 OpenHarmony 图片解码管线的使用方式上。Image 组件本身并不是简单的“显示图片”它背后牵扯到数据源加载、解码策略、缓存命中、渲染合成每一环都可能成为瓶颈。这篇文章我从实际调优项目出发围绕 React Native for OpenHarmony 生态里 Image 组件的加载、渲染与性能优化拆解整个调用链路并给出可落地的缓存方案、解码参数配置和内存管理策略适合正打算做 RN 应用鸿蒙化适配的开发者参考。先说结论RN 在 OpenHarmony 上跑图片性能天花板不在 CPU 也不在 GPU而在解码策略和缓存命中率。只要能绕开“重复解码”和“全尺寸解码”这两个坑大部分卡顿问题可以解决。下面我按从现象到原理再到实操的顺序把整条链路讲清楚。1. 先从一次实测说起同一套代码Android 流畅OpenHarmony 卡顿1.1 具体现象与初步排查之前做一个跨平台应用适配用的 React Native 0.72 版本OpenHarmony 侧通过 RN for OpenHarmony 的桥接层跑起来。功能层面没大问题但做性能测试时发现一个双列瀑布流页面每张卡片带有一张网络图片Android 端滑动帧率稳定在 55~60fpsOpenHarmony 端只能跑到 25~30fps偶尔会出现图片加载时列表明显卡顿的情况。一开始怀疑是 OpenHarmony 的列表组件 Recycler 性能问题于是单独做了一个纯色块的列表测试滑动帧率可以到 55fps 以上。这就排除了列表渲染自身的问题。接着用 DevEco Studio 自带的 profiler 抓取调用栈发现每次 Image 组件收到新的 source 后都会触发一次完整的解码流程。在快速滑动场景下图片源不断切换解码任务不断堆积UI 线程忙于等待解码结果帧率自然就掉下来了。这里需要说明一个背景React Native 侧的 Image 组件在 Android 上使用的是 Fresco 图片加载库它有完善的三级缓存内存、磁盘、网络和解码复用机制。而在 OpenHarmony 适配层多数实现是直接调用系统的 Image 组件能力系统组件本身有解码能力但缓存策略相对简单尤其是对“同一个 uri 在不同尺寸下重复解码”这个场景几乎没有做优化。1.2 问题根因定位通过 dump 内存和解码任务队列发现瓶颈集中在三点图片源切换时没有命中任何内存缓存每次都走完整解码链路。解码使用了默认的原始图片尺寸而不是目标渲染尺寸。一张 1200x1600 的原图就算只显示在 200x200 的卡片上解码后的位图仍然是 1200x1600内存占用高解码耗时长。解码任务没有放到独立线程池而是直接在主线程串行执行导致 UI 渲染被阻塞。这三个问题相互叠加才有了上面看到的 200ms 以上的图片加载耗时。这里的核心矛盾是React Native 的图片抽象层对上层暴露的是统一的 source 和尺寸参数但它没法感知到 OpenHarmony 系统组件内部的解码时机和缓存行为所以必须在适配层做一次“翻译”和“增强”。2. 图像加载链路全拆解从 source 到屏幕像素中间发生了什么2.1 RN 侧 Image 组件的工作机制在 React Native 中Image 组件本质上是一个声明式的描述给定 sourceuri 或本地资源、style宽度、高度、缩放模式等参数框架负责把这张图片显示到屏幕上。在原生侧RN 的 Image 系统需要做几件事根据 uri 发起网络请求、拿到图片数据后进行解码、将解码后的位图交给渲染层合成、最后上屏。Android 的 Fresco 之所以性能好是因为它把“网络请求”“磁盘缓存”“内存缓存”“解码”全部分层而且每层都有独立的线程池和内存管理。RN for OpenHarmony 的适配层如果只是简单地把 Image 映射到 OpenHarmony 的 Image 组件那意味着解码行为完全由系统组件内部决定RN 侧对缓存、解码时机、内存回收失去控制。这种“黑盒”方式在简单场景下问题不大但在高性能要求的列表页里就会成为短板。2.2 OpenHarmony Image 组件的解码管线OpenHarmony 的 Image 组件基于系统的图片解码框架原生支持 JPEG、PNG、WebP、GIF 等常见格式。它的完整流程可以简化为三个阶段数据加载通过 ImageSource 从网络、文件或资源管理器获取原始字节流。解码将压缩的图片数据解码为位图PixelMap这一步是最耗时的环节尤其是大尺寸图片。渲染上屏把 PixelMap 传给渲染节点经过合成器处理后显示到屏幕上。重点在第二步解码过程的耗时和内存占用跟图片的原始分辨率强相关。一张 2K 图片约 2000x2000解码后的 PixelMap 在 RGBA_8888 格式下占用内存约为 2000x2000x4 16MB但解码过程中还有中间缓冲实际峰值可能到 60MB 甚至更高。如果不加干预系统组件会按原图分辨率解码导致大量内存浪费。2.3 为什么需要在 RN 适配层做增强OpenHarmony 系统 Image 组件本身有内存缓存机制但触发时机不可控而且不同版本、不同设备的实现差异较大。更关键的是它是面向系统级应用的并不了解 RN 的业务场景比如“同一个 uri 在列表复用时会反复出现”“图片可能需要在不同尺寸下渲染”这些特点。所以RN 适配层需要做的是在 RN 和系统 Image 组件之间增加一层“智能调度”负责缓存管理、解码参数控制、并发调度。这也是我下面要讲的 CacheImage 封装的核心思路。3. CacheImage 缓存封装如何用 LRU 策略解决 90% 的重复解码3.1 设计目标与整体架构我的目标很明确让每个出现过的图片 uri在内存热期尽可能只解码一次。同一个 uri 在同一个尺寸下再次出现时直接复用缓存的 PixelMap在不同尺寸下出现时触发一次针对新尺寸的解码但保留旧尺寸的缓存结果。这里没有用复杂的磁盘缓存原因有两个一是网络图片的磁盘缓存对解码耗时没有帮助它省掉的只是网络请求二是 OpenHarmony 的内存资源本来就吃紧磁盘缓存会增加 IO 调度复杂度。对于列表这种高频复用场景内存缓存收益最直接。封装后的组件叫 CacheImage对外 API 保持和 RN Image 一致内部增加了缓存查找、缓存更新、并发控制三条逻辑。整体架构可以概括为一个 LRU 缓存容器 一个任务调度器 一个内存监控器。3.2 LRU 缓存 Key 的生成策略缓存 key 的设计是核心中的核心。太简单会误命中太复杂会降低命中率。我的方案是用以下几个字段拼接source uri去掉 query 部分中的时间戳等动态参数避免 key 不稳定。渲染目标宽度由 style 中的 width 和像素密度折算而来。渲染目标高度。resizeModecontain、cover、stretch 等不同模式会导致不同的显示效果不能共用缓存。举个例子const cacheKey ${uri}_${targetWidth}x${targetHeight}_${resizeMode};这样设计的好处是同一个 uri 在列表的不同卡片上如果尺寸不同会命中不同的缓存项如果尺寸相同则直接复用。在瀑布流双列场景里同一张图可能会在宽度相同的两个卡片中出现这个 key 策略能让命中率最大化。实践中需要注意一个细节React Native 的 style 中的 width/height 是逻辑像素需要乘以像素密度系数才能得到物理像素。不同设备的 density 不同如果直接用逻辑像素做 key在不同设备上解码尺寸就不准了。3.3 LRU 淘汰策略与容量控制LRU 缓存最核心的机制是当缓存容量满了优先淘汰最久未被使用的项。我用的容量指标不是“张数”而是“总字节数”因为不同尺寸的位图内存差异太大按张数限制不可靠。默认配置是最大缓存字节数为设备可用内存的 20%最大缓存张数为 200。两个条件同时生效谁先触发就执行谁。每次解码完成需要把新缓存的字节数累加到计数器上。如果总字节数超过阈值就触发一次性清理从最久未使用的项开始逐出直到总字节数回落到阈值的 80%。这里留下 20% 的缓冲区间是为了避免频繁触发清理动作。实现上我用的是双向链表加哈希表的标准组合保证 get 和 put 操作的时间复杂度都在 O(1)。4. 解码参数调优decodeWidth 和 decodeHeight 到底该怎么设置4.1 这两个参数的原理和效果OpenHarmony 的 Image 组件提供了 decodeWidth 和 decodeHeight 两个属性作用是指定解码后的目标尺寸。它可以理解为“采样解码”解码器会按这个尺寸读取像素数据而不是先解出全尺寸再压缩。这对性能的影响是决定性的。还拿刚才那张 1200x1600 的图举例如果卡片显示区域只有 200x200设置 decodeWidth200、decodeHeight200 后解码后的位图内存从约 7.3MB1200x1600x4降到约 0.16MB200x200x4降幅超过 97%。解码耗时也会明显缩短因为需要处理的像素总量少了。在 CacheImage 内部我拿到 RN 侧传入的 style 宽高后会先计算目标尺寸再把这个尺寸传给系统 Image 组件的 decodeWidth/decodeHeight。如果目标尺寸是等比缩放模式contain/cover还需要根据图片原始宽高比计算出实际解码尺寸避免因为宽高比不同导致显示变形。4.2 不同 resizeMode 的尺寸计算RN Image 的 resizeMode 有 cover、contain、stretch、center 等几种。它们的解码尺寸计算逻辑不同stretch直接使用目标宽高因为图片会被拉伸填满整个区域。cover目标是覆盖整个显示区域需要按显示区域宽高比和图片原始宽高比取较大的缩放比例然后计算出实际的解码宽高。contain目标是完整显示图片需要按比例缩放到能容纳在显示区域内取较小的缩放比例。center不缩放但如果图片原始尺寸极大仍然要限制解码尺寸防止 OOM。我在适配层里维护了一个图片原始尺寸查询接口首次加载时把图片的宽高信息缓存下来。这样后续计算就不需要每次重新解析图片头部信息节省了一次 IO 操作。4.3 源码片段参考下面给出 CacheImage 中计算解码参数的简化版本function getDecodeSize( originalWidth: number, originalHeight: number, viewWidth: number, viewHeight: number, resizeMode: string ): { decodeWidth: number; decodeHeight: number } { const widthRatio viewWidth / originalWidth; const heightRatio viewHeight / originalHeight; if (resizeMode stretch) { return { decodeWidth: viewWidth, decodeHeight: viewHeight }; } if (resizeMode cover) { const scale Math.max(widthRatio, heightRatio); return { decodeWidth: Math.round(originalWidth * scale), decodeHeight: Math.round(originalHeight * scale), }; } if (resizeMode contain) { const scale Math.min(widthRatio, heightRatio); return { decodeWidth: Math.round(originalWidth * scale), decodeHeight: Math.round(originalHeight * scale), }; } return { decodeWidth: viewWidth, decodeHeight: viewHeight }; }这个函数的边界情况要注意当 viewWidth 或 viewHeight 为 0 时需要回退到图片原始尺寸否则解码出来是 0 大小的图。5. 并行解码用 taskpool 把耗时的解码任务挪出 UI 线程5.1 为什么不能在主线程解码OpenHarmony 的 UI 线程负责布局、渲染和事件响应任何耗时任务堆在主线程都会直接表现为卡顿。图片解码是一个典型的 CPU 密集型任务一张 1080p 图片的解码耗时在几十到几百毫秒不等如果主线程上有多个解码任务排队用户滑动列表时的体验会非常糟糕。系统 Image 组件在加载本地资源时内部有异步解码机制但对网络图片源如果没有外部调度很容易退化为同步加载。我在适配层里强制使用 taskpool 来做统一调度。5.2 解码任务的调度设计我的调度逻辑分为几步当 Image 组件挂载或 source 变化时先查缓存命中则直接渲染不进入任务池。缓存未命中时向 taskpool 提交一个解码任务。解码任务内部先启动网络下载如果图片不在本地拿到完整字节流后执行解码。解码完成后通过回调把 PixelMap 传回 UI 线程同时写入 LRU 缓存。如果任务提交时组件已经卸载通过一个 token 机制取消回调通知避免野指针或内存泄漏。这里有个经验之谈网络下载本身也是耗时操作如果把它和解码混在同一个任务里单次任务时长就会过长。我倾向于把下载和解码拆成两个阶段但都在 taskpool 的独立任务里执行这样网络 IO 和 CPU 解码不会互相阻塞。5.3 任务并发上限与优先级taskpool 支持设置任务并发数上限。我不建议无脑拉满并发因为 OpenHarmony 设备的 CPU 核数有限解码任务并行过多反而会造成资源竞争。我通常设置并发数为 CPU 核数减 1保留一个核给 UI 线程和渲染线程。另外首屏可见区域的图片解码优先级要高于列表底部不可见区域的图片。这个可以通过 taskpool 的任务优先级参数实现优先调度首屏任务让用户最先看到内容。6. 内存占用管控缓存不能是无底洞20% 红线必须守住6.1 统计内存占用的方法既然缓存了解码后的 PixelMap就必须对内存占用负责。我在 CacheImage 里加了内存统计模块每次写入缓存时累加 PixelMap 的四字节乘像素数每次淘汰时减去对应字节数。这里的四字节怎么来的OpenHarmony 的 PixelMap 默认格式是 RGBA_8888也就是每个像素占 4 字节。所以内存计算公式是内存字节数 宽 x 高 x 4一张 1080x1920 的图内存是 1080x1920x4 约 7.9MB。如果列表里有 20 张这样的图光解码缓存就是 158MB这在很多 OpenHarmony 设备上已经是临界值了。6.2 动态阈值与主动回收我的策略是设置一个动态内存阈值初始值为设备内存的 20%。每次缓存写入后检查总字节数如果超过阈值就启动清理。清理不是把缓存清空而是从 LRU 链表尾部开始淘汰直到总字节数降到阈值的 80% 以下。设备总内存的获取方式OpenHarmony 提供系统接口可以在应用启动时读取一次然后缓存起来。这里还有一层防御机制当系统内存压力较大时会触发应用的内存警告回调。在回调里我会先清理 CacheImage 的全部缓存——因为图片缓存是可再生的丢掉后最多是重新解码不应该为了缓存导致应用被杀掉。6.3 一个真实场景的内存表现在全志平台的一个测试设备上我们连续加载了 20 张 2K 图片。如果不设置 decodeWidth/decodeHeight单张解码峰值内存约 60MB20 张图同时驻留很容易超过系统限制导致内存回收频繁甚至闪退。设置目标尺寸解码后每张图按 300x300 解码单张内存只要 360KB20 张也就 7MB 左右。同时 LRU 缓存在总量接近阈值时自动清理实测内存峰值控制在 40MB 以内应用运行很平稳。7. 加载占位与过度绘制一个巧妙的 overlay 处理方案7.1 图片加载过程中的显示问题图片网络加载需要时间这个过程中不能让界面出现空白。传统做法是给 Image 外面套一个 View 作为占位层或者使用 RN 的 backgroundColor 做简单的占位背景。这两种方法有各自的缺点额外 View 会增加一层布局层级过度绘制严重时会造成渲染性能下降backgroundColor 只能做纯色占位无法满足“加载中”和“加载失败”这种状态区分。我在优化时发现OpenHarmony Image 组件的 overlay 属性可以接受自定义绘制内容直接叠加在图片上层。基于这个能力我在 CacheImage 内部用一个自定义的占位绘制对象通过 overlay 实现占位效果。7.2 overlay 性能收益分析相比额外 View 叠层用 overlay 至少省掉一层 View 合成这对滚动列表的渲染性能有实打实的帮助。特别是在低端设备上减少一层过度绘制GPU 的合成负担明显降低。在实现上通过 overlay 画一个占位色块背后可以用系统提供的基本绘制接口不需要引入额外的 canvas 依赖。等图片加载完成后把 overlay 内容替换为透明绘制图片自然显示出来。7.3 状态切换与闪烁问题的处理这里有一个细节容易踩坑overlay 和图片内容其实是同一块绘制区域加载完成前显示占位内容加载完成后必须保证图片立即显示中间不能出现闪烁。我在实现里用一个状态标记控制 overlay 的绘制逻辑。当图片解码完成并写入缓存后标记位改为“已加载”下次绘制时 overlay 直接返回空内容图片层正常渲染。因为 overlay 内容和图片内容在同一个合成节点切换过程只需要一次重绘不会有中间态闪烁。8. 常见问题与定位思路速查表8.1 列表滑动时的帧率问题现象排查方向解决方案滑动时掉帧严重检查解码任务是否阻塞 UI 线程将解码全部迁移到 taskpool设置并发上限快速滑动时出现空白图缓存未命中的图片过多优化缓存 key 策略提高命中率图片加载后列表卡顿一下解码瞬间触发大内存分配设置 decodeWidth/decodeHeight降低单张位图内存8.2 内存峰值过高和图片显示异常现象排查方向解决方案内存持续上涨不回落检查缓存是否有主动清理机制实现基于字节数的 LRU 淘汰策略应用被杀进程内存警告回调未处理在内存紧张时清空图片缓存图片变形、模糊解码尺寸与显示尺寸不一致按 resizeMode 计算正确解码尺寸8.3 不同格式图片的差异实测下来JPEG 和 PNG 在常规尺寸下表现稳定WebP 在小尺寸解码时反而慢于 JPEG因为 WebP 解码器需要先解析完整头信息。如果应用里大量使用 WebP 的动图或高压缩率图片建议在服务端针对 OpenHarmony 场景输出 JPEG/PNG 格式的降级版本或者为 WebP 单独调整缓存策略和解码参数。对于超大图4000x4000 以上不建议直接使用 Image 组件解码内存峰值很难控制。更稳的方案是使用 Drawable 的像素级裁剪能力先按目标区域裁剪原图再解码局部数据这样能把内存占用降到一个安全的范围。9. 实测数据对比与调优参数记录9.1 优化前的数据基线在未加 CacheImage 封装时测试设备上同一列表页的指标如下首屏加载耗时约 1800ms。滑动平均帧率约 28fps。图片平均加载耗时约 210ms。内存峰值加载 20 张 2K 图后超过 500MB频繁触发系统内存回收。9.2 优化后的数据表现启用 CacheImage 后进行相同场景的测试首屏加载耗时约 1100ms提升约 39%。滑动平均帧率约 55fps提升约 96%。图片平均加载耗时首次加载约 95ms之后从缓存命中直接渲染耗时小于 10ms。内存峰值控制在设备总内存的 20% 以内稳定在 180MB 左右。数据本身有一定平台和设备差异但整体趋势在所有测试机型上保持一致。特别是在中低端设备上开启缓存和解码尺寸控制后图片体验的改善幅度比高端设备更明显。9.3 关键参数速记清单调优过程中需要重点关注的参数有decodeWidth/decodeHeight控制解码后尺寸直接影响内存和解码耗时。缓存 key必须包含 uri、目标尺寸、resizeMode。LRU 缓存总字节数阈值建议占设备内存的 15%~20%留出系统其他模块的余量。并发解码任务数建议为 CPU 核数减 1。缓存清理后目标水位建议为阈值的 80%避免频繁触发清理。我把这些参数做成了配置文件方便在不同设备上调整。这样做的好处是换一台新设备或新系统版本时不需要改代码逻辑只需要调整一组阈值即可。10. 一些更深的体会这套方案能走多远在完成这套 CacheImage 优化之后我比较关心它的通用性。专测结果显示它对真实 RN 应用的图片加载体验提升明显但有几个因素会影响最终效果图片格式、网络带宽、设备解码能力。同一个方案在低端设备上可能从“不可用”变成“够用”在高端设备上可能从“流畅”变成“极限流畅”。真正决定 RN 在 OpenHarmony 上图片性能上限的还是背后这套缓存策略和解码参数是否针对目标设备做了适配。有一点值得继续投入目前 CacheImage 主要做了内存级缓存和 LRU 淘汰后续还可以加入磁盘缓存和预解码。磁盘缓存能跳过网络请求预解码能在列表滑动到目标位置前提前把图片准备好。这两者叠加后图片体验还能再上一个台阶。我个人在实际调优中的体会是不要一上来就埋怨适配层或系统组件性能差。先把图片加载链路的每一步走一遍搞清楚哪里在等待、哪里在重复工作、哪里在浪费内存然后针对性的加缓存、控尺寸、做并发问题往往会迎刃而解。这也是做性能优化最通用的工作方法。最后再分享一个实际的小技巧在调试缓存命中率时打开 DevEco Studio 的 HiLog 面板在 CacheImage 里打一条缓存命中状态和耗时日志。跑一轮列表滑动后把日志导出按命中率排序过滤很快就能定位到哪些 uri、哪些尺寸在反复触发解码这些数据比任何理论分析都更有价值。

相关新闻

PXE批量装机实战:从零搭建到30台服务器40分钟自动化部署

PXE批量装机实战:从零搭建到30台服务器40分钟自动化部署

1. 为什么我最终选择了PXE批量装机方案机房上架三十台新服务器,如果一台一台插U盘、选启动项、点下一步,光是重复劳动就能把人耗到怀疑人生。我试过用U盘批量克隆,也试过用脚本半自动化,但真正让我觉得“这才叫干活”的&#xff0…

2026/10/17 23:34:32 阅读更多 →
AI编程工具开放研究工作流:Claude Code、Codex、OpenCode、Cursor选型与配置指南

AI编程工具开放研究工作流:Claude Code、Codex、OpenCode、Cursor选型与配置指南

1. 从“OpenResearch”说起:一个被低估的开发者效率命题“OpenResearch”这个词第一次出现在我视野里,是在几个开发者社群里被反复提及的时候。当时大家讨论的焦点并不是某个具体的开源项目,而是一种越来越明显的趋势:围绕 Claude…

2026/10/17 23:33:31 阅读更多 →
2026软件测试面试新趋势:从背题到深度能力考察

2026软件测试面试新趋势:从背题到深度能力考察

每年到这个时间点,后台就会收到一波测试同行发来的消息:“面试题能不能整理一份?”今年问的人尤其多,而且问题比以前细得多——不再是“背哪几道题能过”,而是“现在面试到底在考什么”。说实话,2026年的软…

2026/10/17 23:33:31 阅读更多 →

最新新闻

从零开发轻量记事本:IndexedDB存储、自动保存与同步实践

从零开发轻量记事本:IndexedDB存储、自动保存与同步实践

记事本这玩意儿,看着简单,做起来全是坑。之前我接了一个内部工具需求,要做一款能随手记录、随时翻查、离线也不慌的轻量记事本,产品代号叫“轻记”。从UI线框到功能实现,前后大概花了三周时间,中间踩了不少…

2026/10/18 0:23:12 阅读更多 →
SysML与UML核心区别:系统工程建模的底层逻辑

SysML与UML核心区别:系统工程建模的底层逻辑

简介:本资源是系统工程领域权威入门与进阶指南《Systems Engineering with SysML/UML》,面向系统工程师、嵌入式/航空航天/汽车/医疗设备领域研发人员及高校相关专业师生,聚焦OMG标准下SysML与UML协同建模方法,解决复杂系统需求追…

2026/10/18 0:23:12 阅读更多 →
Matplotlib三维绘图避坑指南:从空白图到工程级可视化

Matplotlib三维绘图避坑指南:从空白图到工程级可视化

简介:本资源是一份面向Python初学者与数据可视化学习者的matplotlib三维绘图实战指南,聚焦解决“如何用matplotlib快速绘制可复现、可定制的三维曲面图”这一核心问题。内容以两个完整可运行示例为核心:其一基于笛卡尔坐标系,使用…

2026/10/18 0:22:12 阅读更多 →
智谱清华唐杰:LLM Memory最新全景综述——用TaoToken统一Key复现记忆模块评测

智谱清华唐杰:LLM Memory最新全景综述——用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/18 0:21:11 阅读更多 →
跳出代码,彻底看懂 MCP 与 Function Calling 的底层关系:TaoToken 统一 Key 通道下的调用链路拆解

跳出代码,彻底看懂 MCP 与 Function Calling 的底层关系: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/18 0:21:11 阅读更多 →
地理空间坐标系统实战:用TaoToken统一Key打通七参数坐标转换链路

地理空间坐标系统实战:用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/18 0:21:11 阅读更多 →

日新闻

基于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 阅读更多 →

周新闻

基于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/16 21:54:38 阅读更多 →
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/16 14:23:36 阅读更多 →