干货 | 从47%到80%,携程酒店APP流畅度提升实践

一次实时数据链路丢数排查:从 MQTT 队列积压到 SQL 统计开销 本文通过一次实时数据链路压测,排查了从MQTT到ClickHouse的端到端数据丢失问题。核心方法是为每条消息添加序号,建立独立观察点(MQTT订阅端、Kafka消费者),结合转发服务阶段统计与线程栈分析,定位到下游处理速度不足源于Druid SQL合并统计的高开销。优化措施包括关闭SQL合并、扩容代理队列、增强生产侧失败处理,并验证15分钟内实现全链路对账一致,显著缓解积压与丢包。关键收获:数据可对账、明确各阶段“成功”定义、关注客户端队列状态。 阅读详情

作者简介

 

Jin,携程高级研发经理,专注移动技术开发;Dan,携程测试开发经理,关注数据挖掘以及数据在系统质量提升中的应用;Lanbo,携程软件技术专家,专注移动技术开发。

一、背景

APP性能提升一直是研发团队永恒的主题。在进行APP性能优化实践中,除了性能技术方案本身外,还会面临两方面问题:第一,APP的性能优化,不具有持续性,往往经过一段时间优化实践,效果明显,但是随着后续需求迭代和代码变更,APP性能很难维持在一个较好的水平上;第二,APP性能改善提升,缺乏一套科学量化手段进行衡量。

引⽤管理学⼤师彼得•德鲁克的⼀句话:If you can’t measure it, you can’t improve it,如果你⽆法度量它,你就⽆法改进它。基于此,携程酒店前端APP团队进行了深入思考和探索,希望通过量化,治理,监控三方面手段,持续改善APP性能和用户体验。

ed0fd74053888c714e9a1a4cf558b83b.png

二、流畅度指标定义

流畅度,简单说就是度量用户使用APP体验的一部分,它是用户快速、无阻碍使用APP的一项体验指标。主要包括三方面内容:稳、快、质。稳的含义是用户在打开具体一个页面时,没有出现白屏、崩溃、闪动等。快的含义是页面打开很快,用户在页面进行交互时,操作流畅自然。质的含义,是在浏览页面时,没有无故的弹窗拦截,打断用户的操作。如下图所示:

8756d4a2a4d76854099af5e23370c4de.png

基于以上理论基础,APP中白屏,崩溃闪退,加载慢,卡顿,闪动,报错,都是用户在感知层面形成不流畅的因素。于是我们提出了流畅率量化指标,把用户页面PV以及用户在页面触发的二次加载次数之和,定义为流畅率的分母,也就是样本总量,如下公式:

样本量 = 页面pv+二次加载数

把页面慢加载/页面卡顿/图片/视频慢加载PV去重后数量,加上页面出现的崩溃,滑动卡顿,图片/视频加载失败,全局弹窗报错,输入失焦,按钮点击无效,二次加载失败,二次加载慢等异常情况之和定义为不流畅因子数。那么流畅率的公式定义为:

流畅率 = (样本量-不流畅因子数)/ 样本量

2.1 页面可交互加载时长

页面可交互加载时长,是页面渲染绘制时间叠加网络服务的请求响应时间,可以简单用下面公式表示:

页面可交互加载时长(TTI)= 页面本地渲染时长+服务网络加载时长

2.2 页面可交互加载时长采集原理

在我们的核心页面中,都包含了Text控件,可以通过扫描页面中特定区域内的文本来确定用户可交互时间。我们的技术栈大体上分为Flutter和Ctrip React Native,以下分别介绍加载时长采集原理。

2.2.1 Flutter页面可交互加载时长采集原理

在Flutter中,最终的UI树其实是由一个个独立的Element节点构成。UI从创建到渲染的大体流程如下:

根据Widget生成Element,然后创建相应的RenderObject并关联到Element.renderObject属性上,最后再通过RenderObject来完成布局排列和绘制。如下图如所示:

fcdd7dc3f4520645ad7d1901b93699b7.png

所以可以从根节点开始遍历Element,直到找到扫描窗口内的Text组件且组件的内容不为空,即可判定页面TTI检测成功,Flutter提供如下接口支持Element遍历:

voidvisitChildElements(ElementVisitor visitor) 

2.2.2 Ctrip React Native页面可交互加载时长采集原理

