基于Kubernetes与云原生的存储测试基准CNSBench

news2025/1/16 1:36:28

CNSBench A Cloud Native Storage Benchmark

  • 基础知识
  • CNSBench的摘要与介绍
  • Kubernetes Background
    • Kubernetes的工作流程
    • CNSBench提出的需求分析
  • CNSBench设计与实现
    • CNSBench的示意图
    • CNSBench的基准自定义资源
      • 基准自定义资源定义
      • 基准自定义资源实例
    • 基准测试控制器
  • 性能测试与实验
    • 测试环境与内容
    • 实验结果
  • 未来展望
  • 参考文献

基础知识

如果读者想要更第一手的原材料资源,请参看CNSBench A Cloud Native Storage Benchmark
在介绍正文之前,考虑到面向群众的原因,对后续涉及到的概念进行一些说明解释,这将有助于理解
云计算(cloud computing)是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。云计算早期,简单地说,就是简单的分布式计算,解决任务分发,并进行计算结果的合并。因而,云计算又称为网格计算。通过这项技术,可以在很短的时间内(几秒钟)完成对数以万计的数据的处理,从而达到强大的网络服务。云计算指通过计算机网络(多指因特网)形成的计算能力极强的系统,可存储、集合相关资源并可按需配置,向用户提供个性化服务。

现阶段所说的云服务已经不单单是一种分布式计算,而是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果。

私有云(Private Clouds)是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心的防火墙内,也可以将它们部署在一个安全的主机托管场所,私有云的核心属性是专有资源。
公有云通常指第三方提供商为用户提供的能够使用的云,公有云一般可通过 Internet 使用,可能是免费或成本低廉的,公有云的核心属性是共享资源服务。这种云有许多实例,可在当今整个开放的公有网络中提供服务。
== 容器化==则是一种应用程序或系统分发方法,它将应用程序或系统及其依赖项与底层基础设施隔离开来。它是一种操作系统级虚拟化,允许用户在容器中部署和运行分布式应用程序或系统,而无需为每个应用程序启动整个虚拟机。
容器有着一个非常重要的作用:保证代码运行环境的一致性
容器通过为应用程序打包和部署提供轻量级、不可变的基础结构来解决应用程序移动到其他环境就无法正常运行的问题,将应用程序或服务、其依赖项及其配置打包为容器映像。容器技术为开发人员和 IT 专业人员只需做出少量修改,甚至不需要进行任何修改,即可跨环境部署应用程序。

至于为什么容器比传统虚拟机要优秀的点在于:
(一)容器比虚拟机更加轻量化
(二)容器实在操作系统级别进行虚拟化,而虚拟机则是在硬件级别进行虚拟化
(三)容器共享操作系统内核,占用的内存对比虚拟机要少很多

云原生(Cloud Native)是基于微服务原理而开发的应用,以容器的方式进行打包。在运行时,容器由运行于云基础设施之上的平台进行调度。应用开发采用持续交付和 DevOps 实践。总结来说云原生就是基于云计算而来的技术,对云计算技术的不断精进和细化。
微服务:传统的大的单体应用拆分为更小的组件或者模块,这个组件或者模块就叫微服务。拆分为纵向拆分,从底层的 IT 基础设施到数据库,到应用中间件,再到软件程序部署包都能做到完全独立,可以单独的进行需求设计、开发、打包和部署,实现各个微服务之间一个彻底的松耦合。同时各个微服务之间又能够通过轻量的 HTTP rest 接口进行交互和协同。总结来说微服务的核心为两点:大的单体拆小、拆小的微服务之间通过接口进行交互和协同。
Kubernetes是Google公司在2014年6月开源的一个容器集群管理系统,使用Go语言开发,也叫K8S。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。正确的发音是**[kubə’netis]**

CNSBench的摘要与介绍

