双11大型互动游戏“喵果总动员” 质量保障方案总结
推荐语:互动游戏是一个系统化工程,在笔者的“喵果总动员”质量方案中,可以看到为保障用户体验,我们在各个难点的解决方案, 例如:用线上压测能力支持业务及时调整各服务容量、通过强化学习覆盖游戏行业的测试路径覆盖难题、利用系统异常注入发现corner case等, 都为互动游戏的系统性质量保障提供了方法。
——大淘宝技术质量工程师 搏天
背景介绍
2022年淘宝双11的互动游戏推出三款游戏:单人割草升级、多人组队PK、在线猜题闯关,兼顾了不同用户对休闲娱乐和竞技对抗的差异化诉求。
▐ 玩法核心策略
单人割草升级:魔性有趣的核心玩法吸引用户,创造记忆点;操作简单易上手,降低用户学习门槛。
多人组队PK:复刻盖楼狂欢,增加竞技的刺激感。
在线猜题闯关:每天定时开启价格竞猜玩法,营造大促氛围,打造话题爆点。
核心挑战
▐ 相较于往年大促的变化
猜价格玩法流量集中,严格时序,用户有异常退出、提前结束比赛的风险
猜价格每天12点、18点准时发车,用户需要提前停留在页面参与,因此会有集中的流量流入,预计千万量级用户参与。猜价格玩法要求严格时序,依次进行查看题目、提交答案、查看排名、使用复活卡等操作,过程中因用户网络超时或者切后台等原因导致用户没有在规定时间内完成对应操作,导致无法完成比赛。
IGF游戏化架构重构了PK模型,引入的数据一致性风险
虽然PK玩法相较于过去两年没有明显的变化,但是技术架构的重构依然引入一些新的数据一致性风险和问题:
新的序列化协议数据压缩方案:序列化性能、对于某些特定的数据类型是否支撑,数据是否存在丢失的问题
新的玩家-战队-房间存储模型设计:今年核心数据首次选择了存储在RDB中,数据迁移过程中的异常重试,并发锁、幂等重试的逻辑需要重新设计,重点保障。
RDB核心用户资产数据存储的稳定性:数据大小/QPS对存储的性能的影响,RDB对核心资产数据的监控和对账能力保障,数据丢失后的回补能力。
实时类互动对端性能要求更高
从端性能问题导致的影响来看,crash,渲染不出来等问题会直接影响到用户行为链路的中断,卡顿会导致用户关键操作的决策、失真,掉电过快等问题会导致用户对游戏品质的质疑从而流失。
从问题发生的概率来讲,这次整个地图渲染的实体更多,端计算存储量增多,更加对端性能提出了更高的要求。
割草玩法前端计算和存储,引入的场景覆盖、安全性等新问题
本次单人割草玩法,战斗逻辑写在客户端。战斗逻辑是包括技能逻辑、普攻、属性、伤害、移动、AI、检测、碰撞等等的一系列内容。这块在互动是全新的技术尝试,以往所有的逻辑都是在服务端处理。所以端计算数据存储稳定性&逻辑一致性的验证比以往的要求更高,例如数据丢失后的回档问题。
另外就是安全性问题,以往所有逻辑和数值都是在服务端,如果想作弊,就必须攻击服务器,而攻击服务器的难度比更改自己客户端数据的难度高得多,而且更容易被追踪,被追踪到了还会有极高的法律风险。而帧同步因为所有数据全部在客户端,所以解析客户端的数据之后,就可以轻松达到自己想要的效果,例如 moba 类游戏的全图挂,吃鸡游戏的透视挂,都是没办法防止的,而更改数据达到胜利的作弊方式(例如更改自己的英雄攻击力)可以通过服务器比对同局其他人的战斗结果来预防。
▐ 风险评估表
测试内容 | 风险等级 | 测试策略 | 风险点 |
单人-割草收能量 | 高 | 功能测试、前端碰撞模型算法测试、故障点测试、兼容性测试 | 1.草的割取和能量的收取的一致性 2.关键地图信息、背包能量、PK道具buff等信息存储在indexDB&localStorage的稳定性保障 3.客户端性能的风险:crash,渲染不出来,卡顿、失真 4.前端防刷,防止有用户能快速刷满所有能量 |
单人-升级发红包 | 中 | 功能测试、故障点测试 | 1.能量和等级一致性保障,升级发红包 |
兑奖 | 中 | 功能测试、故障点测试 | 1.红包必得的逻辑保障 |
IGF序列化协议 | 中 | 功能测试,性能测试 | 1.序列化后的字节数大小 2.序列化和反序列化的效率 3.是否支持被序列化对象新旧版本的兼容性问题。 4.是否可以直接序列化对象,而不需要额外的辅助类 |
猜价格-并发度 | 高 | 功能测试、故障点测试、性能测试 | 1.通过性能压测摸底,合理安排资源和限流,最大程度保障用户体验 2.限流情况下的产品/前端表达,引导用户重试 或 补偿 3.前端打散请求 4.前端防刷,减少无效请求 |
猜价格-排名算法 | 中 | 功能测试、故障点测试、性能测试 | 1.排名算法时效性要求高,从方案层面设计未能及时产出结果的保障方案 2.通过性能压测摸底,合理设计限流,最大程度保障用户体验 |
猜价格-选品一致性 | 中 | 方案设计保障、定时巡检 | 1.从方案层面,保证选品价格不能轻易变更 或者 活动方案不依赖选品实时状态 2.保证项目组能第一时间感知选品价格变更、上下架变更 |
猜价格-异常重连 | 中 | 功能测试、故障点测试 | 1.方案层面保障用户在任何异常(主动退出、crash等)、任何状态下,都能有重连的机制 |
质量保障方案
本次双11的测试目标是“大规模用户同时在线下的实时游戏类互动的质量保障”。目标是0故障、0资损、用户游戏体验流畅度,千万用户同时在线。
▐ 目标
核心策略如图所示:
▐ 目标完成情况
定义了双11主互动体验的目标,新增回档率等体验指标,分析过程中数据,优化提升体验水位:中断率、可视时间、帧率等,高峰期无大规模体验舆情,主互动发热、卡顿显著改善。舆情15分钟定位。
无稳定性问题造成的大规模用户舆情和核心链路不可用问题:事前压测数据构造了亿级战队,高峰期千万用户行为模拟;上线前期通过观察流量占比/数据存储大小,发现地图上报接口流量模型不一致的风险;根据当前架构梳理出低成本的线上可压测方案,具备稳定性变更可验证的能力。
自动生成用例占比76%:冒烟用例场景开发可执行占比67%,异常场景覆盖占比85%
专项建设和结果
▐ 稳定性测试策略——线上压测能力建设
除了事前——让压测方案更加趋近真实、和事中——数据观察,模型修正的方案外,本次双11稳定性测试想要重点建设线上压测的能力。
解决的问题
预期外的流量,作为线上容器&存储的扩容的演练手段
压测模型评估不准确的情况下,线上需要变更的验证能力
核心原则
线上容器&存储资源等系统稳定性不受影响
线上压测执行
压测实战最重要的两点是确保压测结果的可靠性以及保证压测对线上性能无影响。
不影响线上稳定性的几个关键点
容器的稳定性
理想情况:将服务单独部署到相同规格的机器上,从物理层面将压测系统与真实业务系统进行隔离,确保压测对真实业务系统的硬件资源无影响。缺点:成本高
可行性方案:线上压测的目的不是为了压系统的瓶颈,是为了验证预期流量下的系统表现,因此可以在业务流量低峰期在当前集群进行线上压测,拉起流量还原发生问题时的场景,对容器的压力可控,风险较低。
数据隔离的安全性
DB的数据隔离:DB数据隔离一般有两种方式:通过新建影子表或新建一套db来保证压测数据与真实业务数据隔离,确保压测数据不会污染线上数据。
新建db的时间成本和资金成本很高,本次互动玩法DB只存储个人-战队-房间的索引关系和流水,单行的数据量较小。经过压测验证,读写的高峰发生在匹配和结算的定时任务时,系统可以通过限制任务的执行的速度,使DB性能处于安全水位之下。用户自然流量对于DB的读写的峰值按照200%的流量模型评估在QPS、TPS、接口成功率、RT评估均无性能风险,因此可以采用影子表作为数据隔离策略。
在压测系统水位时以影子表作为数据隔离策略,需要注意的是影子表与真实的线上表存在于一个db中,压测对db整体性能存在影响,可以选择用户访问量低谷时间段内进行压测来能保证压测不影响线上用户且保证压测结果的可靠性。
RDB的数据隔离:RDB是本次核心数据的存储,RDB没有DB影子表的隔离能力,可以通过申请新的RDB实例进行物理隔离,底层IGF框架通过配置进行压测流量的路由。
LDB的数据隔离:LDB支持影子链路存储的隔离能力,业务层无需改造
本地缓存隔离:记录时需要带上影子标记,和正常流量进行区分
中间件隔离
压测服务使用单独的版本号,可以将压测服务与真实业务服务隔离,确保线上流量不会打进压测系统;
通过修改压测应用groupId实现定时任务的分组隔离,保证线上任务不会调用压测机器执行等等。
保证压测结果可靠性的几个关键点
压测接口要满足压测需求:
在对存在上下游依赖的业务链路压测时,会将该业务链中的功能接口组装成几个压测接口,该压测接口应体现真实业务链路的上下游依赖。
业务逻辑改动要仿真业务场景:
在不改变业务请求对系统性能产生的影响时,开发同学可能会修改部分业务逻辑进行压测。比如:真实业务链路的非幂等性导致同一用户在同一状态下只能进入该业务链路一次,这种场景对压测造成的最直观影响是需要生成极大量入参来满足压测需求。为解决该问题,开发同学可能会将压测的业务链路修改为幂等业务链,此时便需要注意当前修改不能改变请求对系统稳定性的影响。
qps配比要仿真业务场景:
在同一场景下,不同接口的qps配比是否能够反映真实业务场景是判断压测结果是否可靠的重要依据。qps配比需要基于能够衡量真实业务访问量的统计结果来制定。
入参满足业务仿真的需求:
如果入参的取值对系统稳定性影响较大(比如:不同的入参对cpu计算量或者io访问时长影响较大;相同的入参并发请求时,对io阻塞影响较重;等等。),需要调研真实业务场景的入参并发间隔、入参离散程度来设计压测入参。
影子数据满足业务仿真的需求:
若通过分析发现,db数据不是本次压测需求的瓶颈或关键点,可以忽略此条建议。不过最好还是在压测前将线上数据同步到影子表,做到高度仿真,RDB同理。
关键问题
数据准备
线上真实数据同步到新的RDB实例,目的是能做到数据存储大小的仿真。
备份恢复方案概览
类别 | 实施方案 | 说明 | 是否采纳 |
数据备份 | 自动或手动备份 | 云数据库Redis支持数据持久化,会按照默认的策略自动备份数据(基于 RDB ),您可以根据业务需求修改自动备份策略,也可以手动发起临时的备份。 | 是 |
下载备份文件 | 云数据库Redis的备份文件会免费保留7天,如果需要更长时间的备份存档(例如监管或信息安全需要),您可以将备份文件下载到本地进行存储。 | 备份文件过大,无法本地存储 | |
使用redis-shake备份Redis实例 | 通过Redis-shake 的dump模式,您可以将Redis实例中的数据备份为RDB文件并存储至本地。 | 备份文件过大,无法本地存储 | |
数据恢复 | 从备份集恢复至新实例 | 云数据库Redis支持从指定的备份集创建新实例,新实例中的数据将和该备份集中的数据一致,可用于数据恢复、快速部署业务或数据验证等场景。 | 是 |
通过数据闪回按时间点恢复数据 | 开启数据闪回功能(基于 AOF )后,在备份文件的保存期内,您可以恢复指定时间点(精确到秒级)的Redis数据,可最大限度地避免误操作带来的数据损失,或者在频繁回档的业务场景快速完成数据切换。说明 该功能仅在企业版(内存型)中支持。 | 否 | |
使用redis-shake恢复数据 | 借助Redis-shake的restore模式,您可以恢复RDB文件到Redis。 | 否 |
参考:https://help.aliyun.com/document_detail/43886.html
链路改造
上线前的压测链路改造保留
压测环境
准备时长:千万账号登录加压测数据上传同步amazon压测平台时间较长,可在流量低峰期操作减少登陆的时间。
▐ 瓦力——基于强化学习引擎的PK全链路场景自动生成
互动瓦力机器人是大淘宝技术互动测试团队于2019年推出的一款用户行为链路仿真平台,底层基于强化学习引擎实现了用例的自动生成,解决了互动业务测“新”的痛点问题,如今已广泛应用于天猫淘宝大促主互动场景和芭芭农场、淘金币等多个日常业务。
之前我们的工作模式更多是在提测后做质量保障工作,包括功能验证、稳定性性能、资损等等,通过提测后问题发现和风险发现,来保障整体的交付质量,往往在最后的提测阶段暴露大量的风险和问题,导致整个项目再最后时间压力最大。从2022年618开始,我们尝试重点解决开发自测和前后端联调阶段,开发不明确自测场景范围以及测试数据/环境无法快速构造,自测用例无法执行的痛点问题。
以本次的“喵糖总动员”的结算场景为例,需要先组成多个战队,离线DTS任务匹配,穿越到PK期,升级/助力,最后才能进入结算,整个链路的测试成本是非常高的。
借助强化学习用例生成引擎,简化了测试用例前置条件(用例特征)的构造成本,用例特征原子化,在提测前快速生成了60+的冒烟用例,占比全用例的76%,提测通过率100%,提测冒烟时间从过去的3天缩短至1天。
挑战与技术创新点
借助瓦力机器人提升了核心场景的自动生成能力
问题和风险前置,提高了联调和冒烟阶段开发自测的效率,提前发现问题19个
沉淀了可稳定执行的场景case,变更后可快速回归验证
问题和展望
继续提升开发联调和自测阶段可执行用例的占比,提升研发自测的幸福感
简化用例的表达和执行结果的描述,减少用户理解的成本
▐ 大白——业务异常场景自动生成
业务容灾平台-bighero大白,一种不需要编写脚本,通过分析正常流量的核心调用依赖批量生成异常用例,并通过互动机器人,鹰眼标,凤凰和jvm-sandbox构造流量隔离的异常用例执行环境,最后针对异常用例结果进行系统化布防的测试工具;目标是在上线前自动识别出系统的潜在风险,并通过布防等方式将业务损失降到最小。
挑战与技术创新点
IGF框架的引入,放大了同方法多次调用异常精准命中需求,本次基于链路上下文,开发了指定方法index||参数的用例生成&攻防
满足特殊异常链路的覆盖,自定义异常返回
异步消息链路的异常测试
hsf接口进行异常用例的自动生成和攻防(将定时任务包成hsf接口进行同逻辑小数据测试)
避免同接口异常误命中,叠加参数进行攻防对象的流量筛选
落地效果
自动化产出喵果总动员有效容灾用例:216条
P1P2故障点覆盖率为:82.6%
多人:15个P1P2故障点,12个覆盖,占比80%
开奖:4个P1 P2故障点,4个覆盖,占比100%
单人:4个P1P2故障点,3个覆盖,占比75%
展望
提升大白-异常测试平台的产品化程度,降低异常测试的使用门槛,简化使用流程
提高异常场景的覆盖面:MT、并发、奥格、安全等
提升异常攻防的自动化程度
未来展望
挑战:
大规模用户实时在线游戏已经成为互动游戏发展的必然趋势,同时在线、低时延、3D渲染等新的课题对互动游戏化架构的稳定性保障、体验标准衡量等提出了更高的要求。
短期规划:
通过完善交付场景用例的生成和执行能力,提供给开发更多的自测验证的场景和手段,提升研发自测阶段的效率,提升交付的质量。
预研大规模用户实时在线游戏下的架构,梳理相关问题和技术难点,构建相应的质量保障策略和方案。
团队介绍
我们是大淘宝技术质量团队,负责保障整个淘宝和天猫主站的业务质量,一直致力于技术驱动,构建业界领先的质量体系。
我们有QCon、QECon、MTSC、GIAC、绿盟、TOP100 Summit等众多行业大会的讲师,有GitHub获得3.2k Star的开源产品JVM-Sandbox作者,最关键的是有对技术极致追求,对生活充满热爱的大家庭,欢迎加入我们,简历投递邮箱:wenbo.shb@alibaba-inc.com。
¤ 拓展阅读 ¤
3DXR技术 | 终端技术 | 音视频技术
服务端技术 | 技术质量 | 数据算法
相关文章:

双11大型互动游戏“喵果总动员” 质量保障方案总结
推荐语:互动游戏是一个系统化工程,在笔者的“喵果总动员”质量方案中,可以看到为保障用户体验,我们在各个难点的解决方案, 例如:用线上压测能力支持业务及时调整各服务容量、通过强化学习覆盖游戏行业的测试…...
剑指Offer专项突击版题解一
1.整数除法 思想:不能用除法、乘法、取余,那么可以用减法完成除法的操作,但是在减去被除数的时候,可以考虑被除数<<1扩大一倍在进行减少,加快减的速率。 2.二进制加法 思想:从末尾向前遍历࿰…...

Django框架之模型
模型 当前项目的开发, 都是数据驱动的。 以下为书籍信息管理的数据关系:书籍和人物是 :一对多关系 要先分析出项目中所需要的数据, 然后设计数据库表. 书籍信息表 字段名字段类型字段说明idAutoField主键nameCharField书名 idname1西游记2三国演义…...

OSACN-Net:使用深度学习和Gabor心电图信号谱图进行睡眠呼吸暂停分类
这篇文章在之前读过一次,其主要的思路就是利用Gabor变换,将心电信号转变为光谱图进行识别研究,总体来讲,不同于其他的利用心电信号分类的算法,该论文将心电信号转换为光谱图,在此基础上,分类问题…...