我们知道,ReactNative最终是由Native组件来渲染的,在iOS/Android中可通过从根View从View树中递归查找Text文本控件,来获取页面内文内的内容,去掉页面顶部固定静态展示和底部静态展示区域之外,扫描到的文本数量大于1个,我们就认为页面TTI检测成功了。

2.3 渲染卡顿和帧率

Google对卡顿定义:界面呈现是指从应用生成帧并将其显示在屏幕上的动作。要确保用户能够流畅地与应用互动,应用呈现每帧的时间不应超过 16ms,以达到每秒 60 帧的呈现速度。如果应用存在界面呈现缓慢的问题,系统会不得不跳过一些帧,这会导致用户感觉应用不流畅,我们将这种情况称为卡顿。

2.3.1 卡顿标准

判断 APP 是否出现卡顿,应该从APP类型是普通应用还是游戏应用出发,不同类型APP,对应不同的卡顿标准。针对普通类型应用,可以参考借鉴Google 的 Android Vitals 性能指标,针对游戏,可以参考借鉴腾讯的 PrefDog 性能指标。因为我们APP是普通应用,简单的介绍下Google Vitals 的卡顿定义。

GoogleVitals把卡顿分为了两类:

第一类是呈现速度缓慢:在呈现速度缓慢的帧数较多的页面,当超过 50% 的帧呈现时间超过 16ms 毫秒时,用户感官明显卡顿。

第二类是帧冻结:帧冻结的绘制耗时超过 700ms,为严重卡顿问题。

另外,要注意的是,FPS的高低和卡顿没有必然关系,帧率 FPS 高并不能反映流畅或不卡顿。比如:FPS 为 50 帧,前 200ms 渲染一帧,后 800ms 渲染 49 帧,虽然帧率50,但依然觉得非常卡顿。同时帧率 FPS 低,并不代表卡顿,比如无卡顿时均匀 FPS 为 15 帧。

2.3.2 卡顿量化

当了解卡顿的标准以及原理之后,可以得出结论,只有丢帧情况才能准确判断是否卡顿。

Flutter官方提供一套基于SchedulerBinding.addTimingsCallback回调实现的实时帧数据的监控。当flutter 页面有视图绘制刷新时, 系统吐出一串 FrameTiming 数据 ,FrameTiming的数据结构如下:

vsyncStart,

buildStart,

buildFinish,

rasterStart,

rasterFinish

vsyncStart变量表示当前帧绘制的起始时间,buildStart/buildFinish表示WidgetTree的build时间,rasterStart/rasterFinsih表示上屏的光栅化时间,那么一帧的总渲染时间,可以利用下面公式得到:

totalSpan=>rasterFinish  - syncStart

对应Google Android Vitals卡顿的标准:如果一帧totalSpan > 700ms,认为发生了帧冻结,产生了比较严重的卡顿;如果1s内,有超过30次的帧的绘制时间totalSpan> 16ms,产生了呈现速度缓慢。

三、流畅度监控方案

在流畅度监控体系中,对于不流畅感知因子,进行单项分析及挖掘,旨在在迭代优化的同时,维持或提升已有的用户体验。

监控体系的搭建,分为现状及优化方向挖掘、监控指标依赖数据补齐、多维度的数据监控、指标监测预警。

a5424ed01526bc76654834e29e0d9b9e.png

监控搭建前期会对于APP现有的性能现状进行分析,挖掘可优化的方向,初步获得优化所带来的预计收益、影响的用户数等信息。如:预计使用预加载的方式,来降低用户的慢加载率,通过各场景的不同用户操作分析,以及目前客户端及服务端技术实现的现状(酒店主服务返回报文大小统计、酒店详情纯前端渲染时间等),来确定慢加载的覆盖面、触发时机,以达到更优的效果。

接下来,针对流畅度优化的业务、技改上线的同时,补充对应的监测场景埋点,以支撑流畅度量化衡量的数据,为后续的监控及预警,奠定坚实的基石。

监控体系的核心是大盘及多维度监控的铺开,大盘数据(如下图所示),能快速宏观的了解用户预订体验,明确流畅度提升的进度;而通过各种维度的数据表,即可以找到提升目标,也能监控优化效果。