CNSBench (github.com) ,文章应用程序的开源地址如前面,读者可以去GitHub仓库中找到。
摘要
现代混合云基础设施要求软件能够在异构集群之间轻松移植。应用程序容器化是一种经过验证的技术,可以为应用程序的功能提供这种可移植性。然而,为了确保性能可移植性,需要在实际工作负载下对集群的性能进行可靠的验证。这种验证通常是通过对目标环境及其存储进行基准测试来实现的,因为I/O通常是应用程序中最慢的组件。然而,现有的存储基准测试并不适合生成云原生工作负载,因为它们不生成任何存储控制操作(例如,卷或快照创建),不能轻松地编排大量同时运行的不同工作负载,并且在运行过程中动态更改工作负载特征的能力受到限制。
在本文中,我们提出了第一个云本地存储基准- cnsbench的设计和原型。CNSBench将控制操作与传统存储基准工作负载与用户定义的控制操作工作负载结合起来。由于CNSBench本身是一个云本机应用程序,它本机支持大规模编排不同的控制和I/O工作负载组合。我们为Kubernetes构建了一个CNSBench原型,利用了几个现有的用于数据和元数据I/O生成的容器存储基准。我们通过对Ceph和OpenEBS (Kubernetes上两个流行的存储提供商)的案例研究,展示了CNSBench的有用性,揭示和分析了之前未知的性能特征。

介绍
基准测试的基本要求是要能够生成实际的工作负载,其结果就能反应将其实际运用之后的性能。因为以下的三个缺点但现有的存储基准测试不足以生成现代云原生环境的工作负载,因此我们提出了基于Kubernetes的CNSBench。
① 云本地存储工作负载包含大量的控制操作,如卷创建、快照等
② 典型的工作群应承载大量不同的且同时运行的工作负载
③ 云原生环境下的应用是高度动态的
启动、停止、扩展、故障转移、更新、回滚等等。这将导致工作负载行为在短时间内发生各种变化,因为每个主机上运行的工作负载的排列发生了变化。尽管现有的基准测试允许配置一个基准测试的单独运行,以生成不同阶段的工作负载,但这样的基准测试并没有提供在单一运行中表示动态的通用方法

Cnsbench针对此完成以下三种改进
(i) 产生实际的控制操作;
(ii) 协调各种各样的存储工作负载;以及
(iii) 作为基准测试运行的一部分动态改变工作负载。
因此CNSBench可视为可以产生控制操作基准且使在大量容器运行时各部协调的应用。

文章的主要贡献有
1. 我们将确定云本地存储基准测试的需求和独特要求。
2. 本文介绍了CNSBench的设计和实现,这是一个满足上述需求的基准测试,允许用户在实际工作负载的情况
   下方便地大规模地对云本地存储解决方案进行基准测试。
3.我们使用CNSBench来研究Kubernetes的两种存储解决方案(Ceph和OpenEBS)在之前没有研究过的工作负载下
的性能。

在对CNSBench进行介绍之前,需要对它所基于的环境进行介绍。CNSBench相当于是建立在Kubernetes大环境下的适用于云原生的实时快捷的应用程序,且表现良好,具有创新性。

Kubernetes Background

它由控制平面节点、工作节点和存储提供程序(以及其他组件)组成。工作节点和控制平面节点运行P ods,这是由一个或多个容器组成的Kubernetes中最小的工作负载单位。用户工作负载运行在工作节点上,而核心Kubernetes组件运行在控制平面节点上。核心组件包括(1)API服务器,它管理Kubernetes集群的状态,并公开用于访问状态的HTTP端点;(2)调度器,它将Pods分配给节点。通常,一个Kubernetes集群有多个工作节点,也可能有多个控制平面节点以实现高可用性。
存储提供者负责按单个pod的需要以卷的形式提供持久存储。

Kubernetes的工作流程

在这里插入图片描述
Pod(Plain Old Documentation)是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。