使用开源实时监控系统 HertzBeat 5分钟搞定 Mysql 数据库监控告警
使用开源实时监控系统 HertzBeat 对 Mysql 数据库监控告警实践,5分钟搞定! Mysql 数据库介绍 MySQL是一个开源关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的开源关系型数据库管理系统之…...

插件 sortablejs:HTML元素可拖动排序
插件 sortablejs 用于可重新排序拖放列表的JavaScript库;关键链接:npm 地址 Github 地址 安装 npm i sortablejs引入 import Sortable from "sortablejs"HTML <ul id"items"><li>item 1</li><li>item …...

libVLC 视频裁剪
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 裁剪是指去除图像的外部部分,也就是从图像的左,右,顶部和/或底部移除一些东西。通常在视频中,裁剪是一种通过剪切不需要的部分来改变宽高比的特殊方式。 尤其是在做视频墙时,往往需要处理多个 vlc 实例…...

LAMP架构介绍及配置
LAMP架构介绍及配置一、LAMP简介与概述1、LAMP平台概述2、LAMP各组件主要作用3、构建LAMP平台二、编译安装Apache htpd服务1、将所需软件包上传到/opt目录下2、解压以下文件3、移动两个文件并改名4、安装所需工具5、编译安装6、做软连接,使文件可执行7、优化配置文件…...