在实际监控中,会针对不同的指标,设计不同的监控标准,如:慢加载、白屏、奔溃、卡顿等系统因素,除了大盘指标外,还增加了各指标影响占比、酒店主页面的报错率趋势、版本对比趋势、报错机型top分布等。

对于业务场景比较重的因素,结合业务数据进行分桶等方式的监控,如:详情页房型数量关联TTI耗时分布、单酒店crash数据等。并与AB实验系统打通,业务、技改类需求都可以在AB系统中配置流畅度观测指标,比对业务或技改需求对流畅度的指标影响,作为实验是否通过的考量指标。

65b22d20d47b30e4e1653c519586d15d.png

dca8dd4f3cb603bd75810f52d53a87cd.png

对于各项指标进行单项波动预警,做到有上升就预警、有新增就预警,做到不放过、不遗漏。如:填写页业务报错量(可订服务、提交订单、失焦错误数),除了对各类报错率趋势进行监控外,还会综合实际用户流量,区分单项业务报错的流量大小进行预警,且对拆分多维度(单用户、单房型等)触发次数,便于寻找到有特性的badcase,快速定位用户遇到的问题,挖掘更多的业务优化点。

四、流畅度治理实践

在APP流畅度治理上,主要从页面启动加载速度,长列表卡顿治理,页面加载闪动三个方面进行了诸多优化实践,这些优化并没有涉及高大上的底层引擎优化技术,也没有复杂的数学理论基础,更没有重复造轮子。我们坚持以数据为导向,用数据驱动方案,用数据验证方案,发现问题,提出解决方案,解决问题。

4.1 页面加载速度优化

在页面加载速度优化上,我们从2021年8月份开始进行迭代优化至今,酒店预订流程页面的慢加载率从初始值的42.90%降低至现阶段的8.05%。

f34081a236b7eae175767dc32d13d0ba.png

在页面启动加载速度优化上,一般都会采用数据预获取方案,原理是在上一个页面提前获取服务数据,在用户跳转到当前页面时,直接从缓存获取,节省了数据的网络传输时间,达到快速展示当前页面内容的效果。目前在酒店核心预订流程,都运用了数据预加载技术,如下图所示:

162e6817f132d1d62803d7d194acdbe4.png

结合酒店业务特点,数据预加载需要考虑几个方面问题:第一,酒店预订流程页面PV量较高,酒店列表和详情页PV在千万级别。需要考虑数据预加载的时机,避免服务的资源浪费;第二,酒店列表、详情、订单填写页都有价格信息,价格信息对用户来说是动态信息,实时都有变价可能,所以需要考虑数据预加载的缓存策略,避免因为价格的前后不一致造成用户误解。

4.2 Flutter服务通道优化

携程APP采用的私有服务协议,目前发服务的动作还是在Native代码上,而酒店的核心页面已经转到了Flutter上。通过Flutter框架提供的通道技术,Native到Flutter的数据传输通道需要对数据做一次额外的序列化及反序列化的传输,同时传输的过程比较耗时,会阻塞UI的渲染主线程,对页面的加载会造成明显的影响。我们检测到这个环节之后,和公司的框架团队一起对Flutter的底层框架进行了改造,可以实现数据流直接的透传,同时不阻塞UI主线程,性能得到了极大的提升。

优化前,通过服务返回的数据流传递到Flutter使用,整个过程要经历以下4步:

①  PB反序列化

②  Reponse到JsonString的编码

③  JsonString到Flutter通道传输

④  JsonString到Reponse的解码

整个过程链路长,数据传输量大,效率低,影响到页面加载性能,如下图所示:

603c1056a796b3ab392b6fddda826f21.png

改造后,通过服务返回的数据流,直接传输到Flutter侧,在Flutter直接进行PB的反序列化,传输性能得到极大提升。

①  PB的数据流Flutter通道传输

②  PB反序列化到Reponse

整个过程链路短,数据传输量小,效率高,如下图所示:

6c2fa729eee4d16be65bf3916502e057.png

4.3 卡顿问题分析和定位

在 Flutter 中,可以利用性能图层(Performance Overlay),来分析渲染卡顿问题。如果 UI 产生了卡顿,它可以辅助我们分析并找到原因。如下图所示:

ed85be1c0a0b5a08a4b0dee0afb80a27.png