持久存储也是Kubernetes的工作流程介绍:一个需要存储的Pod产生一个PVC(持久存储声明,persistent volume claim),PVC指明它需要多少存储空间,存储控制面板,工作节点和存储提供程序,和为Pod提供存储所涉及的操作和资源。然后持久卷(PV,persistent volume)由供应商提供。如果存在满足存储请求的现有PV,则使用它。否则,从PVC中指定的存储提供者提供一个新的PV。一旦PV形成了,它就和PVC绑定在一起,卷就被挂在到了Pod的文件系统中。

这里的PVC就相当于是任务清单,告诉你要做什么,然后根据任务清单从存储库中实例化PV,PV就相当于是OS
中进程的PCB,具体对应到工作节点中的最小资源调度单位Pod,PV对其进行管理和说明。但这里资源调度的最
小单位Pod不是说大小最小,而实际上是把它绑定为了一个整体,每次运行都是整体运行调用。

CNSBench提出的需求分析

(i) 控制操作的频率增加;如容器的创建和删除,控制操作的种类也越来越丰富。除了丰富之外,依赖于底层存储技术的控制操作也可能是数据密集型的。这使得它们变慢,并增加了它们对正在运行的应用程序的I/O路径的影响。例如,卷创建通常需要(i)耗时的文件系统格式化;(ii)创建或删除快照,根据存储的设计,可能会消耗大量的I/O流量;卷大小调整,这可能需要数据迁移和更新许多元数据结构;以及(iv)卷重新挂载,这会导致缓存刷新和预热。
(ii) 个人工作量的高度多样性;
应用程序的多样化和工作负载的特殊化使得实际的工作负载生成只能通过手动选择、创建和部署几个适当的容器(例如,运行多个单独的存储基准测试,每个基准测试都模拟单个工作负载的特征)。但是,随着越来越多的各种应用程序采用集装箱化并被分解为专门的微服务集,必须选择的容器数量以组成实际工作负载继续增加。在今天的云原生环境中,手动进行这种选择是不可行的。
(iii) 这些工作量的动态性。
基准测试缺乏在这些高度动态条件下轻松评估应用程序性能的能力。在某些情况下,基准测试用户求助于手动创建这些条件,以评估应用程序的响应方式—例如手动扩展数据库实例[46]的数量。然而,在云原生环境中发现的高度动态和多样性使得手动重新创建这些条件几乎是不可能的。

因此提出了以下五点设计的核心需求

  1. I/O工作负载应该独立于控制工作负载指定和创建,以便对(I)不同控制工作负载下的I/O工作负载的性能和(ii)不同I/O工作负载下的控制工作负载的性能进行基准测试。
  2. 它应该能够编排I/O和控制工作负载,以模拟代表当今云的动态环境。此外,应该能够生成控制工作负载,作为评估单个控制操作的性能的微基准。
  3. I/O工作负载应该通过运行现有的工具或应用程序生成,可以是像Filebench这样的合成工作负载生成器,也可以是像带有流量生成器的web服务器这样的实际应用程序
  4. 用户应该能够快速配置和运行基准测试,而不牺牲提供给更高级用户的可定制性。
  5. 基准应该能够将来自不同基准的非结构化输出聚集到一个方便的位置,以便进一步分析

CNSBench设计与实现

在介绍完实现背景和需求之后,就来开始介绍正文

CNSBench的示意图

在这里插入图片描述
蓝色部分是CNSBench的组件
总体控制流程如下:A基准控制器监视API服务器创建新的基准资源。B当一个新的基准资源被创建时,控制器会创建在基准的I/O工作负载中描述的资源:用于运行工作负载的I/O W orkload P ods和用于运行工作负载的Persistent V volume (pv)的pvc (Persistent V volume Claims)。C为了运行控制操作工作负载,基准包括一个速率生成器,它以用户指定的间隔触发一个动作执行器,以调用所需的控制操作(动作)。

