Cocos Creator三行代码实现专业UI动效:Widget与Tween的极致运用
1. 项目概述为什么UI动效值得投入三行代码在游戏和应用开发里UI动效常常是那个“说起来重要做起来次要忙起来不要”的部分。很多开发者尤其是刚入行的朋友一提到动效就觉得头大——要么是觉得太花哨影响性能要么是觉得实现起来太复杂得写一堆状态机或者动画曲线最后干脆用个简单的淡入淡出或者位置移动敷衍了事。结果就是做出来的界面虽然功能齐全但总感觉少了点灵魂操作反馈生硬用户体验上不去。我自己在项目里也踩过这个坑。早期做的一个项目UI交互就是简单的跳转按钮按下只有颜色变化列表滑动也没有惯性效果。测试时虽然功能都没问题但总被反馈说“手感不好”、“不够跟手”。后来我意识到好的UI动效根本不是“锦上添花”而是“雪中送炭”。它能在用户几乎无感知的情况下清晰地传达状态变化、引导用户视线、增强操作的确信感甚至能掩盖微小的加载延迟。比如一个按钮按下时有适度的缩放和压暗松开后快速回弹并变亮这种物理感的反馈会让用户觉得自己的操作得到了即时、有力的响应体验流畅度直线上升。而Cocos引擎特别是Cocos Creator在UI动效这方面其实藏着不少“神器”。很多人可能只知道用Animation组件或者写Tween缓动觉得要做出专业效果就得堆砌复杂的动画序列。其实不然引擎内置的Widget对齐挂件组件、Layout布局组件结合一些简单的脚本逻辑完全可以用极少的代码激发出非常专业的动效。这个项目的核心就是想和大家分享如何绕过复杂的动画编辑器用最精炼的代码可能真的就三行实现那些能显著提升产品质感的UI动态效果。我们追求的不是炫技而是在保证性能的前提下用最低的成本换取最高的体验收益。2. 核心思路利用引擎原生组件与缓动系统的化学反应要实现“三行代码”的承诺关键在于思路的转变。我们不能从零开始创造动画而是要善于“借力”和“组合”。Cocos Creator已经为我们准备好了强大的物理基础各种UI组件和化学反应催化剂缓动系统。我们的代码只是那个点燃反应的火花。2.1 思路一Widget组件的动态对齐这是我最常用也是效果最显著的一个技巧。Widget组件大家都会用通常是静态地设置上下左右对齐用于屏幕适配。但很少有人想到我们可以通过脚本在运行时动态修改它的offset偏移量属性。想象一下一个从屏幕外滑入的侧边栏。传统做法可能是设置初始位置在屏幕外然后用Tween移动它的position。但更优雅的做法是将侧边栏节点的Widget组件设置为左对齐left值设为0这样它正常情况下会紧贴屏幕左边缘。在脚本中我们不是去动position而是去动画式地改变Widget的left偏移量。比如让left从一个负值等于它的宽度代表完全在屏幕外缓动到0。为什么这样做更好因为position是本地坐标而Widget的offset是相对于父节点对齐边的距离。使用offset做动画能完美兼容各种屏幕分辨率无需计算绝对像素位置代码意图也更清晰——“我要改变它距离左边界的距离”。2.2 思路二Layout组件的间距动画Layout组件用于自动排列子节点我们通常静态设置spacingX或spacingY间距。但如果你试着在代码里动态改变这个间距值并加上缓动神奇的效果就来了。比如一个横向排列的图标列表在获得焦点时图标之间可以优雅地展开留出更多空间失去焦点时再紧凑地收回来。这种“呼吸感”的布局变化用传统的逐个移动子节点位置来实现会非常繁琐而通过动画Layout的spacing属性一行代码改变一个值所有子节点自动重新排列并由缓动系统赋予平滑过渡。2.3 思路三节点缩放与透明度的组合拳这听起来基础但组合好了威力巨大。专业动效很少是单一属性的变化。一个按钮的点击效果往往是缩放、透明度、颜色甚至阴影的同时变化并且这些变化的曲线和时长略有不同形成层次感。Cocos Creator的tween系统支持并行parallel和串行sequence组合动画。我们可以用一行代码启动一个并行缓动里面封装了缩放、颜色和透明度的变化。关键是缓动曲线easing的选择比如用backOut来实现一个略带 overshoot过冲的回弹效果能让动画看起来更生动、更有弹性。核心心法我们的三行代码不是去实现整个动画逻辑而是去触发一个精心设计好的“状态切换”。这个状态切换的目标值提前在组件属性或我们的设计稿里就定义好了。代码的作用只是用tween将这个变化过程变得平滑而富有美感。3. 三行代码实战三个即刻可用的动效案例下面我们直接上干货用三个具体的案例来展示如何实践上述思路。我会提供完整的节点设置步骤和核心代码你可以直接复制到项目里测试。3.1 案例一优雅的侧边栏滑入滑出节点设置创建一个空节点作为SideBar。为SideBar节点添加一个Widget组件。在Widget组件中勾选Left对齐将Left的值设置为0。此时侧边栏应紧贴屏幕左边缘。为你希望作为侧边栏内容的节点比如一个背景Sprite和一些按钮设置好并作为SideBar的子节点。核心脚本 我们在SideBar节点上挂载一个脚本例如SideBarAnim.ts。import { _decorator, Component, Widget } from cc; const { ccclass, property } _decorator; ccclass(SideBarAnim) export class SideBarAnim extends Component { property(Widget) public widget: Widget null!; // 关联Widget组件 private _isShowing: boolean false; private _sidebarWidth: number 300; // 假设你的侧边栏宽度是300 // 用于切换侧边栏显示/隐藏的方法 toggleSideBar() { if (this._isShowing) { this.hide(); } else { this.show(); } } show() { this._isShowing true; // 第一行停止所有现有缓动 this.node.stopAllActions(); // 注意这里用的是stopAllActions对于Tween需要调用tween.stopAllByTarget(this.widget) // 更精确的Tween停止方式 cc.Tween.stopAllByTarget(this.widget); // 第二行 第三行创建并启动缓动 - 这就是“三行代码”的核心 cc.tween(this.widget) .to(0.3, { left: 0 }, { easing: cubicOut }) // 将left偏移量从当前值-300变化到0 .start(); // 初始化状态在onLoad里设置侧边栏初始为隐藏状态 // this.widget.left -this._sidebarWidth; } hide() { this._isShowing false; cc.Tween.stopAllByTarget(this.widget); cc.tween(this.widget) .to(0.3, { left: -this._sidebarWidth }, { easing: cubicIn }) .start(); } }代码解析cc.tween(this.widget): 指定我们要对哪个对象进行缓动。这里直接对Widget组件实例操作。.to(0.3, { left: 0 }, { easing: cubicOut }): 这是核心。在0.3秒内将widget.left属性变化到目标值0。easing: cubicOut指定了缓动曲线cubicOut是一种先快后慢的曲线非常适合滑入动作感觉像是“滑到位”。.start(): 启动这个缓动动画。我们在show和hide方法里都先调用了cc.Tween.stopAllByTarget(this.widget)这是非常重要的防冲突处理。如果用户在动画中途快速连续点击按钮这个操作能确保停止上一个未完成的动画立刻开始新的反向动画避免出现两个动画叠加导致的错乱。实操要点侧边栏的初始隐藏状态建议在脚本的onLoad或start生命周期里设置例如this.widget.left -this._sidebarWidth;。这样能确保动画起始状态正确。_sidebarWidth需要根据你侧边栏节点的实际宽度来设置。你可以通过this.node.width在运行时获取但要注意节点缩放的影响。3.2 案例二具有“呼吸感”的列表项展开节点设置创建一个空节点作为ItemList。为ItemList节点添加Layout组件类型选择HORIZONTAL水平布局。在Layout组件中设置一个合适的spacingX初始值比如20。创建几个列表项预制体或节点作为ItemList的子节点。核心脚本 在ItemList节点上挂载脚本如BreathingList.ts。import { _decorator, Component, Layout } from cc; const { ccclass, property } _decorator; ccclass(BreathingList) export class BreathingList extends Component { property(Layout) public layout: Layout null!; private _isExpanded: boolean false; private _normalSpacing: number 20; private _expandedSpacing: number 60; // 鼠标移入或获得焦点时调用 onFocus() { if (this._isExpanded) return; this._isExpanded true; cc.Tween.stopAllByTarget(this.layout); // 核心三行代码 cc.tween(this.layout) .to(0.5, { spacingX: this._expandedSpacing }, { easing: elasticOut } // 使用弹性曲线营造“呼吸”感 ) .start(); } // 鼠标移出或失去焦点时调用 onBlur() { if (!this._isExpanded) return; this._isExpanded false; cc.Tween.stopAllByTarget(this.layout); cc.tween(this.layout) .to(0.4, { spacingX: this._normalSpacing }, { easing: sineOut }) .start(); } }代码解析这次我们缓动的对象是Layout组件操作的属性是spacingX。easing: elasticOut这是实现“呼吸感”或“弹性感”的灵魂。elasticOut曲线会让变化值稍微超过目标点一点然后再弹回来模拟弹簧效果。这让简单的间距变化立刻变得生动有趣。同样我们在开始新动画前停止了针对该组件的所有旧缓动。实操要点elasticOut等弹性曲线虽然效果炫酷但性能开销相对cubicOut等标准曲线稍大。在低端设备或非常复杂的列表上需谨慎使用或可以通过减少动画时长来平衡。你可以将这个脚本与按钮的hover事件或自定义焦点逻辑绑定创造出响应式的UI列表。3.3 案例三富有按压感的按钮反馈节点设置创建一个Button节点或者一个带有Button组件的Sprite节点。确保该节点有Scale缩放和Color颜色通过UIOpacity或Sprite的color属性影响可以变化。核心脚本 在按钮节点上挂载脚本如AdvancedButton.ts。import { _decorator, Component, Button, Sprite } from cc; const { ccclass, property } _decorator; ccclass(AdvancedButton) export class AdvancedButton extends Component { property(Sprite) public targetSprite: Sprite null!; // 关联需要变色的Sprite private _originalScale: number 1; private _originalColor: cc.Color cc.Color.WHITE.clone(); onLoad() { this._originalScale this.node.scale; if (this.targetSprite) { this._originalColor this.targetSprite.color.clone(); } // 监听按钮的点击和悬停事件 const btn this.node.getComponent(Button); if (btn) { this.node.on(Button.EventType.CLICK, this.onClick, this); // 注意Cocos Creator的Button组件本身有hover效果这里我们覆盖或增强它 // 可以通过监听鼠标事件来实现更复杂的交互 } } // 模拟按下效果 onButtonDown() { cc.Tween.stopAllByTarget(this.node); // 核心三行代码并行执行缩放和颜色变化 cc.tween(this.node) .parallel( cc.tween().to(0.1, { scale: cc.v3(0.92, 0.92, 1) }, { easing: quadOut }), cc.tween(this.targetSprite).to(0.1, { color: cc.color(200, 200, 200) }, { easing: quadOut }) ) .start(); } // 模拟抬起效果 onButtonUp() { cc.Tween.stopAllByTarget(this.node); cc.tween(this.node) .parallel( cc.tween().to(0.15, { scale: cc.v3(this._originalScale, this._originalScale, 1) }, { easing: backOut }), cc.tween(this.targetSprite).to(0.15, { color: this._originalColor }, { easing: sineOut }) ) .start(); } onClick() { // 点击后可以再添加一个额外的效果比如微小震动 this.playClickEffect(); } playClickEffect() { // 一个简单的点击震动效果 cc.tween(this.node) .by(0.05, { position: cc.v3(2, -2, 0) }) .by(0.05, { position: cc.v3(-2, 2, 0) }) .by(0.05, { position: cc.v3(1, -1, 0) }) .by(0.05, { position: cc.v3(-1, 1, 0) }) .start(); } }代码解析.parallel()这是关键。它允许我们将多个缓动缩放和颜色变化并行执行让它们同时开始、同时结束或按各自时长这是复合动效的基础。按下动画onButtonDown快速0.1秒缩放到0.92倍同时颜色变暗RGB值从255变为200。使用quadOut曲线让变化快速而直接。抬起动画onButtonUp用稍长的时间0.15秒恢复原状。缩放恢复使用了backOut曲线产生一个可爱的回弹效果颜色恢复使用平缓的sineOut曲线。playClickEffect展示了如何用by方法相对变化制作一个微小的位置偏移序列模拟点击震动。这是一个“锦上添花”的效果不宜过度使用。实操要点颜色变化的目标对象targetSprite需要手动在编辑器里关联。如果你的按钮是纯Button节点可能需要通过getComponentInChildren来查找子节点中的Sprite。按压和抬起动画的时长和曲线需要仔细微调。按下通常更快、更直接抬起可以稍慢、更有弹性这样才符合物理直觉。一定要保存原始状态_originalScale,_originalColor并在适当的时机如onDestroy考虑恢复避免状态残留。4. 性能优化与高级技巧让动效既华丽又流畅写出动效只是第一步让它在各种设备上都能流畅运行才是真正的挑战。特别是在移动端性能预算非常紧张。4.1 性能优化黄金法则1. 属性动画优先于节点动画 这是我们之前所有案例的基础。直接修改Transform的position、scaleUIOpacity的opacityWidget的offsetLayout的spacing这些属性由引擎底层直接处理效率远高于频繁地启用/禁用节点active或者更换精灵帧spriteFrame。后者会触发更多的逻辑判断和渲染状态更新。2. 复用与池化 对于列表中频繁出现/消失的 item 动效比如滚动列表中的元素绝对不要每次创建新的Tween。应该在item被回收滚出视口时主动停止并清理其身上的所有缓动(cc.Tween.stopAllByTarget(itemNode))。更好的做法是为这类动效设计一个简单的状态机在item复用时重置状态而不是依赖缓动自动结束。3. 避免“布局抖动” 当我们动画一个Layout的spacing或者一个Widget的offset时会迫使引擎在每一帧重新计算该节点及其子节点的位置这称为“布局计算”。如果动画的节点层级很深或者同时有大量这样的动画性能开销会很大。优化提示对于复杂的、静态的UI部分在动画开始前可以尝试将其Widget或Layout组件的enabled临时设为false动画完成后再打开。但这需要测试因为可能会影响最终位置。另一个治本的方法是设计UI结构时尽量扁平化减少嵌套的、带自动布局的节点。4. 缓动曲线的选择linear线性曲线性能最好但看起来最机械。quadInOut,cubicInOut等标准三次贝塞尔曲线性能开销很小视觉效果也不错。elasticOut,bounceOut这类模拟物理效果的曲线计算更复杂应节制使用。如果一个界面上同时有几十个元素在用bounceOut再好的手机也可能卡顿。5. 使用cc.macro.ENABLE_TWEEN控制开关 在发布版本中如果非常担心性能可以在项目设置或启动代码里通过cc.macro.ENABLE_TWEEN false;全局关闭Tween系统。但这属于核选项需要你有一套完整的降级方案比如用更简单的动画或直接跳转代替。4.2 高级技巧序列、回调与链式操作三行代码是核心但现实项目需要组合。cc.tween的强大在于其链式API。1. 序列动画 使用.sequence()可以将多个动画按顺序串联。比如一个弹窗可以先缩放出现scale from 0 to 1然后轻微上弹一下scale to 1.05 then back to 1。cc.tween(this.popupNode) .sequence( cc.tween().set({ scale: cc.v3(0, 0, 1) }) // 1. 初始状态 .to(0.2, { scale: cc.v3(1, 1, 1) }, { easing: backOut }), // 2. 弹出 cc.tween().to(0.1, { scale: cc.v3(1.05, 1.05, 1) }) // 3. 过冲 .to(0.1, { scale: cc.v3(1, 1, 1) }) // 4. 回弹 ) .start();2. 插入回调 在动画链的任何位置你可以插入.call()来执行一个函数。这是实现复杂逻辑的关键比如在动画中途播放音效或者在动画结束时触发一个事件。cc.tween(this.node) .to(0.5, { position: targetPos }) .call(() { console.log(移动完成); this.onMoveComplete(); // 触发自定义回调 }) .start();3. 延迟执行 使用.delay(time)可以在动画链中插入等待时间。可以用来制作有节奏感的动画序列。4. 重复与循环.repeat(count, tween)可以重复一个动画序列多次。.repeatForever(tween)则用于创建无限循环的动画比如一个旋转的加载图标。// 一个永远呼吸的按钮谨慎使用耗电 cc.tween(this.node) .repeatForever( cc.tween() .to(1, { scale: cc.v3(1.1, 1.1, 1) }, { easing: sineInOut }) .to(1, { scale: cc.v3(1, 1, 1) }, { easing: sineInOut }) ) .start();5. 避坑指南与常见问题排查在实际项目中应用这些技巧时我遇到过不少坑。这里总结一下希望能帮你节省时间。5.1 动画“抽筋”或闪烁问题描述动画播放不流畅中途卡顿或者节点位置/缩放值在快速跳动。可能原因与解决缓动冲突最常见的原因。同一个对象的同一个属性被多个并发的Tween动画操作。务必在启动新动画前调用cc.Tween.stopAllByTarget(targetObject)停止该对象的所有旧动画。帧率波动动画时长太短如小于0.05秒在帧率波动时可能跳过中间帧导致视觉上的跳跃。适当增加动画时长或确保动画逻辑在update中稳定执行。属性被其他逻辑修改检查是否有其他脚本也在同一帧修改这个节点的position、scale等属性。可能是你的业务逻辑也可能是某个父节点的布局更新。需要理清代码执行顺序。5.2 Widget/Layout动画后位置不对问题描述动画结束后节点没有停在预期的位置或者屏幕适配后位置乱了。可能原因与解决初始状态未重置比如滑出屏幕的侧边栏在隐藏状态时widget.left -width。如果游戏窗口大小改变这个绝对值-width可能就不对了。最佳实践不要在代码里写死宽度用this.node.width动态获取。或者使用相对值如-1 * this.node.parent.width来计算。动画过程中父节点尺寸变化如果动画进行时屏幕旋转或父布局容器大小变了基于offset的动画最终位置可能会错位。考虑在动画开始前锁定父节点的布局更新或在cc.window的resize事件中重新计算目标值。Scale的影响Widget的offset和node.position都会受到节点自身scale的影响。如果你的节点缩放不为1计算目标位置时要小心。一个技巧是尽量在动画期间避免同时修改scale和依赖Widget的位置属性。5.3 动画在场景切换或节点销毁时未停止问题描述节点已经被销毁了但它的Tween动画还在后台尝试更新导致报错Cant call runAction on destroyed node或类似。解决方案在onDestroy中清理这是必须的。在每个有动画的组件的onDestroy方法里停止所有相关缓动。onDestroy() { cc.Tween.stopAllByTarget(this.widget); cc.Tween.stopAllByTarget(this.node); // 停止所有以该组件或其节点为目标的缓动 }使用弱引用或标记对于更复杂的动画管理系统可以考虑在Tween的.call()回调中检查节点是否有效(if(this.node this.node.isValid))再执行后续操作。5.4 复杂动画组合的管理难题问题描述一个UI元素有多个状态正常、悬停、按下、禁用每个状态切换都有动画代码容易变成一团乱麻。解决方案状态机模式定义一个枚举enum UIState来表示状态。在组件里维护一个当前状态变量。任何触发状态切换的方法如onClick,onHover首先判断是否已经是目标状态如果是则直接返回。然后调用一个switchState(newState)的方法在这个方法里先停止所有旧动画再根据newState执行对应的动画序列。动画配置数据化将不同状态的动画参数时长、缓动曲线、目标属性值提取成JSON配置或ScriptableObjectCocos里可以用自定义资源。这样设计和调整动画时无需修改代码直接在编辑器里配置即可。5.5 性能问题快速自查表当你觉得动画卡顿时可以按以下顺序排查排查点可能问题解决思路同时运行的动画数量一屏内是否有数十个元素在同时做复杂动画减少同时动画的数量或对不可见区域如滚动列表之外的元素停止动画。缓动曲线是否大量使用了elasticOut、bounceOut替换为cubicOut、quadOut等轻量曲线。布局计算动画是否频繁触发Widget或Layout的重新计算优化UI节点树减少嵌套布局考虑用position动画代替offset动画需手动适配。节点层级与DrawCall动画节点是否导致渲染批次频繁打断检查Renderer的DrawCall数量。尝试将动画元素合并到同一渲染批次但这通常涉及图集打包与动效本身关系不大。垃圾回收GC是否在update或每帧回调中创建了大量临时对象如cc.Vec3,cc.Color在cc.tween的.to()方法中直接使用字面量对象{scale: cc.v3(1,1,1)}引擎内部会优化。避免在频繁执行的函数里new对象。最后我的个人体会是UI动效的“专业感”不在于有多复杂而在于是否精准和一致。精准是指动画的时长、曲线要与操作的重要性匹配重要的反馈动画可以稍长如0.3秒次要的过渡可以很快如0.1秒。一致是指整个项目中相同类型的交互如按钮点击、页面切换应该使用相同或相似的动画模式这能建立用户的肌肉记忆和品牌感知。从这三行代码开始有意识地为你项目中的每一个交互点注入恰到好处的动感用户的体验将会获得质的提升。

相关新闻

零跑C系列SUV技术升级:SA8295芯片与800V高压平台解析

零跑C系列SUV技术升级:SA8295芯片与800V高压平台解析

1. 零跑C系列SUV焕新背后的技术革命当零跑汽车宣布C系列三款SUV全面升级SA8295芯片与800V高压平台时,这个动作远比表面看到的配置更新更具深意。作为深耕智能电动汽车领域的技术观察者,我注意到这次升级实际上完成了从"够用"到"领先"…

2026/7/26 20:48:13 阅读更多 →
解锁AI编程助手全部潜力:8个必装Skill提升开发效率10倍

解锁AI编程助手全部潜力:8个必装Skill提升开发效率10倍

如果你正在使用 Codex 或类似的 AI 编程助手,却感觉它只能帮你写写简单的代码片段,像个“高级代码补全工具”,那你可能只解锁了它 10% 的潜力。问题的核心不在于模型本身,而在于你是否为它装备了合适的“技能”。就像给一个顶级赛…

2026/7/26 10:40:16 阅读更多 →
双芯片协同方案在智能座舱中的性能优化与成本控制

双芯片协同方案在智能座舱中的性能优化与成本控制

1. 项目概述:双芯座舱方案的价值突破去年冬天第一次体验问界M9的座舱系统时,最让我惊讶的不是那块巨大的AR-HUD,而是同时运行三块屏幕操作时依然丝滑的触控响应。作为车载电子架构设计师,我深知这背后双芯片协同方案的含金量——用…

2026/7/28 4:56:59 阅读更多 →

最新新闻

2026 年 7 月商用咖啡供应链推荐指南:国内靠谱店中店咖啡服务商与主流赋能项目解析

2026 年 7 月商用咖啡供应链推荐指南:国内靠谱店中店咖啡服务商与主流赋能项目解析

进入 2026 年,实体门店咖啡副业增收、茶水间品质升级,已成为国内便利店、电竞棋牌、餐饮酒店、商务政企的核心升级需求。依托店中店轻植入模式、全自动智能设备、数字化托管运营、源头精品供应链体系,商用咖啡项目可帮助门店盘活闲置场景、新…

2026/7/29 1:24:51 阅读更多 →
大模型调用实战指南:从API使用到企业级部署

大模型调用实战指南:从API使用到企业级部署

1. 大模型调用基础认知第一次接触AI大模型时,我被它"黑盒"般的特性困扰了很久——输入一段文字就能得到智能回复,但完全不知道背后发生了什么。直到亲手调试过API才明白,调用大模型本质上是在与一个经过海量数据训练的复杂函数进行…

2026/7/29 1:24:51 阅读更多 →
保姆级数字人注册安装教程,0基础也能跟着做

保姆级数字人注册安装教程,0基础也能跟着做

什么是数字人? 数字人(Digital Human),说白了就是一个"活在屏幕里的人"——有真人的长相,能开口说话,还能跟你一来一回地互动。背后是 AI 在驱动,你说什么它听得懂,回答你…

2026/7/29 1:24:51 阅读更多 →
Project Graph:如何用这款免费跨平台工具高效构建可视化思维导图

Project Graph:如何用这款免费跨平台工具高效构建可视化思维导图

Project Graph:如何用这款免费跨平台工具高效构建可视化思维导图 【免费下载链接】project-graph A node-based visual tool for organizing thoughts and notes in a non-linear way. 项目地址: https://gitcode.com/gh_mirrors/pr/project-graph 如果你正在…

2026/7/29 1:24:51 阅读更多 →
ALB 5XX 告警被扫描器刷爆?3步定位 + OpenSearch 接口级聚合实战(附完整查询)

ALB 5XX 告警被扫描器刷爆?3步定位 + OpenSearch 接口级聚合实战(附完整查询)

凌晨收到 P0 告警:ALB Target 5XX 飙升到 625/5min。15 分钟定位根因:不是业务故障,是一个 DigitalOcean VPS 在扫描。本文记录完整排查链路:CloudWatch 指标 → OpenSearch 日志聚合 → client_ip 定位 → 扫描器识别 → WAF 处置。 前言 凌晨告警炸了: 🔴 ALARM: pr…

2026/7/29 1:24:51 阅读更多 →
Processing创意编程:用玫瑰线方程实现数学可视化与动态艺术

Processing创意编程:用玫瑰线方程实现数学可视化与动态艺术

1. 从“玫瑰”到“代码”:一个迷人的数学可视化项目如果你对创意编程感兴趣,或者正在学习Processing,那么“玫瑰线”绝对是一个不容错过的经典项目。它不像那些复杂的3D渲染或物理模拟,需要深厚的数学和图形学功底。玫瑰线项目的美…

2026/7/29 1:23:51 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