Unity-Mirror网络框架-从入门到精通之Benchmark示例

news2025/1/7 16:06:24

文章目录

    • 前言
    • 什么是Benchmark?
    • Benchmark 简要说明
    • Benchmark示例
      • BenchmarkNetworkManager
      • MonsterMovement
      • PlayerMovement
      • InterestManagement
      • 性能指标
    • BenchmarkIdle示例
    • BenchmarkPrediction示例
    • BenchmarkStinkySteak示例

前言

在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进行比较,以及如何从零开始创建一个使用Mirror的简单网络项目。
在这里插入图片描述

什么是Benchmark?

Benchmark示例 通常用于测试和评估Mirror网络框架在不同场景下的性能表现。该示例可以通过实施多种网络条件来测量服务器和客户端之间的数据传输速度、延迟、带宽使用情况以及不同数量的同时连接用户对整体性能的影响。

在测试过程中,开发者可以观察到游戏在进行高并发情况下的响应能力,例如在多人游戏场景中,如何处理大量玩家的输入、状态同步和事件广播等。同时,该示例还可以帮助开发者识别潜在的性能瓶颈,并对代码进行优化,以便实现更流畅的用户体验。

通过这些基准测试,开发者能够获取关键的性能指标,从而更好地调整游戏的网络架构和优化策略,以提高整个平台的稳定性和反应速度,同时确保用户在游戏中能够获得最佳的游戏体验。

Benchmark 简要说明

Mirror的Example包含哪些 基准测试 示例呢?

  • 1.Benchmark:这个示例用于基准测试网络性能,通常会测试数据传输速率、延迟等网络参数,以帮助开发者评估他们的网络实现。
  • 2.BenchmarkIdle:这个示例主要用于在空闲状态下进行基准测试,目的是评估在没有任何活动情况下的网络性能。这有助于理解网络在闲置时的行为情况。
  • 3.BenchmarkPrediction:这个示例涉及到网络预测技术,通常用于展示如何在网络延迟情况下进行状态预测,以提高游戏的流畅度和响应性。
  • 4.BenchmarkStinkySteak:这是一个更具趣味性的示例,通常用于展示服务器与客户端之间的交互。可能涉及一些有趣的机制或模拟网络延迟的场景,以帮助开发者理解网络通信是如何工作的。

这些示例可以帮助开发者更好地理解 Mirror 的功能和用法,并进行性能优化。

Benchmark示例

BenchmarkNetworkManager

基准测试的NetworkManager,主要是在StartServer后,创建了1000个自由飘荡的盒子,代表我们的大场景中的Monster。
逻辑很简单,就是SpawnAll,克隆1000个游戏对象,并且调用NetworkServer.Spawn(go),同步到网络中。