GPU线程的绘制性能情况在图表的上方,CPU UI线程的绘制情况显示在图表下方,蓝色垂线表示已渲染的帧,绿色色垂线代表的是当前帧。

为了保持60Hz 刷新频率,每一帧耗时都应该小于 16ms(1/60 秒)。如果其中有一帧处理时间过长,就会导致界面卡顿,图表中就会展示出一个红色竖条。下图演示了应用出现渲染和绘制耗时的情况下,性能图层的展示样式:

fcfa0ea4e10730157a21ee18a3baa833.png

如果红色竖条出现在 GPU 线程图表,意味着渲染的图形太复杂,导致无法快速渲染;而如果是出现在了 UI 线程图表,则表示 Dart 代码消耗了大量资源,需要优化代码执行时间。

另外我们可以借助于AS里面的Flutter Performance工具查看Flutter页面的rendering性能问题,里面有个很有用的功能Widget rebuild stats,它统计在渲染UI的时候,各个widget rebuild数量情况,可以辅助我们很快的定位存在问题的widget,如下图:

f2923d23c5152be022d8b4ec58692e61.png

UI CPU线程问题定位

UI线程问题实际就是应用性能瓶颈。比如在Widget构建时,在 build 方法中使用了一些复杂运算,或是在Root  Isolate 中进行了耗时的同步操作(比如IO)。这些都会明显增加 CPU 处理时间,造成卡顿。

我们可以使用 Flutter 提供的 Performance 工具,来记录应用的执行轨迹。Performance 是一个强大的性能分析工具,能够以时间轴的方式展示 CPU 的调用栈和执行时间,去检查代码中可疑的方法调用。在点击了Flutter Performance工具栏中的“Open DevTools”按钮之后,系统会自动打开 Dart DevTools 的网页,我们就可以开始分析代码中的性能问题了。

ce98cc0829477457d20f24831c137861.png

GPU问题定位

GPU 问题主要集中在底层渲染耗时上。有时候 Widget 树虽然构造起来容易,但在 GPU 线程下的渲染却很耗时。涉及 Widget 裁剪、蒙层这类多视图叠加渲染,或是由于缺少缓存导致静态图像的反复绘制,都会明显拖慢 GPU 的渲染速度可以使用性能图层提供的两项参数,负责检查多视图叠加的视图渲染开关checkerboardOffscreenLayers和负责检查缓存的图像开关checkerboardRasterCacheImages。

checkerboardOffscreenLayers

多视图叠加通常会用到 Canvas 里的 savaLayer 方法,这个方法在实现一些特定的效果(比如半透明)时非常有用,但由于其底层实现会在 GPU 渲染上涉及多图层的反复绘制,因此会带来较大的性能问题。对于 saveLayer方法使用情况的检查,我们只要在 MaterialApp 的初始化方法中,将 checkerboardOffscreenLayers 开关设置为 true,分析工具就会自动帮我们检测多视图叠加的情况了,使用了 saveLayer 的 Widget 会自动显示为棋盘格式,并随着页面刷新而闪烁。

不过,saveLayer 是一个较为底层的绘制方法,因此我们一般不会直接使用它,而是会通过一些功能性 Widget,在涉及需要剪切或半透明蒙层的场景中间接地使用。所以一旦遇到这种情况,我们需要思考一下是否一定要这么做,能不能通过其他方式来实现。如下图所示,因为详情头部bar用到高斯模糊,同时使用ClipRRect裁切圆角,ClipRRect会调到savelayer接口,所以该部分产生闪烁。

dd0a257af2fb64ede5d6f20ad3d29a85.png

checkerboardRasterCacheImages

从资源的角度看,另一类非常消耗性能的操作是,渲染图像。这是因为图像的渲染涉及 I/O、GPU 存储,以及不同通道的数据格式转换,因此渲染过程的构建需要消耗大量资源。

为了缓解 GPU 的压力,Flutter 提供了多层次的缓存快照,这样 Widget 重建时就无需重新绘制静态图像了。与检查多视图叠加渲染的checkerboardOffscreenLayers 参数类似,Flutter 也提供了检查缓存图像的开关 checkerboardRasterCacheImages,来检测在界面重绘时频繁闪烁的图像(即没有静态缓存)。