Android图形显示流程简介
注:本文缩写说明本文代码都是基于Android S一、概述本文将对从App画出一帧画面到这帧画面是如何到达屏幕并最终被人眼看到的这一过程进行简要分析,并将这其中涉及到的各个流程与其在systrace上的体现对应起来,期望最终能够让读者对Android系统…...

4.5.3 ArrayList
文章目录1.特点2. 练习:ArrayList测试3.ArrayList扩容1.特点 存在java.util包中内部是用数组结构存放数据,封装数组的操作,每个对象都有下标内部数组默认的初始容量是10,如果不够会以1.5倍的容量增长查询快,增删数据效率会低 2. 练习:ArrayList测试 package partThree;import…...

十二、Linux文件 - fseek函数讲解
目录 一、fseek函数讲解 二、fseek函数实战 一、fseek函数讲解 重定向文件内部的指针 注:光标 ---- 文件内部的指针 函数原型: int fseek(FILE *stream,long offset,int framewhere) 参数: stream:文件指针offset:…...

Python3.10新特性之match语句示例详解
这篇文章主要为大家介绍了Python3.10新特性之match语句示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪正文在Python 3.10发布之前,Python是没有类似于其他语言中switch语句的&…...

虎牙盈利能力得到改善,但监管风险对其收入产生负面影响
来源:猛兽财经 作者:猛兽财经 监管风险再次成为焦点 过去一段时间,与中概股相关的监管风险再次引起了投资者的注意,这也是正在考虑投资虎牙(HUYA)的投资者需要注意的问题。 例如,监管机构在2022…...
HBase 分布式搭建
前言: 请先确保 Hadoop 集群搭建完成。 Hadoop 完全分布式搭建(超详细)搭建环境介绍: 三台主机,一主两从,系统为 Centos 7.5。 相关组件版本信息如下: jdk1.8hadoop-3.1.3zookeeper-3.5.7hbase-2.2.3注意,以下安装教程中涉及到的路径请替换成自己的! ZooKeeper 安…...
【Python】修改枚举的取值及链式调用
author: jwensh date: 2023.02.11 文章目录枚举的取值及链式调用需求背景1. enum.key 即获取值(而不是 enum.key.value)2. 多级链式调用枚举的取值及链式调用 需求背景 测试过程中需要很多参数化的设置及编程规范要求,希望修改数据不修改代…...