public class BenchmarkNetworkManager : NetworkManager
    {
        public GameObject spawnPrefab;
        public int spawnAmount = 5000;
        public float interleave = 1;

        void SpawnAll()
        {
            float sqrt = Mathf.Sqrt(spawnAmount);
            float offset = -sqrt / 2 * interleave;
            int spawned = 0;
            for (int spawnX = 0; spawnX < sqrt; ++spawnX)
            {
                for (int spawnZ = 0; spawnZ < sqrt; ++spawnZ)
                {
                    if (spawned < spawnAmount)
                    {
                        GameObject go = Instantiate(spawnPrefab);
                        float x = offset + spawnX * interleave;
                        float z = offset + spawnZ * interleave;
                        go.transform.position = new Vector3(x, 0, z);
                        
                        NetworkServer.Spawn(go);
                        ++spawned;
                    }
                }
            }
        }

        public override void OnStartServer()
        {
            base.OnStartServer();
            SpawnAll();
        }

MonsterMovement

这个脚本是模拟MMORPG中的Monster,在大场景中自由的移动。
这里着重说一下,Update函数是模拟怪物自由移动的,
但是Update上面有一个[ServerCallback]修饰,代表这是一个服务器才会执行的函数。
在Mirror框架中,如果一个函数被[Server]或者[ServerCallback]修饰,那么他就代表仅在服务器执行,客户端不执行。
这里相当于在服务器直接模拟了大量的AI怪物的移动。保证了不同客户端中显示的AI物体的同步。

    public class MonsterMovement : NetworkBehaviour
    {
        public float speed = 1;
        public float movementProbability = 0.1f;
        public float movementDistance = 20;

        public override void OnStartServer()
        {
            start = transform.position;
        }

        [ServerCallback]
        void Update()
        {
        }
    }

PlayerMovement

PlayerMovement模拟的是玩家自由控制移动。纯客户端执行。
由于Player对象上有NetworkTransform组件,所以它的位置等信息会实时同步给其他客户端。

当我们在场景中走动的时候,我们发现可以看到的Monster,会根据自己的位置变化,距离Player位置近的会显示,距离远的会隐藏。这个是什么道理呢?
原来是Mirror给我们做了一个网络优化,在NetworkManager游戏对象上面,有一个组件名字叫:SpatialHashingInterestManagement(空间哈希兴趣管理),是一种用于优化网络游戏中对象的管理和交互的方法。它通过将游戏世界划分为多个小区域(或“哈希桶”),来决定哪个玩家需要接收哪些对象的信息,从而提高性能并减少不必要的数据传输。

他就类似在做大世界的MMORPG时,只显示距离我们近的范围的AI怪物,并非全地图绘制和执行所有怪物的逻辑的优化。

InterestManagement

Interest管理器,它的原理就是相当于把地图划分成了无数的格子,然后我们只能看到距离我们相近的9个格子内的网络对象。
如下图所示:
在这里插入图片描述
当我们在一个非常大的世界游戏中时,与其将完整的世界状态发送给每个玩家,不如考虑仅将玩家周围的内容发送给玩家。

Mirror给我们提供了InterestManagement的主要原因:

  • 1.规模:想象一下魔兽世界。将整个世界发送给每个玩家将是疯狂的。为了扩展到数千个连接,我们只需要发送与任何给定玩家相关的内容。
  • 2.可见性:在像 DotA/英雄联盟这样的 MOBA 游戏中,并不是每个人都应该一直看到其他人。玩家应该只看到自己的团队和周围的怪物。不仅如此,玩家还不应该看到墙后等。
  • 3.作弊:在像 Counter-Strike 这样的游戏中,玩家自然看不到墙后的敌人,因为相机不会渲染它们。但是,如果整个世界状态在内存中都是已知的,那么黑客无论如何都可以利用这一点,将玩家显示在墙后。

InterestManagement是一个好主意。

Mirror给我们提供了很多内置的Interest Management组件
选择 Network Manager 并添加一个内置的 Interest Management 组件。

  • 1.Spatial Hashing Interest Management:以前我们 Vector3.Distance 根据连接实体距离来判断。现在,我们将每个生成的实体放入一个 Grid 中,对于每个连接,我们将所有 8 个相邻的 Grid 条目都发送到客户端。这是非常快的。在早期的 uMMORPG 测试中,它比距离检查快 30 倍。该算法不太复杂,因此可以很好地扩展到大量实体。
  • 2.Distance Interest Management:是简单的通过距离判断,来把范围内的连接发送给客户端,是InteractManager的最简单粗暴的做法。但是缺点就是,通过距离来判断每个连接成本较高。
  • 3.Scene Interest Management:场景Interest 管理与附加场景一起使用,将对象联网到具有物理隔离的子场景。这意味着,即使您在服务器上加载了同一子场景的多个实例,对象之间的碰撞等也只会发生在该子场景内,而不会干扰其他子场景。
  • 4.Scene Distance Interest Management:是上述 Scene 和 Distance 的组合。
  • 5.Match Interest Management :匹配Interest管理,适用于非物理游戏,如纸牌、棋盘、街机游戏。
  • 6.Team Interest Management:用于限制对团队成员的联网对象的可见性。这也可以用于仅限所有者的项目,取代 Network Owner Checker。

性能指标

在这里插入图片描述
在Benchmark示例中,您看到的参数主要用于监控和评估网络性能,具体含义如下:

  • buffer:用于存储网络数据包的缓冲区。通常在网络传输中,数据包会被暂时存储在缓冲区中,以便后续处理或发送。
  • driftEMA:表示“漂移的指数移动平均”(Exponential Moving Average of Drift)。这是一个用于平滑变量的统计量,帮助减少波动并提供更稳定的值,通常用于测量时间戳的漂移或延迟变化。
  • DelTimeEMA:表示“延迟时间的指数移动平均”(Exponential Moving Average of Delay Time)。此参数用于跟踪网络延迟的平均值,以便评估网络响应的稳定性。
  • BTM:可能代表“带宽时间测量”(Bandwidth Time Measurement),用于衡量网络在一定时间内能够传输的数据量,帮助评估网络性能。
  • RTT:表示“往返时间”(Round-Trip Time),是从发送数据包开始,到接收到确认的时间。RTT是网络延迟的重要指标。
  • PredErrUNADJ:表示“未调整的预测误差”(Unadjusted Prediction Error),用于测量在不调整任何参数的情况下,预测的值与实际值之间的差异。
  • PredErrADJ:表示“调整后的预测误差”(Adjusted Prediction Error),与未调整的预测误差相似,但在计算时可能考虑了某些调整因素,从而得到更精确的预测效果。

这些参数共同用于评估和优化网络性能,特别是在多人游戏中,以帮助开发者理解网络延迟和数据传输的表现。

BenchmarkIdle示例

该示例,使用大多数空闲对象进行基准测试,以测试dirtyObjects技术。
这次创建的额对象都是空闲不动的,他们的数量大概有10000个
这产生了大量的流量。
该测试需要Telepathy才能不断开客户端。
在这里插入图片描述
这个示例的代码比较简单,就是纯创建10000个cube矩阵。
如下所示:

 public class BenchmarkIdleNetworkManager : NetworkManager
    {
        [Header("Spawns")]
        public int spawnAmount = 10_000;
        public float      interleave = 1;
        public GameObject spawnPrefab;
        [Range(0, 1)] public float spawnPositionRatio = 0.01f;
        System.Random random = new System.Random(42);

        void SpawnAll()
        {
        	//for循环,创建10000个目标
        }
        public override Transform GetStartPosition()
        {
            startPositions.RemoveAll(t => t == null);
            if (startPositions.Count == 0)
                return null;
            int index = random.Next(0, startPositions.Count); // DETERMINISTIC
            return startPositions[index];
        }

        public override void OnStartServer()
        {
            base.OnStartServer();
            SpawnAll();
        }

BenchmarkPrediction示例

Mirror的Predicted预测基准测试,是针对低端设备/VR进行的优化。
在不与对象交互的情况下,开销为零!
在交互过程中,开销来自同步和校正。
这个基准预测了不断同步和校正的对象。
=>真实游戏中效果会比这个示例好,因为这是我们可以用于分析的最坏情况!
在这里插入图片描述

NetworkManagerPredictionBenchmark适用于创建1000个物理小球,
RandomForce:是物理小球上的网络组件,用于不同客户端,不间断的给物理小球不停地施加随机的力,代表了真实物理世界中,不同客户端的玩家,同时操作处理同一个物理网络对象,造成的延迟和不稳定。

public class RandomForce : NetworkBehaviour
    {
        public float force = 10;
        public float interval = 3;
        PredictedRigidbody prediction;
        Rigidbody rb => prediction.predictedRigidbody;

        void Awake()
        {
            prediction = GetComponent<PredictedRigidbody>();
        }
        public override void OnStartClient()
        {
            float randomStart = Random.Range(0, interval);
            InvokeRepeating(nameof(ApplyForce), randomStart, interval);
        }


        [ClientCallback]
        void ApplyForce()
        {
            // calculate force in random direction but always upwards
            Vector2 direction2D = Random.insideUnitCircle;
            Vector3 direction3D = new Vector3(direction2D.x, 1.0f, direction2D.y);
            Vector3 impulse = direction3D * force;
            
            rb.AddForce(impulse, ForceMode.Impulse);
            CmdApplyForce(impulse);
        }

        [Command(requiresAuthority = false)] // everyone can call this
        void CmdApplyForce(Vector3 impulse)
        {
            rb.AddForce(impulse, ForceMode.Impulse);
        }

我们注意到,OnStartClient中,每个客户端都会开启一个定时器,不时的给小球施加一个力,然后调用了Command,把命令发送给服务器的同时,客户端自身也执行rb.AddForce,为什么这么做呢?

    1. 本地预测:
      当客户端调用 rb.AddForce 时,它利用 PredictedRigidbody 组件在本地进行物理计算。这种方法让客户端可以立即感受到推动的效果,无需等待服务器的响应,从而提供更流畅、即时的反馈给玩家。
    1. 网络同步:
      同时,CmdApplyForce 方法是一个 Command 方法,用于将力的应用请求发送到服务器。即使客户端立即对物体施加了力,该方法仍然会在服务器上执行一次相同的操作。这样,其他客户端也能看到这一变化,确保所有客户端的状态一致。
    1. 冲突说明:
      由于物理计算是基于每个客户端本地进行的,所以如果网络延迟或不同的客户端施加的力不同,预测可能与服务器的实际状态有所偏差。
      PredictedRigidbody 组件的设计宗旨是处理这些冲突。当服务器收到命令执行 rb.AddForce 时,物理效果会被应用,但如果与当前客户端的状态不一致,PredictedRigidbody 将自动处理这些调整,以确保同步。
    1. 并发效果:
      正如注释所述,这个方法允许每个连接的客户端对所有对象施加影响。因此,随着客户端数量的增加,场景的行为会变得更加复杂且动态。这种并发处理能够在基准测试时体现网络和同步机制的能力。

使用这种方式的目的是为了在保持快速响应和流畅玩家体验的同时,确保每个玩家都能看到一致的游戏状态,从而实现更好的用户体验和网络表现。
在这里插入图片描述

BenchmarkStinkySteak示例

提到这个示例,我们需要提到一个库 Unity 网络解决方案基准测试https://github.com/StinkySteak/unity-netcode-benchmark/

这个仓库,包含各种Unity网络框架项目对比基准测试的结果。目的就是公平的比较Unity的各个网络库的性能等差异。

网络库及版本包括如下:

NetcodeVersionTransport
Fusion1.1.8 F 725Realtime
Fusion 22.0.0 RC 797Realtime
NetickNetick 2 Beta 0.8.8LiteNetLib
NGO1.2.0Unity Transport
Fishnet3.11.10Tugboat
Mirror86.4.0KCP

测试内容(2024年最新):
SineMoveYBehaviour:测试500个对象在Sine曲线Y周移动
SineMoveRandomBehaviour:测试500个对象在Sine曲线随机移动
WanderMoveBehaviour:测试500个对象随机漫游移动

测试结果如下:
Server Out (kBps)

MirrorNGOMirageFishnetNetickFusionFusion 2kBps
Move Y26726513762272686kBps
Move All Axis307306124103878179kBps
Move Wander4594611381459612585kBps

NetworkTransform (Test ID: 2)

NGOFusion 1MirrorFusion 2FishnetNetick
0 Client0.130.1310.0600.0310.0340.029ms
6 Clients0.180.1350.0670.0340.0340.0295ms
12 Clients0.300.1390.0710.0380.0350.0299ms
24 ClientsERROR0.1470.0790.0440.0360.030ms

SyncVar/NetworkProperty (Test ID: 4)

NGOFusion 1Fusion 2MirrorNetickFishnet
0 Client0.0300.0260.0250.0170.01500.0115ms
6 Clients0.0390.0280.0290.0210.01580.0116ms
12 Clients0.0490.0310.0320.0240.01590.0116ms
24 Clients0.0780.0380.0380.0300.01630.0116ms

大家通过测试结果可以客观的看到各个网络库的差异,然后决定自己使用哪一个。
当然,我们也不能完全看这个数据来选,因为我们如果用这个网络库做项目的话,还要考虑其他几个更重要的问题:
1.网络库的社群是否活跃,如果将来遇到什么问题,是否有人解决或者帮助你。
2.网络库的仓库是否及时维护,如果有什么bug,作者能否及时更新?
3.网络库的API是否好学,易懂,符合个人喜好等等。
4.网络库是否收费,如何收费?
5.网络库的示例代码是否足够,学习难度大不大?
等等
通过综合对比后,我简单聊一下我的选择和原因。
不难看出,我选了Mirror,要不就不会有这篇文章了。
1.Fusion,是Photon光子旗下的,要说好用和稳定,那是没话说,但是它收费,而且国内使用受限。所以pass
2.NGO,unity的亲儿子,但是它的更新速度太慢,再加上之前UNet的无疾而终,导致我们大家现在不敢相信它。
3.Netick,国外用的比较多,国内几乎没人用,用的人也不多
4.FishNet,它是作者用了Mirror后发现了一些问题,自研了FishNet,所以性能肯定比Mirror强,本来我准备用它,但是它示例太少,用的人也少,导致我研究了一周左右,还是摸不着头脑,语法结构也有点懵逼。最后还发现它是半收费的,就是有些高级功能你必须付费才能使用。所以也pass了。

最后就选择Mirror了,虽然它有一些小问题,但是它的社群丰富,示例丰富,学习起来很快,虽然它速度没有FishNet快,但是我们普通的游戏,根本不会用那么多的游戏对象,因为那些基准测试都是在极限条件下进行的测试。普通的网络游戏,Mirror用起来都是没有问题的。
另外最打动我的一点是,已经有太多的游戏通过Mirror开发并且上线,群众的眼睛是血量的,所以我也选择了Mirror。

好了,这篇文张就到这里,希望对你能有所帮助。

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

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

相关文章

反射--反射机制

目录 一 java 1.反射的引入&#xff1a; 2.反射机制 1&#xff09; 反射会生成一个类对象------类型class类型 2&#xff09;【加载阶段】class类型相当于一面镜子------透过class 反射出 真正的类的结构 3&#xff09;反射机制原理---编译阶段---加载阶段---运行阶段 2.…

【论文笔记】LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: LongLoRA: Efficient Fine…

LabVIEW四边形阻抗继电器

基于LabVIEW开发了四边形阻抗继电器&#xff0c;该系统主要应用于电力系统的距离保护中。四边形阻抗继电器在克服短路点过渡电阻的影响及躲避负荷阻抗方面展现出优良的特性。通过LabVIEW图形化编程环境实现的该系统&#xff0c;具备用户友好界面和简便的操作流程&#xff0c;有…

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

Python安装(新手详细版)

前言 第一次接触Python&#xff0c;可能是爬虫或者是信息AI开发的小朋友&#xff0c;都说Python 语言简单&#xff0c;那么多学一些总是有好处的&#xff0c;下面从一个完全不懂的Python 的小白来安装Python 等一系列工作的记录&#xff0c;并且遇到的问题也会写出&#xff0c…

2025 年前端新技术如何塑造未来开发生态?

开发领域&#xff1a;前端开发 | AI 应用 | Web3D | 元宇宙 技术栈&#xff1a;JavaScript、React、ThreeJs、WebGL、Go 经验经验&#xff1a;6 年 前端开发经验&#xff0c;专注于图形渲染和 AI 技术 开源项目&#xff1a;AI智简未来、晓智元宇宙、数字孪生引擎 大家好&#x…

1-markdown转网页样式页面 --[制作网页模板] 【测试代码下载】

markdown转网页 将Markdown转换为带有样式的网页页面通常涉及以下几个步骤&#xff1a;首先&#xff0c;需要使用Markdown解析器将Markdown文本转换为HTML&#xff1b;其次&#xff0c;应用CSS样式来美化HTML内容。此外&#xff0c;还可以加入JavaScript以增加交互性。下面我将…

数据逻辑(十)——逻辑函数的两种标准形式

目录 1 最小项和最大项 1.1 最小项 1.2 最大项 2 逻辑函数的最小项之和 3 逻辑函数的最大项之积 4 最小项之和以及最大项之积的联系和应用场景 4.1 最小项之和以及最大项目之积的联系 4.2 最小项之和以及最大项之积的应用场景 逻辑函数的两种标准形式分别是以最小项之和…

【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解

一个愿意伫立在巨人肩膀上的农民...... Crontab是Linux和类Unix操作系统下的一个任务调度工具&#xff0c;用于周期性地执行指定的任务或命令。Crontab允许用户创建和管理计划任务&#xff0c;以便在特定的时间间隔或时间点自动运行命令或脚本。这些任务可以按照分钟、小时、日…

鸿蒙Flutter实战:15-Flutter引擎Impeller鸿蒙化、性能优化与未来

Flutter 技术原理 Flutter 是一个主流的跨平台应用开发框架&#xff0c;基于 Dart 语言开发 UI 界面&#xff0c;它将描述界面的 Dart 代码直接编译成机器码&#xff0c;并使用渲染引擎调用 GPU/CPU 渲染。 渲染引擎的优势 使用自己的渲染引擎&#xff0c;这也是 Flutter 与其…

UniApp | 从入门到精通:开启全平台开发的大门

UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…

法拉利F80发布 360万欧元限量799辆 25年Q4交付

今日&#xff0c;法拉利旗下全新超级跑车——F80正式发布&#xff0c;新车将作为法拉利GTO和法拉利LaFerrari&#xff08;参数丨图片&#xff09; Aterta的继任者&#xff0c;搭载V6混合动力系统&#xff0c;最大综合输出功率高达1632马力。售价360万欧元&#xff0c;全球限量生…

【pytorch练习】使用pytorch神经网络架构拟合余弦曲线

在本篇博客中&#xff0c;我们将通过一个简单的例子&#xff0c;讲解如何使用 PyTorch 实现一个神经网络模型来拟合余弦函数。本文将详细分析每个步骤&#xff0c;从数据准备到模型的训练与评估&#xff0c;帮助大家更好地理解如何使用 PyTorch 进行模型构建和训练。 一、背景 …

电脑steam api dll缺失了怎么办?

电脑故障解析与自救指南&#xff1a;Steam API DLL缺失问题的全面解析 在软件开发与电脑维护的广阔天地里&#xff0c;我们时常会遇到各种各样的系统报错与文件问题&#xff0c;其中“Steam API DLL缺失”便是让不少游戏爱好者和游戏开发者头疼的难题之一。作为一名深耕软件开…

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤&#xff1a; 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能&#xff08;可选&#xff09;6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具&#xff0c;尤其适合数据科学、机器…

组合的能力

在《德鲁克最后的忠告》一书中&#xff0c;有这样一段话&#xff1a; 企业将由各种积木组建而成&#xff1a;人员、产品、理念和建筑。积木的设计组合至少和其供给一样重要。……对于一切程序、应用软件以及附件来说&#xff0c;重要的是掌握将已有的软件模块组合的能力&…

去掉el-table中自带的边框线

1.问题:el-table中自带的边框线 2.解决后的效果: 3.分析:明明在el-table中没有添加border,但是会出现边框线. 可能的原因: 由 Element UI 的默认样式或者表格的某些内置样式引起的。比如,<el-table> 会通过 border-collapse 或 border-spacing 等属性影响边框的显示。 4…

大模型与EDA工具

EDA工具&#xff0c;目标是硬件设计&#xff0c;而硬件设计&#xff0c;您也可以看成是一个编程过程。 大模型可以辅助软件编程&#xff0c;相信很多人都体验过了。但大都是针对高级语言的软件编程&#xff0c;比如&#xff1a;C&#xff0c;Java&#xff0c;Python&#xff0c…

【HarmonyOS之旅】基于ArkTS开发(一) -> Ability开发一

目录 1 -> FA模型综述 1.1 -> 整体架构 1.2 -> 应用包结构 1.3 -> 生命周期 1.4 -> 进程线程模型 2 -> PageAbility开发 2.1 -> 概述 2.1.1 ->功能简介 2.1.2 -> PageAbility的生命周期 2.1.3 -> 启动模式 2.2 -> featureAbility接…

BART:用于自然语言生成、翻译和理解的去噪序列到序列预训练

摘要&#xff1a; 我们提出了BART&#xff0c;一种用于预训练序列到序列模型的去噪自编码器。BART通过以下方式训练&#xff1a;(1) 使用任意的噪声函数对文本进行破坏&#xff0c;(2) 学习一个模型来重建原始文本。它采用了一种标准的基于Transformer的神经机器翻译架构&#…