我们可以把需要静态缓存的图像加到 RepaintBoundary 中,RepaintBoundary 可以确定 Widget 树的重绘边界,如果图像足够复杂,Flutter 引擎会自动将其缓存,避免重复刷新。当然,因为缓存资源有限,如果引擎认为图像不够复杂,也可能会忽RepaintBoundary。

4.4 Ctrip React Native(简称CRN)页面的优化

下图是基本的CRN页面的加载流程,各个阶段的优化之前已有文章进行过描述,如容器预加载,Bundle拆分,容器复用,框架预加载等等在容器层面做了优化。

6def100c925bce8cac6343de45ff69b5.png

以酒店订单填写页为例,此页面采用了CRN的架构,在已有各类容器层面和框架层面的优化之后,我们重点对页面内重绘做了治理,并将重绘治理做到了极致,主要涉及到上图中的“5. 首屏首次渲染”和“7. 首屏二次渲染”。

4.4.1 页面内Action整合

此页面采用Redux架构,前期经历了几年的粗放式开发之后,页面内的action众多(Action通过异步事件的方式触发状态管理的改变,从而达到页面重绘的目的,可以参考Redux的 Action-Reducer-Store模式)。

优化前,如下图,页面初始化/开始加载/加载中/加载完成,均触发多个action,由于action是异步的,每个数据处理模块都有一些耗时和异步,加载完成后页面可能已经刷新,此处有可能展示了未处理完成的数据,等后续action执行完成后,页面会再次刷新。

由于有数据变化,页面内元素可能会有变化,从而对用户而言,页面产生了抖动,同时也会加大JS<=>Native的通信量,页面内元素的不断变化,也会不断刷新native中的渲染树,消耗大量CPU时间,进而导致页面不流畅,耗时较长。

524eca45ba602a0d4b14043974119ec8.png

针对上述情况,我们对页面内的Action做了整合:

  • 静态数据避免使用action

  • 触发时机相同的action尽量合并

  • 非必要数据延迟加载

  • 多层action的更新进行整合

整合后,页面内的action大致如下:基本只有页面初始化,主服务返回,以及后续子服务的action了。

d60e658ef10feed192d0f7116f907c03.png

在此过程中我们采用了redux-logger的方式来监控action,同时采用MessageQueue的方式来监控action变化触发刷新的情况,如下图:

053adc3e36be2f04123a4a6d735bfd00.png

4.4.2 控件重绘治理

为了更好的控制控件重绘的频率,我们对控件做了以下拆分:

  • 尽量的拆细组件

  • 降低单文件的复杂度

  • 组件复用更加方便

  • 依赖数据变少,状态更好管理

  • 局部更新数据不影响其他组件

  • 使用Fragments避免多层嵌套

拆分之后组件颗粒度更小,弱业务相关的采用了PureComponent,强业务组件采用Component+shouldComponentUpdate+自行比较属性是否变化来避免组件的重绘。

通过上述方式的治理,进入填写页内已明显感觉页面比较轻,主服务返回后页面立等可刷新,页面的渲染速度大幅提升。

重绘治理我们采用了https://github.com/welldone-software/why-did-you-render的方案来检测组件由于什么原因重绘,如下图:

c0668925c46c7a0ab280900cff7241ea.png

五、规划和总结

整个APP流畅度治理中,从流畅率从初始47%提升到目前80%,页面慢加载率从原来的45%降低到现在的8%,白屏率从1.9%降至现在的0.3%,主流程页面控件闪动基本消除,APP性能及用户体验有了较明显的提升。

回顾近半年中文酒店APP流畅度实践,整个过程艰辛,也时刻伴随着焦虑。流畅度每一点的进步都不是一蹴而就,轻易达成的。但对整个团队,收获满满,整个实践过程中,我们对flutter工程架构做了整体升级,尤其是数据传输层改造,业务层逻辑收口等;数据的预加载方案,也从1.0版本升级到2.0版本。最重要的是,整个团队形成了数据量化的思想意识和用户视角出发去优化和解决问题。

目前流畅度2.0的版本也已经落地实践,2.0将更多的不流畅感知因子加入流畅度统计,如主服务的二次加载,地图慢加载、图片及视频慢加载、图片及视频加载失败、弹窗及提示信息等,从更多系统及业务层面来提升用户的预订体验。

【推荐阅读】

90076114b1a52ca40d9713c072645220.png

 “携程技术”公众号

  分享,交流,成长