复现篇--zi2zi
intro: 用GAN学习东亚语言字体。zi2zi(意思是从字符到字符)是最近流行的pix2pix模型在汉字上的应用和扩展。 article:https://kaonashi-tyc.github.io/2017/04/06/zi2zi.html code:https://github.com/kaonashi-tyc/zi2zi pytorch版本:https://github.com/EuphoriaYan/zi2…...

153、【动态规划】leetcode ——416. 分割等和子集:滚动数组(C++版本)
题目描述 原题链接:1049. 最后一块石头的重量 II 解题思路 本题要找的是最小重量,我们可以将石头划分成两个集合,当两个集合的重量越接近时,相减后,可达到的装量就会是最小,此时本题的思路其实就类似于 4…...

linux head命令(head指令)(获取文件或管道输出结果前n行,默认前10行)与sed命令区别
head命令是一个在Linux系统中常用的命令,用于读取文件的前几行(默认读取前10行) 文章目录使用方法读取文件的前10行:head filename读取文件的前n行:head -n行数 filename读取多个文件的前几行:head -n 行数…...

Mysql数据库09——分组聚合函数
类似pandas里面的groupby函数,SQL里面的GROUP BY子句也是可以达到分组聚合的效果。 常用的聚合函数有COUNT(),SUM(),AVG(),MAX(),MIN(),其用法看名字都看的出来,下面一一介绍 聚合函数 COUNT()计数 统计student表中计科系学生的人数。 SE…...
第43章 菜单实体及其约束规则的定义实现
1 Core.Domain.Security.Menu namespace Core.Domain.Security { /// <summary> /// 【菜单--类】 /// <remarks> /// 摘要: /// 通过该实体类及其属性成员,用于实现当前程序【Core】.【领域】.【安全】.【菜单】实体与“[ShopDemo].[…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...