在原有的Kubernetes下,CNSBench实现了基准定义控制器,里面包括对动作、速率的分别控制,对I/O的负载控制等等,并且完成了容器内的封装,需要控制时,在用户端只需要参数输入等友好的使用,减少了大量代码编辑与多次不同工作环境下的多次但不重复的申明工作。CNSBench兼容了很多种基准测试情况,可以让用户更专心地将注意力集中到测试中,而不用理会语法、定义,代码编写等的繁琐工作中。

CNSBench的主要核心有两个:基准自定义资源和基准测试控制器

CNSBench的基准自定义资源

基准自定义资源定义

基准自定义资源允许用户指定三个主要基准属性:(1)控制操作工作负载;(2)运行的I/O负载;(3)输出应该发送到哪里进行收集。
(1) 控制操作工作负载:
CNSBench的主要需求之一是能够创建现实的控制工作负载,使用操作和速率的组合指定控制工作负载,动作和速率被可以地分开,这样可以更清晰地看待问题。
(2) I / O工作负载
通常,基准测试的目标是了解特定工作负载或一组工作负载在各种条件下的执行情况。CNSBench的I/O工作负载组件的作用是实例化这些工作负载,或者实例化具有与实际工作负载相同的I/O特征的合成工作负载。指定这些I/O工作负载需要定义为了运行I/O工作负载而必须创建的所有不同资源(例如,Pods和pvc)。这可能很困难,并使基准测试规范冗长而复杂。
为了减轻用户的负担并帮助他们关注整体基准测试规范,而不是I/ o工作负载的具体细节,CNSBench将I/ o工作负载规范与基准测试规范的其余部分分离开来。I/O工作负载规范是使用configmap定义的,这是一个核心Kubernetes资源,用于存储配置文件和其他自由格式的文本。
因此用户可以使用引用(按名称)要创建的I/O工作负载的创建资源操作来指定要在Benchmark自定义资源中运行哪个I/O工作负载。为了实现跨各种用例和基准的重用,当工作负载由特定基准实例化时,I/ o工作负载规范中的字段可以参数化并指定值。
(3) 输出应该发送到哪里进行收集(基准输出)
收集输出有三个挑战:目前没有一种干净通用的方式从Pods中提取文件;产生输出的运行时间可能很长;很多输出是无结构的文本形式,这使得结果难以分析。
为了解决这些问题,我们允许I/ o工作负载作者指定应该从工作负载Pods中收集哪些文件,并提供解析器脚本来处理输出。解析输出允许将大文件缩小到更简洁的大小,并以标准的方式输出结果。使用helper容器收集和解析输出文件。用户指定将最终解析的结果发送到Benchmark自定义资源的输出部分的何处。结果不需要全部发送到相同的输出。

基准自定义资源实例

在这里插入图片描述
6-13:指定了基准测试的I/O工作负载
这样使得I/O工作负载规范可以参数化,以支持它们在不同用例和基准之间的重用。
14-18:指定一个快照卷操作

与其对应的是I/O工作负载工作表和I/O负载图
在这里插入图片描述
上图是 样例I/O工作负载规范
在这里插入图片描述
上图是 具有单个工作节点和一个PV的Kubernetes集群的子集。显示所涉及的CNSBench资源(I/O W工作负载和基准),以及由CNSBench控制器根据基准规范创建的核心Kubernetes资源(快照、pvc、PV和工作负载Pods)。

基准测试控制器

基准控制器监视新创建的基准对象并运行它们指定的操作。控制器主要有三个职责:(1)触发控制操作;(2)同步各个基准工作负载;(3)收集各个工作负载的输出。

性能测试与实验

测试环境与内容

每个工作节点是一个拥有4个vcpu、8GB RAM和384GB本地连接存储的虚拟机。控制平面节点为4vcpu、12GB RAM、100GB本地存储的虚拟机。虚拟机主机位于多个机架中,机架通过10Gbps网络连接,单独的主机通过1Gbps链路连接到机架交换机的顶部。