Flutter酒店预订界面-JavaScript开发 hotel_booking原始设计:https://dribbble.com/shots/7967793-Travel-App结果入门该项目是Flutter应用程序的起点。 如果这是您的酒店,那么一些资源可以帮助您入门。原始设计:https://dribbble.com/shots/7967793-Travel-App结果入门该项目是Flutter应用程序的起点。 如果这是您的第一个Flutter项目,则有一些资源可帮助您入门:实验:编写您的第一个Flutter应用程序食谱:有用的Flutter示例为了帮助Flutter入门,请查看我们的在线文档,其中提供了教程,示例,移动开发指南,以及完整的API参考。 立即下载

相关推荐

flutter_booking_app:这是由 Uplabs.com 上的“Hananda Ilham Z”设计的涵盖 UXUI 的预订应用程序

Flutter 预订应用 关于 这是由设计的涵盖 UX/UI 的预订应用程序 布局 登录屏幕 :sparkles: (第一屏) :sparkles: 2 TextField(不是身份验证处理,不是格式或正则表达式) 2 社交按钮(非功能或方向) 登录按钮(导航到主屏幕) 注册文本(导航到注册屏幕) 注册屏幕 :sparkles: (当用户单击登录屏幕中的注册文本时) :sparkles: 5 页面浏览 注册页面视图(必须填写,可以通过下拉按钮选择位置) OTP 页面视图(必须填写) 添加电子邮件页面视图 添加密码PageView(必须填写,有提示) 主屏幕 :sparkles: (当用户在登录屏幕/完成注册屏幕中单击登录按钮时) :sparkles: 顶吧 服务标签 预订卡(ListView - 可以交互) 灵感卡(ListView - 非交互式) 详细画面 :sparkles: (当用户单击主屏幕中的预订卡时) :sparkles: 酒店/度假村背景 DraggableBottomSheet(显

卡顿如何监控?

卡顿问题也是 Android 性能优化中的一个常见问题,本文介绍了应该如何衡量页面卡顿程度,重点介绍了如何使用 JankStats 统计卡顿率,同时介绍了子线程定时 Dump 主线程堆栈,字节码插桩两种定位慢函数的方式。基于以上内容,我们可以建立页面的卡顿指标,在发现卡顿时也可以较为准确地定位慢函数以进行治理,希望对你有所帮助~源码本文所有源码可见:Android卡顿如何监控?

chuyouyinghe的专栏 1467

2024高教社杯数学建模国赛B题丨国一原创论文解析及源码超详细分享!

继续分享一篇2024国赛B题的国奖论文,包含可运行源代码jupyter,国赛B题通常比较聚焦实际复杂系统的多目标优化决策,主要偏重算法实现与概率建模解决开放性的管理问题。而且高度开放,无标准答案,学科交叉复杂,如资源调度、交通优化、海洋探测等。比较建议有一定统计学基础的同学参加。

ihui永不放弃 6738

干货 | 携程动态表单DynamicForm的设计与实现

作者简介Daryl,携程高级研发经理,关注业界大前端及高并发应用解决方案。一、简介在很多软件系统中,表单开发都是很重要的一个部分。在表单开发中,往往会遇到重复开发的问题,例如在页面搭建系...

携程技术 5290

OpenAI Codex 桌面端国内使用全坑解決指南(2026 Windows 实测)

本地文件报错:SQLite 初始化失败、启动闪退、卡加载页 → 本地缓存/数据库损坏,和网络无关网络地区报错→ 网络IP/地区被拦截,和本地软件文件无关Codex 桌面端的大部分报错,都不是软件故障,而是海外软件适配国内网络、国内模型协议不兼容导致的适配问题。不用盲目重装、换网络、改系统设置,只要区分「本地文件问题」和「网络地区问题」,搭配国内大模型 API 替代方案,就能完美解决所有痛点。(注:部分内容可能由 AI 生成)

ups_hxc的博客 1092

dos攻击 --hping3

dos使用hping3攻击

qq_65880213的博客 2747

干货 | 携程商旅订单系统架构设计和优化实践

作者简介Gavin, 携程技术专家, 致力于系统优化、重构和开发效率提升。概述携程商旅是一站式互联网差旅服务平台,为客户提供差旅管控、预订、出行、结算、成本、风控等服务的在线TMC(Tr...

携程技术 5318

Python在Genesis2000 CAM软件中的编程应用

Genesis2000是一款功能强大的计算机辅助制造(CAM)软件,它提供了广泛的功能和工具,用于帮助制造商进行CAD(计算机辅助设计)到CAM的转换。在Genesis2000中,我们可以利用Python的灵活性和功能来扩展软件的自定义能力,并通过编写脚本来自动化各种制造任务。例如,假设我们需要在Genesis2000中添加一个新的操作,用于自动计算零部件的重量。我们可以编写一个Python脚本,通过遍历模型的几何数据并应用相关的计算公式,来实现这个功能。

PixelEnigma的博客 2423

flutter offset_Flutter 渲染引擎详解 - RasterCache 与间接光栅化

写作费时,敬请点赞,关注,收藏三连。Flutter 渲染引擎详解系列文章Flutter 渲染引擎详解 - iOS Metal 篇 Flutter 渲染引擎详解 - iOS GL 篇 Flutter 渲染引擎详解 - Android GL 篇在渲染流水线中的光栅化文章中,我介绍了不同渲染引擎使用的不同光栅化的策略。在 Flutter 的渲染引擎中,使用的是所谓的同步光栅化或者也称为即时光栅化(On ...

weixin_39674978的博客 433

GhidraMCP:AI驱动的逆向工程革命——让LLM自主操作Ghidra进行自动化分析

(Ghidra Machine Control Protocol)应运而生,它通过将LLM与Ghidra(美国NSA开源逆向工具)结合,实现了AI驱动的自动化逆向工程流程。逆向工程是软件安全、漏洞分析和代码审计的核心环节,但传统方法依赖人工分析,耗时且易出错。未来,随着LLM技术的演进和逆向工程工具的优化,GhidraMCP有望成为安全研究人员和开发者的核心工具,推动逆向工程进入“AI辅助时代”。GhidraMCP通过LLM与Ghidra的深度整合,重新定义了逆向工程的自动化边界。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2115

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

Flutter 图片库重磅开源!

PowerImage 是一个充分利用 native 原生图片库能力、高扩展性的flutter图片库。

qq_32198115的博客 717

GEE APP:基于Sentinel-1 SAR数据的洪水检测与制图系统:利用GEE平台实现洪涝区域提取、面积统计及矢量栅格化导出

本文介绍了一个基于Google Earth Engine平台的Sentinel-1 SAR洪水监测应用,通过自动化流程实现洪水淹没区域的精准检测与分析。系统采用Refined Lee滤波降噪和Otsu自适应阈值算法,结合SRTM地形数据消除干扰,可自动计算淹没面积并生成可视化结果。该工具提供用户友好的交互界面,支持多格式数据导出,适用于灾害应急响应、环境监测和城市规划等领域,具有云平台处理、算法鲁棒性强和操作简便等技术优势。

此星光明博客 327

APP流畅度优化策略

优化主要是为了更好的用户体验、流畅度、安全性。这篇主要考虑流畅。媒介速度寄存器>内存>硬盘>网络内存:Cache,内存的分配方式硬盘:数据库分页、索引、事务处理等网络:异步加载+ CacheCPU 和 GPU一般开发都是没有充分利用GPU的,iOS加载画面的时候CPU 和 GPU都参与了实现,了解里面的实现,让CPU和GPU分担运算任务,以比较优化的方式达到平衡。GPU一般系统调用的更多,自己需要注

码农Peter 1774

Apache DolphinScheduler 实现了对 OceanBase 的元数据库支持

Apache DolphinScheduler 是一款开源的分布式工作流任务调度系统,它提供了可视化的工作流设计和调度功能,支持大数据任务的自动化调度和监控。最近的更新中,Apache DolphinScheduler 引入了对 OceanBase 数据库的元数据库支持,这为用户在大数据环境中管理和调度任务提供了更多选择。用户可以通过 DolphinScheduler 提供的可视化界面进行工作流的设计和调度,也可以通过 DolphinScheduler 提供的 API 进行任务的编程调度。

VavzNvml的博客 495

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ArchSummit直击|构建顺滑自然的 Flutter 页面

讲师介绍淘系技术部 | 闲鱼技术部| 云从“围绕 Flutter 流畅度体感优化,分享了挑战、线上线下监控工具建设、优化手段在组件容器沉淀,最后给出了优化建议。"张云龙(云从),闲鱼客户...

闲鱼技术的博客 1747

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Flutter三天学会之后模仿美团界面

一,上图吧 二,平静的时候适合写代码,烦躁了,打篮球,转圈圈合适,这几天下班有时间,写了美团最炫酷的三个界面。Flutter就是这么强大,但是写了三天的代码,发现再好的封装,都觉得这些代码只有自己好找,换做别人都得点进去一个个的找小部件。哈哈,不说了,今天介绍第三个我的个人界面。如下图,实现弯曲的贝塞尔曲线,如何写出这样美丽的线性渐变格调,诗一样的布局,和人你是最喜欢的。图: ...

Stay hungry, stay foolish!! 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Flutter_29_Flutter性能监控和优化

Flutter、Golang、Python、编译原理、算法、Chrome原理学习系列文章抢先看请关注【码农帮派】: 在Flutter中性能问题可以分为GPU线程问题、UI线程(CPU)问题。这两类问题可以通过Flutter提供的性能图层进行定位分析。 性能图层(Performance Overlay) Flutter为了帮助开发者定位代码中的性能问题,提供了性能图层,它可以让...

天马行空的专栏 2138

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 417

Day3 - Flink 窗口与时间语义:从滚动窗口到迟到数据处理

水位线是一个特殊的时间戳,代表"小于这个时间戳的数据都已经到齐了比如水位线推进到 10:00:05,就告诉 Flink:10:00:05 之前的数据应该都到了,如果还有晚于这个时间到达但时间戳小于 10:00:05 的数据,就是"迟到数据"。窗口大小固定,窗口之间不重叠,数据只属于一个窗口。时间线: 0 10 20 30 40 50 60窗口1: [--------)窗口2: [--------)窗口3: [--------)窗口4: [--------)

YEEMOLY的博客 245

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 647

行业研究报告采购避坑指南:从需求拆解到机构选型的实操逻辑

先说结论:买行业研究报告这件事,坑不在“哪家便宜”,而在“你拿到的数据能不能回答你的问题”。作为一个经常帮企业做采购决策的顾问,我见过太多花了几万块买回一堆PDF却用不上的案例。这篇文章把采购流程拆成五步,每一步告诉你该看什么、该避什么,尽量帮你少交学费。

2601_96585642的博客 221

深入浅出聊聊 Linux 的 PageCache 与系统极致性能

本文深入浅出解析了 Linux PageCache 的核心机制,揭示其如何通过“延迟写、预读读”提升系统性能。以监控告警为切入点,阐明 free -h 中 buff/cache 并非真正占用,真正可用内存由 available 决定。结合 Kafka、Elasticsearch、MySQL 等实战场景,说明中间件如何依赖 PageCache 实现极致性能。强调不可手动清理缓存,并建议合理调优脏页参数,避免卡顿。最终指出:内存满≠危机,而是系统高效运行的体现。

小小默:进无止境 447

代购系统改造:服务无状态化、分级隔离

代购系统因链路长、流量脉冲、写放大等特点,高可用设计需聚焦“消灭单点”。通过服务无状态化、分级隔离、数据库与消息队列容灾、监控告警与混沌工程验证,实现MTTR降至3分钟内,支付成功率超99.9%。核心经验:缓存雪崩防于过期策略,跨地域用短TTL GeoDNS,支付降级必须幂等。高可用本质是持续检验“无单点”假设的闭环体系。

2601_95706522的博客 161

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 328

Elasticsearch:稠密向量字段类型

dense_vector字段用于存储稠密向量,支持k近邻搜索(kNN),默认启用索引并使用余弦相似度。可接受浮点数数组或Base64编码字符串输入,支持自动量化(如int8、int4、bbq)以降低内存占用。通过index_options配置索引类型(如hnsw、bbq_disk),并可启用过采样与重新评分提升精度。向量默认不存储于_source中以节省空间,可通过fields或_source.exclude_vectors显式返回。支持bit向量及GPU加速索引,适用于高维向量场景。

Elastic 中国社区官方博客 267
上一篇: 干货 | 携程公共技术支持运营实践
下一篇: 干货 | 携程机票前端Svelte生产实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值