Godot RTS开发实战:从导航到建造的原子化实现

news2026/5/24 11:22:45
1. 为什么“从零开始玩转Godot RTS引擎”不是一句空话而是真能落地的开发路径很多人看到“RTS”两个字母就下意识缩手——星际争霸、帝国时代、红色警戒这些名字背后是庞大的系统、复杂的寻路、海量单位同步、资源采集逻辑、建造队列、科技树、视野遮蔽……一连串术语像铁幕一样压下来。更别说“从零开始”四个字在Unity或Unreal生态里你至少还能搜到几个半成品框架但Godot社区里RTS相关的内容长期处于“Demo级演示多、可复用模块少、生产级案例几乎为零”的状态。我去年接手一个独立游戏原型时也这么想直到在GitHub上翻到一个叫godot-rts-template的仓库作者只写了两行README“这不是完整游戏是让你能跑起来的第一块砖。所有代码都带注释所有坑我都踩过。”——结果这一“砖”真让我在三周内搭出了具备基础采集-建造-战斗闭环的可玩版本。这恰恰说明“从零开始玩转Godot RTS引擎”不是营销话术而是一条被验证过的、符合Godot设计哲学的务实路径它不依赖黑盒插件不强求一步到位而是把RTS拆解成可独立验证的原子能力——单位移动是否平滑点击地面能否生成有效路径点资源采集是否触发正确事件建造预览框能否实时响应地形高度每个环节都用Godot原生节点NavigationAgent2D/NavigationServer2D、TileMap、Area2D、Signal实现不绕弯、不嫁接、不魔改引擎。关键词Godot RTS引擎、开源游戏开发、实战指南说的正是这件事用开源工具链走一条看得见每一步脚印的开发路。它适合两类人一是刚学完Godot官方入门教程、正发愁“接下来该做什么项目”的新手二是有Unity/UE经验、想快速评估Godot在策略游戏领域真实生产力的中阶开发者。你不需要先成为AI算法专家也不必啃完《游戏编程精粹》全集——只要你会写if语句、能看懂信号连接、理解场景树结构就能在这条路上持续获得正反馈。我后面会带你亲手敲出第一个可点击移动的农民单位不是靠复制粘贴而是搞懂为什么_on_navigation_finished()要放在_process()之外调用为什么get_simple_path()返回的点必须经过to_local()转换——这才是“玩转”的起点。2. Godot RTS的核心骨架为什么不用A*库而坚持手搓导航与路径平滑RTS最表层的体验是“点哪走哪”但底层支撑它的是三重不可见的系统导航网格生成、路径计算、运动执行。很多开发者第一反应是找现成A*库比如godot-a-star或pathfinding.js的GDScript封装。我试过两周后删了全部代码——不是它们不好而是和Godot的2D/3D混合架构、信号驱动模型、以及RTS特有的“群体移动动态障碍物”需求严重错配。2.1 Godot原生导航系统的真实能力边界Godot 4.x的NavigationServer2D或3.x的Navigation2D不是玩具。它本质是一个轻量级导航服务核心优势在于与场景树深度耦合。当你把NavigationRegion2D节点拖进地图它自动监听子节点的VisibilityNotifier2D变化——单位进入视野即激活区域离开即停用内存占用随可见性动态伸缩。这比任何外部A*库手动管理“哪些格子当前有效”要干净十倍。更重要的是它的get_simple_path()返回的是世界坐标点数组且默认启用smooth_path true参数这意味着它内部已集成Catmull-Rom样条插值无需你再写贝塞尔曲线拟合代码。提示get_simple_path()的“简单”二字极具误导性。它不返回网格坐标而是连续空间中的浮点坐标点它不保证最短路径那是get_path()干的事但保证路径平滑无折角——这恰恰是RTS单位移动的刚需。别被名字骗了。我实测对比过用get_simple_path()生成10个点的路径单位移动耗时18ms用纯A库算出网格坐标再手动插值同样路径耗时32ms且转弯处有明显卡顿。差距来自底层优化NavigationServer2D直接调用Bullet物理引擎的凸包碰撞检测而外部A库只能做离散栅格判断。2.2 手搓路径平滑器的必要性与实现逻辑但smooth_path true只是起点。RTS单位不能像机器人一样沿着完美曲线匀速滑行——它们需要加速度、转向延迟、碰撞避让。我的方案是三层运动控制器导航层调用get_simple_path()获取约15-20个平滑点太多则计算冗余太少则路径僵硬轨迹层用Tween节点对路径点做分段缓动关键参数首段用ease_in_out模拟起步加速中段用linear保持稳定速度末段用ease_in模拟刹车减速执行层单位自身_physics_process(delta)中通过look_at(target_point)控制朝向move_and_slide()处理碰撞。这个结构的关键在于解耦导航层只负责“去哪”轨迹层只负责“怎么去”执行层只负责“此刻动多少”。当你要添加“单位被击中时紧急转向”功能时只需在执行层插入if hit: target_point get_evade_point()完全不影响前两层逻辑。# 单位移动核心逻辑简化版 func _physics_process(delta): if not current_path or current_path.empty(): return # 获取当前目标点轨迹层输出 var target get_next_target_point() # 转向控制避免高频抖动设置最小转向角度阈值 var angle_to_target global_position.angle_to_point(target) if abs(angle_to_target - rotation) deg_to_rad(5): rotation lerp(rotation, angle_to_target, 0.1 * delta) # 移动执行用move_and_slide避免穿模 var velocity (target - global_position).normalized() * move_speed velocity move_and_slide(velocity)这段代码里藏着三个实战经验第一lerp(rotation, ...)的0.1系数不是拍脑袋定的而是通过逐帧录屏测量单位转向弧度得出的——系数大于0.15会导致转向过猛像抽搐小于0.07则响应迟钝第二move_and_slide()必须传入velocity而非position否则move_and_collide()无法正确返回碰撞信息第三global_position.angle_to_point()比global_transform.origin.angle_to()更可靠后者在单位被父节点缩放时会失准。2.3 动态障碍物的实时注入机制RTS最大的动态障碍是其他单位。传统方案是每帧遍历所有单位位置构建临时障碍栅格。Godot的优雅解法是利用Area2D的body_entered/body_exited信号。我在每个单位节点下挂载一个Area2D设为monitoring true其CollisionShape2D用圆形半径单位碰撞体半径×1.3。当A单位的Area2D检测到B单位进入时立即向导航服务器注册一个临时NavigationObstacle2D节点生命周期绑定B单位存活状态。退出时自动销毁。整个过程毫秒级完成且不阻塞主线程。注意NavigationObstacle2D在Godot 4.2才支持动态添加。若用旧版需提前在地图上放置足够多的“占位障碍节点”通过enabled false开关控制——这是唯一需要预估规模的设计妥协。3. RTS资源系统的最小可行闭环从“砍树”到“金矿产量翻倍”的完整数据流RTS玩家最敏感的不是画面而是资源数字跳动的节奏感。“砍一棵树得10木头”这种设定背后是状态机、事件总线、数值平衡、UI反馈四层系统在协同工作。很多教程止步于“点击树播放动画”但真正的闭环必须包含采集触发→进度累积→资源发放→UI更新→经济影响。下面以“农民砍树”为例拆解这个看似简单实则精密的链条。3.1 采集动作的状态机设计为什么不用Timer节点初学者常犯的错误是给树节点加Timertimeout()时emit_signal(wood_collected)。这会导致三个问题第一多个农民同时砍同一棵树时Timer被覆盖第二农民死亡时Timer未清理继续发信号第三无法暂停/加速采集进度。正确解法是用状态机自定义计时器# 树节点脚本Tree.gd enum STATE { IDLE, BEING_COLLECTED, DESTROYED } var state STATE.IDLE var wood_value 100 var current_wood 0 var collectors [] # 存储正在采集的农民节点引用 func start_collect(collector): if state ! STATE.IDLE: return false collectors.append(collector) state STATE.BEING_COLLECTED return true func update_collection(delta): if state ! STATE.BEING_COLLECTED or collectors.empty(): return # 多农民协同采集每人贡献固定速率总速率人数×单人速率 var total_rate collectors.size() * 20 # 单位木头/秒 current_wood total_rate * delta if current_wood wood_value: emit_signal(wood_collected, wood_value) queue_free()这个设计的关键在于状态归属权树节点自己管理采集状态农民只负责“申请采集”和“报告进度”。当农民死亡时调用tree.stop_collect(self)即可从collectors数组中移除自身无需操作Timer。3.2 资源事件总线解耦采集者与经济系统资源发放不能由树节点直接修改全局变量$Game/ResourceSystem.wood否则系统彻底失控。我的方案是创建一个单例ResourceBus.gd# ResourceBus.gdAutoload extends Node signal wood_collected(amount) signal gold_collected(amount) # ... 其他资源信号 func add_wood(amount): emit_signal(wood_collected, amount) # 同时触发经济系统逻辑 $EconomySystem.on_wood_gain(amount) # 在Tree.gd中调用 func _on_tree_collected(wood_amount): ResourceBus.add_wood(wood_amount)这样做的好处是经济系统可以监听wood_collected信号做复杂计算如“每收集100木头伐木效率1%”而UI系统监听同一信号更新数字互不干扰。当你要添加“敌方劫掠”功能时只需在ResourceBus中新增steal_wood()方法所有下游系统自动响应。3.3 UI资源面板的响应式更新避免每帧刷新的性能陷阱新手常写func _process(_delta): $WoodLabel.text str(ResourceBus.wood)这会导致每帧字符串拼接文本渲染100个单位同时采集时UI线程直接卡死。正确做法是信号驱动防抖更新# ResourcePanel.gd extends Control var last_wood -1 var update_cooldown 0.05 # 仅每50ms更新一次UI func _ready(): ResourceBus.connect(wood_collected, self, _on_wood_collected) func _on_wood_collected(amount): last_wood ResourceBus.wood update_cooldown 0.05 func _process(delta): if update_cooldown 0: update_cooldown - delta return if last_wood ! $WoodLabel.get_text().to_int(): $WoodLabel.text str(last_wood) # 添加视觉反馈数字闪烁 $WoodLabel.add_theme_color_override(font_color, Color.green) await get_tree().create_timer(0.2).timeout $WoodLabel.add_theme_color_override(font_color, Color.white)这里有两个隐藏技巧第一await get_tree().create_timer(0.2).timeout比yield(timer, timeout)更安全避免Timer被提前释放导致崩溃第二add_theme_color_override()直接修改主题色比新建ColorRect节点做高亮更轻量——RTS UI必须为每毫秒性能而战。4. 建造系统的原子化设计从“拖拽建筑”到“地形适配阴影投射科技解锁”的全流程实现RTS建造系统常被做成“魔法黑盒”拖拽图标→鼠标变十字→点击地面→建筑拔地而起。但玩家真正感知的是细节建筑是否卡在斜坡上阴影是否随太阳角度变化未解锁的建筑图标是否灰显这些体验差异源于建造系统是否被拆解为可验证的原子模块。4.1 建筑预览系统的实时地形校验预览框Ghost不是静态图片而是实时计算的3D投影。我的实现分三步地形采样用TileMap.get_cell_tile_data()获取鼠标位置下方的瓦片ID查表得到该瓦片的height属性例如草地0岩石1.2斜坡0.6碰撞检测将预览建筑的CollisionShape2D矩形转换为世界坐标调用PhysicsDirectSpaceState2D.intersect_shape()检测是否与地形瓦片碰撞高度适配若建筑底座需贴合地形用TileMap.map_to_world()获取瓦片中心点再根据瓦片height属性调整预览框global_position.y。# BuildingPreview.gd func _process(_delta): var mouse_pos get_global_mouse_position() var tile_pos tile_map.world_to_map(mouse_pos) var tile_id tile_map.get_cell(tile_pos.x, tile_pos.y) if not is_valid_building_location(tile_id): set_invalid_state() # 显示红色边框 return # 计算预览框Y轴偏移 var height get_tile_height(tile_id) global_position Vector2(mouse_pos.x, mouse_pos.y - height)关键点在于get_tile_height()的实现我为每个地形瓦片在TileSet中定义了自定义属性height通过tile_set.tile_get_custom_data(tile_id, height)读取。这样当美术更换瓦片时高度值自动同步无需程序员改代码。4.2 建造队列的优先级调度与并发控制玩家常狂点建造按钮导致队列堆积。我的队列系统有三个硬性规则同类型建筑去重点击“兵营”5次队列只存1个数量字段改为5资源预扣减加入队列时立即扣除资源失败时返还避免“点了却没钱建”的挫败感并发限制农民单位数≤3时最多同时建造2个建筑≥5时上限升至4——这通过ResourceBus的workers_available信号动态调整。队列数据结构用Array[Dictionary]每个字典含{type: barracks, count: 3, cost: {wood: 150, gold: 50}, priority: 1}。优先级按插入顺序递增但允许玩家拖拽调整——这通过Control.queue_sort()实现比重排数组更高效。4.3 科技树的增量式解锁与UI联动科技树不是静态树状图而是动态状态机。每个科技节点如“高级伐木”存储prerequisites: 依赖的科技ID数组unlocked_by: 解锁条件如“建造3个伐木场”effects: 生效效果如{wood_rate_multiplier: 1.5}。解锁逻辑在TechSystem.gd中统一处理func check_unlock_conditions(tech_id): var tech tech_data[tech_id] if tech.unlocked: return true for prereq in tech.prerequisites: if not check_unlock_conditions(prereq): return false # 检查资源/建筑等硬性条件 if tech.unlock_condition.type building_count: var count get_building_count(tech.unlock_condition.target) return count tech.unlock_condition.min_count tech.unlocked true emit_signal(tech_unlocked, tech_id) return trueUI联动通过TechTreeUI.gd监听tech_unlocked信号动态更新节点颜色和tooltip。重点是get_building_count()的实现——它不遍历全场景而是维护一个全局building_count字典每次建筑_ready()时building_count[type] 1queue_free()时- 1。O(1)查询彻底告别卡顿。5. 实战排错我在调试“单位群体移动卡顿”时踩过的七个具体坑RTS性能问题最狡猾的地方在于它往往在你添加第17个单位时突然爆发而前16个都运行流畅。去年我遇到一个典型问题当农民数量15时点击地图任意位置单位响应延迟从200ms飙升至1.2秒且移动轨迹出现断续。排查过程像侦探破案以下是完整链路和每个坑的填法。5.1 坑1_process()中频繁调用get_simple_path()直觉认为“每帧重算路径”最稳妥。实测发现get_simple_path()在复杂地形下平均耗时8ms15个单位×8ms120ms直接吃掉六分之一帧时间。修复方案路径只在目标点变更时重算单位移动中缓存路径点数组用索引current_path_index推进。新增is_path_stale标志位仅当target_changed || obstacle_moved时置true。5.2 坑2Area2D的monitoring属性未关闭每个单位挂载的Area2D默认monitoringtrue意味着每帧扫描所有碰撞体。15个单位×15个Area2D225次扫描CPU占用率瞬间拉满。修复方案单位静止时area2d.monitoring false移动时设为true。用is_idle状态变量控制切换开销0.1ms。5.3 坑3Tween节点未设置transitions导致缓动失效我用tween.interpolate_property(unit, position, start, end, 1.0, Tween.TRANS_LINEAR)但单位移动仍呈阶梯状。查文档发现TRANS_LINEAR是过渡类型必须配合tween.set_transitions(Tween.TRANS_LINEAR)才生效。漏设此行Tween默认用TRANS_SINE而SINE在低帧率下计算精度不足。5.4 坑4TileMap的y_sort_enabled引发Z轴重排风暴开启y_sort_enabled后每帧按Y坐标重排所有子节点。15个单位50个地形瓦片65节点重排耗时4ms。修复方案关闭y_sort_enabled改用CanvasLayer分层——单位在CanvasLayer层级2地形在层级1阴影在层级0。Z轴关系由层级决定零计算成本。5.5 坑5CollisionShape2D的one_way_collision未启用单位在斜坡上移动时move_and_slide()因频繁碰撞检测而卡顿。开启one_way_collision true后单位只检测下方碰撞忽略侧向微小碰撞移动顺滑度提升300%。5.6 坑6NavigationRegion2D的navigation_layers配置错误我误将所有NavigationRegion2D的navigation_layers设为1导致导航服务器无法区分“可行走区域”和“建筑禁止区域”。正确做法地形区域设layers1建筑禁入区设layers2调用get_simple_path()时指定navigation_layers1。5.7 坑7_physics_process()中print()调试残留最后发现罪魁祸首是某次调试后忘记删除的print(Velocity: , velocity)。每帧打印字符串触发GC15个单位×每帧1次15次GC/帧内存碎片化导致卡顿。终极教训Godot的print()在发布版会自动移除但push_error()不会——永远用push_warning()替代print()做运行时日志。这七个坑的共同特征是单个影响5ms叠加后指数级恶化。它们教会我一个真理RTS优化不是“找到大瓶颈”而是“消灭所有小毛刺”。现在我的性能监控面板永远显示三行NavTime: 0.8ms,MoveTime: 1.2ms,RenderTime: 3.5ms——任何一项突破5ms立刻停下手头工作去挖根因。6. 开源协作的实战心法如何把你的Godot RTS项目变成社区共建的活水“开源游戏开发”不仅是代码公开更是协作模式的设计。我维护的godot-rts-starter仓库两年来收获327个star、41个PR核心在于把“贡献门槛”压到最低。以下是我验证有效的五条心法6.1 文档即代码用README.md驱动开发流程我的README.md不是项目介绍而是可执行的开发手册。开头就是## 快速启动30秒 1. 下载Godot 4.2.1[官网链接](https://godotengine.org/download) 2. 克隆仓库git clone https://github.com/yourname/godot-rts-starter.git 3. 运行main.tscn → 点击地面看农民移动接着是贡献指南用表格明确每类PR的准入标准PR类型必须包含拒绝理由新建筑building/xxx.tscndocs/buildings/xxx.md缺少cost字段或unlock_condition性能优化profiler_report.txt对比数据未证明FPS提升≥5%这样新人第一次PR不会因“不知道要写什么”而放弃。6.2 “最小可合并单元”原则拒绝大而全的PR曾有贡献者提交“添加完整科技树系统”的PR237个文件我礼貌拒绝并建议“请先提交‘科技节点基础类’确保能创建/删除节点通过后再提交‘依赖关系解析’最后是‘UI渲染’。” 结果他分三次提交每次都有即时反馈最终代码质量远超最初设想。6.3 自动化测试的底线思维RTS不适合UI自动化测试但核心逻辑必须覆盖。我只写三类测试导航测试test_path_generation.gd验证get_simple_path()在10种地形组合下返回点数≥3资源测试test_resource_flow.gd模拟100次采集检查ResourceBus.wood最终值误差0.1%状态机测试test_building_state.gd强制触发start_build()→cancel_build()→resume_build()验证状态流转正确。所有测试用assert()失败时直接报错行号新人5分钟内就能定位问题。6.4 社区反馈的“三明治法则”回复issue时永远按“肯定细节指出根因提供方案”结构。例如用户报“农民不砍树”✅ 你复现步骤完全正确点击树→农民走近→停止不动这帮助我快速定位❌ 根因是Tree.gd第47行state未初始化默认值null导致start_collect()返回false 已在_ready()中添加state STATE.IDLEPR #88已合并你可直接拉取最新版。6.5 技术债的“可视化仪表盘”在仓库ISSUE_TEMPLATE中我设置了一个固定模板## 技术债分类必选 - [ ] 性能瓶颈如单位20时FPS30 - [ ] 设计缺陷如建造队列无法取消 - [ ] 文档缺失如ResourceBus信号列表未写入docs - [ ] 兼容性问题如Godot 4.3不支持NavigationObstacle2D ## 优先级必选 - P0阻塞新功能开发24小时内响应 - P1影响核心玩法3天内响应 - P2优化项迭代周期内响应这套机制让贡献者一眼看清项目健康度也让我能聚焦解决P0问题。两年来P0问题平均解决时间18小时P1问题平均42小时——可预测的响应速度比任何华丽承诺都更能建立信任。我在实际开发中发现最有效的开源协作不是“号召大家来帮忙”而是“把帮忙的路径修得比自己动手还简单”。当一个新人提交第一个PR收到的不是“感谢”而是“你修复了XX模块的XX缺陷已合并这是你的贡献记录链接”那种被看见、被认可的感觉会让他第二天就回来提交第二个。这才是开源游戏开发最真实的驱动力——不是宏大叙事而是每一次点击“Merge Pull Request”时屏幕右下角弹出的那个小小通知框。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2633339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…