UE Mutiplayer(1):网络概述
文章目录
- 一、Replication
- 二、基本网络概念
- 2.1 网络模式和服务器类型
- 2.2 Actor复制
- 2.3 网络角色和授权
- 2.4 客户端拥有权
- 2.5 相关性和优先级
- 三、变量复制
- 四、远程过程调用(RPC)
一、Replication
- 在虚幻引擎中,在客户端与服务器间同步数据和调用程序的过程被称为复制
Replication。
- 参考链接:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/networking-and-multiplayer-in-unreal-engine?application_version=5.2
- 服务器作为游戏主机,保留一个真实授权的游戏状态。换句话说,服务器是多人游戏实际发生的地方。客户端会远程控制其在服务器上各自拥有的
Pawn,发送过程调用以使其执行游戏操作。但服务器不会将视觉效果直接流送至客户端显示器。服务器会将游戏状态信息复制到各客户端,告知应存在的Actor、此类Actor的行为,以及不同变量应拥有的值。然后各客户端使用此信息,对服务器上正在发生的情况进行高度模拟。 - 在网络游戏中,此类交互发生在多个不同场景:服务器上的场景、玩家1客户端的场景、玩家2客户端的场景,以及参与会话的其他所有客户端的额外场景。每台不同机器上的各场景均有各自的
Pawn、武器及发射物的副本。服务器是游戏真正运行的地方,但我们要让客户端的场景看似发生了相同事件。因此,需要选择性地向各客户端发送信息,以在服务器上创建场景的视觉代表。 - 这一过程将在基础游戏交互(碰撞、移动、伤害)、美化效果(视觉效果和音效)和私人玩家信息(HUD更新)间进行划分。这三者各自与网络中的特定机器或机组关联。但是,此信息的复制过程并非完全自动,游戏编程时须指定要复制的信息和接收副本的机器。主要的难点在于选择应复制的信息及方式,以向所有玩家提供一致的游戏体验,同时需最小化信息复制量,尽可能减少网络带宽占用率。
二、基本网络概念
2.1 网络模式和服务器类型
- 网络模式描述了计算机与网络多人游戏会话的关系。游戏实例可采用以下任意网络模式:
① 独立:游戏作为服务器运行,不接受远程客户端连接。参与游戏的玩家必须为本地玩家。此模式用于单人游戏和本地多人游戏。
② 客户端:游戏作为网络多人游戏会话中与服务器连接的客户端运行。
③ 聆听服务器:游戏作为主持网络多人游戏会话的服务器运行。其接受远程客户端中的连接,且直接在服务器上拥有本地玩家。此模式通常用于临时合作和竞技多人游戏。
④ 专属服务器:游戏作为主持网络多人游戏会话的服务器运行。其接受远程客户端中的连接,但无本地玩家,因此为了高效运行,其将废弃图形、音效、输入和其他面向玩家的功能。此模式常用于需要更固定、安全和大型多人功能的游戏。 - 聆听服务器
Listen Server
- 聆听服务器是一种玩家担任服务器角色的网络架构模式。在这种模式下,玩家既作为“服务器”来管理游戏状态,也作为“客户端”来参与游戏。通常适合于小型多人游戏,比如局域网LAN游戏或好友之间的私人对战。
- 特点:
① 聆听服务器上玩家的视角和行为会实时传输给其他客户端玩家,方便快速同步
② 如果担任服务器的玩家断开连接,整个游戏会终止,其他玩家也会被踢出游戏。 - 比如
steam好友邀请远程同乐
- 专属服务器
Dedicated Server
-
专属服务器是独立运行的专用主机,不参与游戏,只负责管理所有玩家的连接、游戏状态以及物理同步等。它通常运行在云端或服务器托管平台上,适合大规模多人在线游戏(如
MMORPG)。 -
特点:
① 专属服务器更稳定,玩家断开连接不会影响其他玩家。
② 独立服务器提供更高的性能和同步效率,适合大型多人游戏。
2.2 Actor复制
- 复制是指在网络会话中的不同机器间复制游戏状态信息。若正确设置复制,将可同步不同机器的游戏实例。多数
Actor默认不会启用复制,且将本地执行所有功能。在C++ Actor类中设置bReplicates变量,或将Actor蓝图的复制Replicates设置设为true,可启用给定类的Actor复制。
UPROPERTY(Replicated)
int32 Health;
- 创建网络游戏时的常见复制功能:
① 创建和销毁
② 移动复制
③ 变量复制
④ 组件复制
⑤ 远程过程调用RPC RPC是传输到网络游戏中特定机器的特殊函数。无论初始调用RPC的是哪台机器,其的实现仅在目标机器上运行。此类RPC可指定为服务器(仅在服务器上运行)、客户端(仅在Actor的拥有客户端上运行)或NetMulticast(在连接会话的所有机器上运行,包括服务器)。
举个例子:UFUNCTION(Server, Reliable) void Server_FireBullet();
- 当玩家在客户端按下射击按钮时,调用这个函数。由于这是一个
Server RPC,客户端会请求服务器来执行这个函数。- 在
Server_FireBullet函数中,服务器可以生成一个子弹Actor,并设置bReplicates = true,使其在所有客户端中可见。
Actor、Pawn和角色的部分常用功能不会复制:
① 骨架网格体和静态网格体组件
② 材质
③ 动画蓝图
④ 粒子系统
⑤ 音效发射器
⑥ 物理对象
- 此类项目均在所有客户端上单独运行。但是,若复制驱动此类视觉元素的变量,则可确保所有客户端都具有相同信息,从而以大致相同的方式进行模拟。
注意: 必须根据游戏的需求明确指定要复制的变量和函数。
- 基于条件的Actor复制:
- 有些
Actor可能只需要在某些条件下才进行复制。例如,只有玩家在一定范围内时才进行同步,以减少网络带宽消耗。可以在Actor类中重写IsNetRelevantFor函数来控制Actor的复制条件。
- 复制Actor的动态属性:
- 在某些情况下,
Actor的状态需要在运行时更新,并且立即同步给所有玩家。这可以通过OnRep回调函数来实现,当某个属性发生变化时会触发这个回调。
举个例子:UPROPERTY(ReplicatedUsing=OnRep_Shield) int32 Shield; UFUNCTION() void OnRep_Shield();
- 假设游戏中角色的护盾值会在受到攻击时减少。可以设置
OnRep_Shield来确保每次护盾值变化时,客户端都能执行自定义的逻辑,比如播放护盾破碎效果。- 这样可以确保护盾值的变化会立即同步到所有客户端,并触发每个客户端的OnRep_Shield,以播放相应的动画或特效。
2.3 网络角色和授权
Actor的网络角色将决定网络游戏期间控制Actor的机器。授权Actor被认为可控制Actor的状态,并可将信息复制到网络多人游戏会话中的其他机器上。远程代理是该Actor在远程机器上的副本,其将接收授权Actor中的复制信息。其由Local Role和Remote Role变量进行追踪。- 网络角色
Role:
① 无:Actor在网络游戏中无角色,不会复制。
② 权威Authority:具有完全控制权的机器,通常是服务器。服务器上的Actor通常会自动拥有“ROLE_Authority”角色。这意味着它可以决定Actor的行为和状态。
③ 模拟代理Simulated Proxy:Actor为远程代理,由另一台机器上的授权Actor完全控制。网络游戏中如拾取物、发射物或交互对象等多数Actor将在远程客户端上显示为模拟代理。
- 它们会根据服务器的状态来更新自己的状态。通常用于同步其他玩家的角色或其他非自主控制的物体。
④ 自主代理Autonomous Proxy:Actor为远程代理,能够本地执行部分功能,但会接收授权Actor中的矫正。自主代理通常为玩家直接控制的actor所保留,如pawn。
- 虚幻引擎使用的默认模型是服务器授权,意味着服务器对游戏状态固定具有权限,而信息固定从服务器复制到客户端。服务器上的
Actor应具有授权的本地角色,而其在远程客户端上的对应Actor应具有模拟或自主代理的本地角色。 - 授权
Ownership:
- 授权是指
Actor的控制权分配,通常由服务器决定客户端能否操作某个Actor。以下是一些具体的授权方式和用例:
① 服务器授权:最常见的方式,服务器拥有最终决定权。在服务器授权下,客户端需要通过RPC请求服务器执行特定的操作,例如在多人射击游戏中,客户端请求服务器射击,服务器判断合法性并通知所有客户端。
② 客户端授权:有时用于较低风险的操作(如UI操作),或在需要降低延迟的操作(如本地预测)。客户端可以在不等待服务器确认的情况下执行操作,但最终状态仍由服务器决定并同步回来。
举个例子:
- 服务器生成和控制子弹:
- 当玩家按下射击键时,客户端发送RPC(Remote Procedure Call)给服务器,请求生成子弹。
- 服务器根据请求验证(是否符合规则,是否可以射击)后生成子弹Actor,并将其角色设置为“ROLE_Authority”。
- 服务器将该Actor的状态同步到所有客户端,这些客户端会将子弹Actor的角色设为“Simulated Proxy”,从而仅模拟子弹的运动而无控制权。
- 客户端控制自己的角色:
- 客户端上的玩家角色(Pawn)通常是“Autonomous Proxy”,这样客户端可以本地处理输入(如移动、旋转)。
- 服务器上该角色会是“Authority”,因此会接收客户端的运动请求并验证后进行更新,将最终状态同步到其他客户端。
- 延迟和预测:
- 客户端可能会在射击或快速移动时看到延迟(服务器确认需要时间)。为了提升体验,UE引入客户端预测(Client Prediction),允许客户端暂时“预测”其状态,服务器随后验证并同步回准确位置。
2.4 客户端拥有权
- 客户端拥有权
Ownership:在网络游戏中,每个玩家在自己的客户端上控制一个Pawn(玩家的角色对象),这个Pawn是被该玩家的PlayerController所拥有的。拥有权意味着,只有拥有这个Actor的客户端才能控制它,比如接收输入并作出反应。这种设计主要为了避免多个客户端都试图控制同一个角色导致的冲突。 - 纯客户端函数
Pure Client-only Functions: 是一类只在客户端上调用的函数,而不会被同步到服务器。例如,某些视觉效果或客户端专属的界面更新操作,这些不需要服务器参与。
举个例子:
- 假设一个游戏角色在受伤时播放一个特效,这个特效是纯客户端的。那么,只有拥有该角色的客户端才能触发这个效果。使用
IsLocallyControlled判断当前角色是否在自己所拥有的客户端上,确保只有正确的客户端会播放这个特效。
Owner属性:UE中的Owner属性帮助我们将一个Actor与另一个Actor(例如Pawn)关联起来,这样关联后,客户端可以确认该Actor属于谁。
举个例子:
- 如果将一个武器
Actor的Owner设为某个Pawn,UE 就会把这个武器的操作权限分配给该Pawn的拥有者客户端。当玩家在客户端点击攻击时,客户端会判断这个武器是否被“本地控制”(即是否为玩家拥有的角色),然后在客户端上直接执行相应操作(比如显示武器开火的效果)。
IsLocallyControlled函数:是一个用于检查Actor是否在拥有该Actor的客户端上被控制的函数。这个函数可以帮助我们判断某个操作是否应仅在拥有权客户端上执行,避免让服务器或其他客户端误操作。
在拥有角色的客户端上,
IsLocallyControlled()会返回true,因此会播放视觉效果。在非拥有客户端上(即其他客户端的模拟代理),IsLocallyControlled()返回false,不会播放视觉效果。
2.5 相关性和优先级
- 相关性用于决定是否需要在多人游戏期间复制
Actor。复制期间将剔除被认为不相关的actor。此操作可节约带宽,以便相关Actor可更加高效地复制。若Actor未被玩家拥有,且不在玩家附近,将其被视为不相关,而不会进行复制。不相关Actor会存在于服务器上,且会影响授权游戏状态,但在玩家靠近前不会向客户端发送信息。覆盖IsNetRelevantFor函数以手动控制相关性,并可使用NetCullDistanceSquared属性决定成为相关Actor所需距离。 - 有时在游戏单帧内,没有足够带宽供复制所有相关
Actor。因此,Actor拥有优先级Priority值,用于决定优先复制的Actor。
Pawn和PlayerController的NetPriority默认为3.0,从而使其成为游戏中最高优先级的Actor,而基础Actor的NetPriority为1.0。Actor在被复制前经历的时间越久(等待同步的时间越长),每次成功通过时所处的优先级便越高,以确保它不会长时间没有被同步更新。
三、变量复制
- 在C++中使用对应
UPROPERTY宏内的Replicated或ReplicateUsing说明符,或在蓝图的细节面板中将它们指定为已复制,可将复制添加到变量和对象引用。授权Actor上复制变量的值变更时,其信息将自动从授权Actor发送到连接会话的远程代理。 RepNotify:是一种通知机制,可指定在Actor成功接收特定变量的复制信息时要调用RepNotify函数。
RepNotify仅在变量更新时本地触发。触发gameplay逻辑响应授权Actor上的变量更改时,UE会自动调用指定的回调函数。这种机制不需要额外的网络调用,可减少开销。- 在C++中使用变量的
UPROPERTY宏的ReplicatedUsing说明符可访问此功能,或修改蓝图中变量的复制设置以使用RepNotify。 - 由于
RepNotify可添加到需复制的变量中,而无需考虑其他gameplay功能,创建额外网络调用时刻节约大量带宽,因此RepNotify比RPC或复制函数更加好用。
举个例子:UPROPERTY(ReplicatedUsing = OnRep_Health) float Health;// 当Health变量更新时,自动调用该函数 UFUNCTION() void OnRep_Health();在上面的代码中,当
Health从服务器同步到客户端并发生变化时,OnRep_Health()函数会被自动调用
- 与
RPC相比,RepNotify的优势:
① 节省带宽:RPC是在服务器和客户端之间手动调用的网络函数,频繁的 RPC 调用会增加带宽消耗。而RepNotify仅在变量更新时触发,避免了不必要的网络通信。
② 简化逻辑:使用RepNotify后,变量更新和回调触发变得更加自动化,不需要开发者手动发送消息或调用函数,只需专注于编写回调逻辑。
四、远程过程调用(RPC)
- 远程过程调用也称为复制函数。是一种用于在网络游戏中实现客户端和服务器之间通信的机制。RPC 允许我们从客户端调用服务器函数,或从服务器调用客户端函数,实现特定的游戏逻辑。
- RPC的类型:
①Server:仅在主持游戏的服务器上调用。(客户端请求)
②Client:仅在拥有该函数所属Actor的客户端上调用。用于服务器向特定客户端发送消息。常用于同步特定客户端的视觉效果或更新特定客户端的数据。
③NetMulticast:在与服务器连接的所有客户端及服务器本身上调用(广播消息)。 - 使用场景:
①Server RPC(客户端调用 -> 服务器执行),例如:玩家在客户端上点击攻击按钮并希望服务器处理攻击逻辑
UFUNCTION(Server, Reliable, WithValidation)
void Server_Attack();
② Client RPC(服务器调用 -> 特定客户端执行),例如:更新特定客户端的UI,比如显示得分或弹出特定的提示;播放客户端独有的视觉效果,比如显示伤害数字或特殊的效果。
UFUNCTION(Client, Reliable)
void Client_DisplayDamage(float Damage);
③ Multicast RPC(服务器调用 -> 所有客户端执行),在多人游戏中,如果某个事件需要所有玩家都能看到。例如:全局事件广播,比如场景爆炸、所有玩家的状态更新;生成可见的效果或动画,比如大范围特效。
UFUNCTION(NetMulticast, Reliable)
void Multicast_ExplosionEffect();
- 提供对应
UFUNCTION宏中的Server、Client或NetMulticast说明符,可在将C++函数指定为RPC。其代码将在代码实现中使用后缀_Implementation。 - 必须将
RPC指定为可靠或不可靠。在蓝图中,函数和事件默认为不可靠。在C++中,必须将Reliable或Unreliable说明符作为Server、Client或NetMulticast函数,添加到RPC的UFUNCTION宏及其状态。
- 不可靠RPC 无法保证必会到达预定目的地,但其发送速度和频率高于可靠的RPC。其最适用于对
gameplay而言不重要或经常调用的函数。例如,由于Actor移动每帧都可能变换,因此使用不可靠RPC复制该Actor移动。 - 可靠的RPC 保证到达预定目的地,并在成功接收之前一直保留在队列中。其最适合用于对
gameplay很关键或者不经常调用的函数。相关例子包括碰撞事件、武器发射的开始或结束,或生成Actor。
- 为了确保数据安全性和有效性,特别是防止作弊,
Server RPC通常会设置“验证”机制,称为WithValidation。服务器 RPC 的函数可以包含一个_Validate()方法来检查请求是否合法,只有通过验证的请求才会被执行。
WithValidation说明符表明除函数的实现外,还有可验证传入函数调用的数据的函数。此验证函数与其负责的函数使用同一签名,但其将返回布尔而非原本返回值。若返回true,则其允许执行RPC的Implementation;若返回false,则防止执行。
举个例子:在这里,当客户端调用Server_Attack()时,服务器会先执行Server_Attack_Validate()。如果返回true,才会继续执行Server_Attack_Implementation()中的具体逻辑。
UFUNCTION(Server, Reliable, WithValidation)
void Server_Attack();bool Server_Attack_Validate()
{// 在这里检查客户端请求是否合法,比如检测攻击范围return true; // 合法则返回 true
}void Server_Attack_Implementation()
{// 合法后执行攻击逻辑
}
相关文章:
UE Mutiplayer(1):网络概述
文章目录 一、Replication二、基本网络概念2.1 网络模式和服务器类型2.2 Actor复制2.3 网络角色和授权2.4 客户端拥有权2.5 相关性和优先级 三、变量复制四、远程过程调用(RPC) 一、Replication 在虚幻引擎中,在客户端与服务器间同步数据和调用程序的过程被称为复制…...
【SQL Server】中关于 COUNT 的一些使用方式区别
前言 使用 SQL Server时,对表或查询结果计算行数是一种常见的操作。了解一些使用 COUNT(*)、COUNT(1) 和 DISTINCT COUNT等的区别对于编写经过优化的高效查询至关重要。本文我们一起探讨这些使用COUNT方式,了解它们的差异与使用。 方式差异 1、COUNT(…...
第5关:主合取范式
任务描述 编程要求 输入 输出 输入样例 输出样例 任务描述 本关任务:求公式(p∨q)→r的主合取范式。 编程要求 根据提示,在右侧编辑器补充代码,计算并输出公式(p∨q)→r的主合取范式 输入 本题无输入。 输出 在单独的一行中输出公式的主合…...
vscode摸鱼学习插件开发
不知道大家在摸鱼的时候,会不会想要学习? 或者有没有考公人,下班要学习的? 上班时间摸鱼,下班时间不够学习? 为此,我决定开发一个vscode插件,来刷粉笔题 粉笔插件名称:…...
多线程编程与并发控制缓存策略负载均衡数据库优化
本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…...
Gradio DataFrame分页功能详解:从入门到实战
Gradio DataFrame分页功能详解:从入门到实战 1. 引言2. 为什么需要分页?3. 环境准备4. 基础知识准备5. 代码实现5.1 创建示例数据5.2 分页状态管理5.3 分页核心逻辑5.4 创建Gradio界面 6. 关键功能解析6.1 页码计算6.2 数据切片 7. 使用示例8. 实用技巧9…...
[OPEN SQL] FOR ALL ENTRIES IN
FOR ALL ENTRIES IN 语句用于从一个内部表中检索与另一个内部表中指定字段匹配的记录 语法格式 SELECT ... FOR ALL ENTRIES IN <itab> WHERE <cond>. <itab>:插入目标数据内表 <cond>:查询条件 使用FOR ALL ENTRY IN 语句时&…...
每日互动基于 Apache DolphinScheduler 从容应对ClickHouse 大数据入库瓶颈
引言 大家好,我叫张琦,来自每日互动,担任大数据平台架构师。今天我将分享我们团队在基于Apache DolphinScheduler实现ClickHouse零压入库过程中的实践经验。 这个实践项目涉及到两个关键组件:Apache DolphinScheduler和ClickHous…...
Chromium127编译指南 Linux篇 - 同步第三方库以及Hooks(六)
引言 在成功克隆 Chromium 源代码仓库并建立新分支之后,配置开发环境成为至关重要的下一步。这一过程涉及获取必要的第三方依赖库以及设置钩子(hooks),这些步骤对于确保后续的编译和开发工作能够顺利进行起着决定性作用。本指南旨…...
在 Android 设备上部署一个 LLM(大语言模型)并通过 Binder 通信提供服务
在 Android 设备上部署一个 LLM(大语言模型)并通过 Binder 通信提供服务,需要以下几个步骤。具体实现是通过定义一个 Android HAL 服务,并且在 init.rc 文件中启动该服务。我们将一步一步解释如何实现一个可通过 Binder 通信的服务(如 vendor.te.aimodel-service)。 一 …...
安科瑞AMB400分布式光纤测温系统解决方案--远程监控、预警,预防电气火灾
安科瑞戴婷 可找我Acrel-Fanny 安科瑞AMB400电缆分布式光纤测温具有多方面的特点和优势: 工作原理: 基于拉曼散射效应。激光器产生大功率的光脉冲,光在光纤中传播时会产生散射。携带有温度信息的拉曼散射光返回光路耦合器,耦…...
docker-compose安装rabbitmq 并开启延迟队列和管理面板插件(rabbitmq_delayed_message_exchange)
问题: 解决rabbitmq-plugins enable rabbitmq_delayed_message_exchange :plugins_not_found 我是在docker-compose环境部署的 services:rabbitmq:image: rabbitmq:4.0-managementrestart: alwayscontainer_name: rabbitmqports:- 5672:5672- 15672:156…...
低功耗蓝牙模块在车联网中的应用
目前,没有一种无线技术可以适合所有的车联网应用,目前对于距离短、功耗低、数据速率低的应用,最常见的选择是2.4G、红外和蓝牙技术。其中蓝牙5.0及以上版本受到大家的青睐,因为它与4.2版本相比通讯距离更长和数据吞吐量更高&#…...
Gitee push 文件
1、背景 想将自己的plecs仿真放到git中管理,以防丢失,以防乱改之后丢失之前版本仿真。此操作说明默认用户已下载git。 2、操作步骤 2.1 开启Git Bash 在文件夹中右键,开启Git Bash。 2.2 克隆文件 在Git Bash中打git clone git地址&#…...
OpenGL入门004——使用EBO绘制矩形
本节将利用EBO来绘制矩形 文章目录 一些概念EBO 实战简介utilswindowFactory.hRectangleModel.hRectangleModel.cpp main.cppCMakeLists.txt最终效果 一些概念 EBO 概述: Element Buffer Object 用于存储顶点的索引数据,以便在绘制图形时可以重用顶点数…...
Python中`__str__`和`__repr__`的区别(最清晰解释)
Python中__str__和__repr__的区别(最最最清晰的解释) 在Python的面向对象编程体系中,__str__和__repr__这两个特殊方法具有独特且重要的作用,尽管它们都涉及对象的字符串表示形式的定义,但在功能和使用场景上存在显著…...
Community Enterprise Operating System
起源与背景 CentOS项目始于2003年,由一群热心的Linux用户和开发者共同发起。 它的诞生旨在为用户提供一个免费且与RHEL高度兼容的操作系统,满足那些希望使用RHEL的稳定性和安全性但又不想支付商业许可费用的用户和组织的需求。 CentOS社区会将Red Hat…...
X (Twitter)养号指南:2024最新攻略
X (Twitter)作为活跃用户数以亿计的社交媒体平台,用户数依然在不断增长,其中巨大的流量吸引着个人用户与品牌和卖家。 Twitter养号是有必要的,有大量案例表明养好号,可以大幅度降低账号被冻结的几率,并提升账号的稳定…...
^M 字符处理
windows用的是\r\n来做分行的linux是\n 一、文本格式转换中的^M符号 跨平台文本文件: 当在Windows系统下编辑的文本文件被转移到Unix/Linux系统下打开时,由于Windows系统使用CRLF(\r\n)作为行结束符,而Unix/Linux系统…...
vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了
Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题,重构了虚拟渲染,渲染性能大幅提升了,行高自适应和列宽拖动都支持,大幅降低虚拟渲染过程中的滚动白屏,大量数据列表滚动更加流畅。 自适…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