测试了在Ceph和OpenEBS存储供应商平台下,无数据副本,三个数据副本、只运行空存储提供程序和擦除编码模式下的性能

实验结果

在这里插入图片描述
为不同的存储提供商配置创建和挂载卷所需的时间的cdf。N为同时创建的卷数量。对于所有存储配置,同时进行卷操作的数量的增加增加了创建和挂载单个卷的平均时间

在这里插入图片描述
每分钟创建的体积和附件,用于不同数量的同时操作。每一点的竖线显示该点的卷创建和附着率的标准偏差。

在这里插入图片描述
快照对I/O工作负载的影响。R =0表示为0卷副本,R =3表示为3卷副本,R =ec表示为erasure coding

在这里插入图片描述
针对不同存储提供商配置的快照创建时间的CDF。
以及在组合情况下的运行数据

在这里插入图片描述
对于五种不同存储配置上三种不同比例的I/O工作负载,与基线相比的性能变化。

未来展望

在某些情况下,控制和I/O操作可能交织在一起。例如,I/O操作的增加可能导致工作负载向外扩展,从而执行更多的控制操作。用CNSBench再现这样的事件需要一种反馈机制,将I/O工作负载执行的I/O操作的信息传递给CNSBench。CNSBench的设计和实现并不排除这种机制,但我们将其实现留给了未来的工作。

总的来说,文章就是在云原生的环境中,设计了符号各种平台负载,很好连接并可以进行性能评估的应用。
应用实    现了内部接口,使得生成负载参数化,不需要每次进行繁琐的代码设计编程,且也可以忽略内部
Kubernetes的设计规范,因为内部已经完成了封装,将其考虑进接口中的内部程序了。通过分析,应用更贴近于
现在流行的云原生,且在大环境下具有创造性地提出可广泛应用的性能评估测试应用,使得文章能够在FAST
中脱颖而出。

参考文献

[9]Merenstein A, Tarasov V, Anwar A, et al. {CNSBench}: A Cloud Native Storage Benchmark[C]//19th USENIX Conference on File and Storage Technologies (FAST 21). 2021: 263-276.

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

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

相关文章

gcc编译选项

gcc编译步骤 有下面一个源程序 main.c: #include "stdio.h"int main(void) {printf("Hello World !");return 0; }在使用gcc 将 源文件 main.c编译成 可执行目标程序 总共需要4步: 1、源文件 main.c 预处理后,生成mai…

OpenCV-Python小应用(四):红绿灯检测

OpenCV-Python小应用(四):红绿灯检测前言前提条件实验环境红绿灯检测参考文献前言 本文是个人使用OpenCV-Python的应用案例,由于水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入 …

血氧仪方案组成结构设计分析

任何产品都需要外部结构作为载体,将产品使用化的,血氧仪一样。 在血氧仪方案开发中,我们发现,血氧仪仅仅做好电子功能设计,其实根本就不够,没有好的结构件配合,其实要实现功能,那是天…

Nginx入门笔记

目录 Nginx 快速入门 1. 启动,停止和重新加载 Nginx 配置 2. 配置文件的结构 3. 提供静态内容服务(静态网站) 4. 设置简单的代理服务器 5. 设置 FastCGI 代理 Nginx 进程和运行时控制 1. 主进程和工作进程 2. 控制 Nginx Nginx 配置文件 Nginx 配置 Web 服…

Jenkins 构建maven项目时提示:No compiler is provided in this environment.

在确保虚拟机中的maven已经安装且可以正常执行mvn install 的情况下,Jenkins构建时执行maven编译仍然提示 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 首先请确保你的虚拟机上安装了JDK以及Maven&#…

MPU进化,多核异构处理器有多强?A核与M核通信过程解析

内容来源:www.forlinx.com随着市场对嵌入式设备功能需求的提高,市面上出现了集成嵌入式处理器和单片机的主控方案,以兼顾性能和效率。 在实际应用中,嵌入式处理器和单片机之间需要进行大量且频繁的数据交换,如果采用低…

医学图像处理——DeepDrr工具CT生成DRR

医学图像处理——DeepDrr工具CT生成DRR一、DeepDrr工具介绍二、DeepDRR工具使用三、测试DeepDRR工具3.1 测试数据集3.1.1 阿里云数据3.1.2 LIDC-IDRI肺结节dicom数据集3.1.3 LIDC-IDRI肺结节dicom数据集3.2 测试代码四、总结一、DeepDrr工具介绍 它可以将CT数据模拟X射线投影生…

[附源码]SSM计算机毕业设计政府公用车辆管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

VUE全家桶 (Vue-cli、Vue-route、Vuex)学习笔记

Es6 let 是变量2.const 1. 是常量不能修改 创建的时候一定要赋值 要不报错定义的类 里面的属性值可以修改3.对象创建 1.可以先定义const name1; Const a{name}; 输出a的话就是{“name”:1}; 可以直接放进去函数 Const a{ Run(){ }, Set(){ } } 4. 遍历 遍…

【附源码】计算机毕业设计JAVA校园餐厅管理

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

haproxy软件的日志输出到指定文件

默认haproxy的日志是输出到系统syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。 需要修改rsyslog配置,为了便于管…

java包以及权限修饰符

Java包和权限修饰符Java包什么是包?如何导包?IDEA如何自动化导包?Java权限修饰符什么是权限修饰符?权限修饰符的分类和具体作用范围:Java包 什么是包? 1.包是用来分门别类的管理各种不同类的,…

Vue【实战三件套】如何封装网络请求、如何解决跨域问题,如何使用mock模拟后端数据,快来一起来看看吧~

一、如何封装网络请求 1.新建项目 vue create item_12.src下新建文件config.js 什么是开发环境 在一个产品的前端开发过程中,一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境,然后才能正式的发布。对应每一个环境可能都会有所差异&…

IPD-全面认识IPD流程

一、商业实现角度透视IPD流程 基于IPD的商业实现过程包括商业机会—商业计划—商业开发—商业兑现。这个过程适用于所有行业,适用于所有创新型市场化企业,包括贸易型企业、外包解决方案型企业、投资型企业等。 商业机会包括市场管理过程中的市场洞察和机会分析,以及需…

[MQ] MQ的应用场景及Docker安装RabbitMQ

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七]

0. PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5061984?contributionType1 相关项目参考:更多资料见主页 关于图计算&图学习的基础知识概览:前置知识点学…

CEAC之《计算机应用助理工程师》3

👨‍💻个人主页:微微的猪食小窝 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 微微的猪食小窝 原创 收录于专栏 【CEAC证书】 1在子数据表中最多可以嵌套多少级子数据表? A、5级 B、6级 C、7级 D、8级D2在窗…

leetcode-每日一题-1732-找到最高海拔(简单,数学思想)

今天的每日一题很简单就是一个数学思考没啥难度 有一个自行车手打算进行一场公路骑行,这条路线总共由 n 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i 1 的 净海拔高度…

mmdetection训练得到的权重/checkpoints文件分析

这篇文章对mmdetection训练得到的模型权重,或者说checkpoints文件进行分析,一般模型保存在work-dir文件夹下,具体路径要参考训练用到的config,即配置文件。保存的模型一般是.pt的文件。 .pt模型文件读取方法 这种模型文件可以用…

详解Unity中的Nav Mesh新特性|导航寻路系统 (三)

前言 通过前面两篇的介绍与讲解我们已经对新版NavMesh有了一个基础的了解和使用,本篇我们继续讲解剩余的两个组件NavMeshModifier、NavMeshModifierVolume,这两个组件是主要是用于影响导航网格的生成的。所以内容不是很主要,但也非常重要。 …