解谜类游戏《迷失岛2》等如何抽象出一套通用高效开发框架?

解谜类游戏以精妙的谜题设计和引人入胜的故事叙述为特点,考验着玩家的智慧与观察力。《迷失岛2》与《南瓜先生2九龙城寨》正是这一领域的佳作。游戏以独特的艺术风格和玩法设计吸引了大量玩家,而它们背后隐藏着一套强大的框架。

上海胖布丁游戏的技术总监在 Unite Shanghai 2024 游戏专场上,为大家分享了《解谜类游戏的框架设计》。这个框架以“傻瓜化”“高效率”为主要目标,涵盖鼠标点击、拾取道具、选择道具、关卡切换、NPC 对话、根据条件控制显示、非线性路程、二周目、小游戏等内容。目前该框架已经在多款游戏中得到应用,如《迷失岛》系列、《南瓜先生2九龙城寨》以及《怪物之家》等。经过多个项目的迭代和优化,已经不仅仅局限于解谜类游戏,在模拟经营、生存等其他类型上同样胜任,适用于各种复杂度的游戏需求。

解谜类游戏的框架设计

大家好!我演讲主题是《解谜类游戏的框架设计》,这个框架设计是我们公司游戏用的解谜类的框架,然后我是来自上海胖布丁游戏的技术总监。

我们公司的游戏有很多,早期做解谜类的,现在我们做了很多包括模拟经营、平台跳跃、生存类,包括动作类的现在也在开发,类型很多。

图片

这次用这个框架的主要游戏是《迷失岛2》,是解密类的游戏。这里面有一些小游戏,通过点触的方式移动场景进行关卡切换、跟 NPC 对话,然后可以拾取一些道具,把道具用在一些地方,比如说触发门开。

还有一个是《南瓜先生2九龙城寨》,是有个人走的这样一个解谜游戏,这个游戏也是用的这个框架,它跟《迷失岛》不太一样,《迷失岛》是点触的,这个是通过手指点击场景会自动寻路,包括可以用手柄或者键盘去操作角色,然后会有一个触发区域的概念,只有走到触发区域的时候才会进行一些交互。

图片

我们看一下这个框架大概有哪些内容,常见的是鼠标点击、拾取道具,可以通过点击场景中的道具区域拾取道具,可以选择道具,然后通过点击场景中的一些交互区域进行使用道具;还有一些关卡切换,点击区域可以进行关卡的跳转。

我们这些动画用的是 Spine 的切换,有一些特殊的会用到 Spine 骨骼,还有皮肤。NPC 是可以对话的,有一些 NPC 可以切换对话,不同的游戏进程会播放不同的对话。有一些部分会根据条件控制物体的显示隐藏,比如说本来是一条完整的鱼,如果你用刀对它使用可以切掉它,然后得到一些道具之类的。

我们的游戏不像传统的解谜游戏是线性的,必须通过这个场景之后才可以进行下一个。我们的游戏玩家可以在很多的场景自由地跳转。不同场景中的一些游戏状态会影响到别的场景,所以这也就是说我们设计框架的时候要考虑到这些情况。我们的游戏是二周目的,它的场景会有不太一样的,跟第一次玩的时候不太一样,比如说 NPC 的状态或场景的一些内容,包括可能一周目跳转这个场景,二周目就变成了另外一个场景。

小游戏我们做了十几二十几个,跟游戏剧情不太关联,是比较独立的小游戏。每个小游戏都会有三种随机的,也就是每个玩家玩的小游戏不一样,这也是我们在设计框架要考虑怎么实现这个。我们用随机的方式,可能你每次打开这个场景,或者你关闭游戏进程再打开的时候,这个场景会随机成另外一个,我们要想办法怎么做到这次玩的时候关掉进程重新进入之后随机出来的小游戏是一样的。另外就是还有地图。

图片

这个框架的目的我提了一个关键词叫傻瓜化,不用懂程序的概念他也可以编这些关卡出来,包括策划的需求,我就算不用懂程序,我只要知道在 Unity 引擎这里面具体怎么操作的,简单拖一些预制、改一些参数就可以实现大部分的需求。

这个方式的好处就是,开发起来很快,只要简单拖一些组件上去,把美术的资源导入进来,然后我们可以进行一些组织,根据一些游戏进程我们就可以快速去控制它,并且可以快速测试它。现在的框架实现了我现在编好之后直接一运行可以快速测试我刚才编的逻辑正不正常。还有一个好处是风险隔离,关卡中有各种各样的游戏进程,我不希望我现在改了这部分,这部分改好之后发现会影响到另外一个。这也是我们框架的目的,希望最小化地去隔离风险。

在跨场景的时候,因为我们知道 Unity 跨场景会把场景的东西卸载掉,所以我们要解决跨场景的时候这部分的游戏状态会影响到别的游戏状态,所以我们要解决这个问题。

 GM 工具以及道具使用效果

我们可以开发一些 GM 工具。我们可以快速测试,比如说这部分我按照这个框架的规范编辑好了,但是我现在快速测试,这个需要有一个道具,所以这里面可以通过一个工具添加一个道具出来可以直接使用,甚至我可以不添加道具直接解锁,我直接模拟他使用了这个道具之后的一个游戏状态,然后去测试这个表现编辑的对不对。

多道具区域演示

道具还有一个我们需要考虑的。道具区域不是一对一的,大部分的情况是一个道具区域只能使用一个道具,使用不了的时候可能没有任何的反应。但这个演示是有顺序的,这几个道具虽然可以使用但是要按照一定的顺序使用,这里就弄了一个多道具的概念,一个道具区域可以识别多种道具,并且可以放上去之后可以再拾取。

  小游戏

图片

这里面是我们的一些小游戏。小游戏也是一个问题,我们应该要有一个大概的抽象思维统一的解决它们,就像我们游戏中有很多的二维数组的小游戏。如果每个小游戏单独去实现,一方面效率很慢,另一方面如果出现问题我们没有办法快速地去解决它,所以对于一些同样类型的,比如说都是二维数组类型的,我们可以抽象成通用的二元数组的工具类解决这个问题。

实现方案

  实现点击的方案(一切的基础)

图片

我们现在要看一下,因为要实现点击,我们这个游戏大部分的逻辑都是点击操作的,所以首先要考虑点击是怎么实现的,一种是 UGUI 的组件,UGUI 组件就是点击 UI 的东西,但是现在场景中的点击操作比如说道具的拾取不是 UGUI 的组件,没有办法用 UGUI 的方式。

我们看大部分的时候大家怎么做的,一方面是可以直接在 MonoBehaviour 里写出 OnMouseDown 等函数,这样如果你在物体上挂了 Collider 可以执行到,这是第一种方式。第二种方式我们在 Update 里面用射线检测,我们判断鼠标点击,然后去射线检测,检测到物体,然后再对它进行操作。

但我觉得这两种不太好,刚刚说的可能还要考虑移动端,因为移动端需要使用 GetTouch 加上射线检测做,我觉得这几种不太好是因为它会跟 UGUI 的窗口会冲突,因为我们的 UI 是用 UGUI 做的,场景逻辑全部是用 3D 场景的,所以我们需要考虑说当 UI 的界面打开的时候,我们需要特殊处理,比如当 UI 点开我们不能点击场景中的东西。还有我们移植到 Xbox、PS 的时候是用手柄操作的,我们通过虚拟鼠标的方式实现时,因为这些 OnMouseDown 还有 OnMouseUP 接口只支持鼠标或者触摸屏,当我们有虚拟鼠标的方式,用手柄控制虚拟鼠标去操作物体的时候,就没有办法做到。

还有一些比如我们要获取坐标的时候也比较麻烦,管理上也不太好。

图片

我推荐是用这种方式,直接在 Camera 上挂一个 UGUI 的组件 Physics2DRayCaster,这个挂上去之后,它会把 UGUI 的事件转发到相机照射的物体上,这样可以在非 UGUI 的场景中实现在非 UGUI 场景中点击包括拖动等事件。

图片

这个就是我们在物体上挂一个 Collider 2D 组件,然后我们实现 UGUI 的 IPointerDown 等事件,可以监听到 UI 点击等事件,这样的好处就是我们可以不用管跟 UGUI 冲突的问题,另一方面我们做扩展的时候特别容易,比如说我刚刚说的用虚拟鼠标,包括我们后续有出现的扩展,就是因为我们全部用 UGUI 了,就统一了起来,如果有问题我们只要解决 UGUI 的问题就行了。

  通过点击区域的实现,可以组成各种逻辑

图片

通过刚才的方式,我们可以抽象出来一个点击区域,我可以在游戏中指定我要执行什么函数,通过这个点击区域可以实现很多东西的组合,比如说道具拾取,就是通过 ClickArea 加上 PropResource 这个组件,在点击的时候执行到自定义的道具数拾取的点击,这样就可以把道具拾取到背包里面。还有一些小游戏的操作,一些门的切换也是点击之后进行的操作,包括跟 NPC,包括道具使用区域都是通过点击实现的。

  游戏流程控制实现

图片

我们刚才解决了点击区域的问题,我们还有一个问题要解决,我们的游戏表现有多种多样,比如说这个地方开门,那个地方是动画切换,包括物体的显示隐藏,如果全部用代码,会非常不高效,所以我们其实可以抽象出一个游戏 ID 和分镜 ID 的概念。

我们只要有一个游戏 ID 的概念,就可以通过这个标记做任何的事情,比如说刚刚演示的时钟,时钟完成之后相当于解锁了一个游戏 ID,这时候我们有一个标记,还有道具使用,比如说这个东西放上去之后让我们给它解锁了一个游戏 ID。有了这个游戏 ID,我们可以统一地根据这个游戏 ID 判断做一些操作,比如说会监听游戏 ID 更新,改变物体的显示隐藏,包括动画的切换。

分镜 ID 是因为大部分游戏 ID 跟分镜 ID 是一一对应的,一个游戏 ID 对应一个分镜 ID,但是有一些特殊的一个游戏 ID 可能会解锁多个表现,比如说我现在通电了会导致灯亮了这是一个表现,也可能导致风扇也转了,这样就是一个游戏 ID 加上风扇的分镜 ID,然后再加上一个电灯的分镜 ID,这些可以实现解锁了一个游戏 ID 我们可以解锁多种游戏状态。

这个流程控制器是让使用者不需要关注存档的变化,他也可以进行一些高效的测试,比如说我现在测试这个游戏 ID 对应的是什么表现,那我就可以用工具解锁一下,测试一下看这个表现对不对,我们可以通过多个场景跳转然后去测试一下它的表现。

图片

这个是 AnimationController 的示例,可以看到它是一个游戏 ID 加上分镜 ID,会有一些触发器,我后面会讲另外一个概念,就是触发。首先游戏 ID 我们有好多种,比如说门的开放、时光机的表现、蓝莓使用、火柴使用,会对应不同的分镜 ID。比如说刚刚演示的通电灯亮了,包括说它通电风扇转了,这是它的流程控制的作用。

  道具使用区域

图片

道具使用区域会跟道具进行比对,这个道具使用区域会设定支持的道具 ID,并且这个道具 ID 使用了之后会解锁对应的游戏 ID,因为我现在的框架是所有的都是围绕游戏 ID,其他的这些东西其实都是解锁了游戏 ID,所以道具使用区域也是使用完道具以后会标记这个道具使用过的游戏 ID,我们通过这个道具使用,我们可以去做一些别的操作,如一些变化什么的。

  道具拾取组件

图片

道具拾取组件也是一样的,拾取之后会有一个游戏 ID 的匹配,这个道具使用之后如果没有判断游戏 ID 的解锁,可能这个道具还可以重复拾取,现在它会再判断一个游戏 ID 的状态。

  门组件

图片

门组件也是一样,会跟 ClickArea 做一个组合。

  触发器与触发区

图片

还有触发器的概念,因为我们有很多的表现不一样,有的表现是门开的,有的表现是解锁的动画,切换动画,有的表现是一些显示状态的切换,有的是一些音效的改变或者是 NPC 对话的改变。如果每个表现都用硬代码写,这样会非常不高效,所以我引入了一个触发器的概念,也就是我把每个东西给它最小粒度地抽象出来

比如说显示隐藏有一个显示隐藏的触发器,它是只管物体的显示隐藏,还有一些比如说播放动画有一个组件一个触发器,它在触发的时候会把动画切到别的动态,包括可以监听动画的完成,一般情况下我们播放完之后我们需要监听它的完成事件,所以我们会切换做一些别的事情。还有包括跳转场景、随机播放,包括有一些条件的判断的触发器,我们可以分流不同的触发器的执行。

触发器这个概念是比较像是行为树,但是我觉得行为树比较重,因为这个游戏大部分的东西比较简单,所以我单独抽象了一个触发器出来,可以适用于游戏中的基本上所有逻辑。

这个触发器也是可以自定义扩展的。

图片

这是刚刚说的触发器的条件,它可以根据不同的条件分流。

图片

触发器有一个扩展我们可以实现自定义的触发器,有一个 TurnOn 和 TurnOff 的状态,我们在自定义触发器里实现打开之后的状态是什么样的,关闭的状态是什么样的,我们就可以实现后续没有办法实现的需求,也即可以通过自定义触发器实现。

这个触发区的概念和触发器有点像,首先要监听主角的走路,比如说我们有的主角的控制,要等待主角走到这个区域可能会显示一个气泡框,或者走过来之后会触发一些流程的表现。这是触发区的概念。

实操展示

图片

这是我们刚刚演示的效果,具体怎么做的,有一个 Animationid control,然后我们会有一个播放动画的触发器,这个时钟是一个小游戏,时钟解锁之后会解锁一个游戏 ID,这个 Animationid 会监听对应的游戏 ID 去播放门的打开状态,这样我们可以通过不同的触发器跟 Animationid control 的组合,快速实现这样的需求,几分钟可以实现这个东西。

图片

这是不同的逻辑之间会有串联,或者并联会有互相影响的,这是它需要解锁这边的小游戏,把电通了,通了之后会影响刚刚这个场景中好多的部分,比如说风扇会转导致墙上的海报掉下来,这时候跟 NPC 对话,本来停电的时候会很热,通电之后会凉快,所以他更愿意跟你说一些别的对话,推进新的剧情,这是我们通过多个 Animation control 实现的,可以看到这个图有多个不同的 Animation control,然后这个不同的 animation control 会判断不同的游戏 ID 的状态,比如说这个游戏 ID 有没有解锁,另外的游戏 ID 有没有解锁,然后对应分流去控制更多的一个表现。

我们看一下我们是怎么操作编辑一套流程的,可以看到这是一个门,然后我们编辑一个游戏 ID 和分镜 ID,然后这里面拖一个触发器预制,这是控制动画切换的触发器,我们设计好它的动画名字这时候监听门打开之后的动态,然后切到门常开的动画,然后我们直接运行,运行之后通过解锁游戏 ID,我们就通过这个游戏 ID 解锁快速测试到了这个表现,很方便地去编辑,方便地去测试。并且这个不是程序员也可以操作,并不需要关注说它这个代码逻辑是怎么样的,怎么执行的,不用知道它的原理,所以就是我刚刚说的傻瓜化的操作。这个会让你的游戏开发会变得更高效,并且会更不容易出错。

图片

还有对应二维数组的小游戏我们可以抽象出通用的脚本,比如说抽象出来一个类,这个类是专门用于格子类的二维数组的小游戏,我可以设定横向多少个,纵向多少个,我可以索引到左边的格子、右边的格子的状态,包括我可以获取到某一个格子它里面的状态,比如说这个格子有没有东西。在我们实现刚刚看到的小游戏的时候,我们可以很快地做出二维数组类的小游戏。

我们在做一些东西的时候我们要考虑好怎么把它抽象,因为我觉得抽象会让这个游戏会更加快速,并且高效。

图片

因为随着游戏需求的越来越多,我们会发现到后面复杂度越来越高的游戏,用触发器去管理的话,会绕来绕去的,会很容易出问题,并且不太直观。所以后面我抽象出来一个状态机的概念,这个状态机它是针对一个物体,比如说一个 NPC,我们预先设定好有哪些状态,比如说状态一是开口说话,状态二是可能招手,状态三可能是干嘛的,我们这样通过切状态的方式控制物体,并且很好地跟它解耦。状态机不会关注游戏进程,你可以理解它是一个机器人,它是通过外部驱动它,你外部传给它的状态是对的,它就是对的,所以这个方式有一个好处,不容易出问题,并且我们可以很好地管理某一个对象。

其他的就是一些这个框架的其他系统。

图片

比如说存档,如果说我们刚才游戏 ID、分镜 ID,因为要存的字段太多了,如果用 Unity 的 PlayerPrefers 去存的话可能不太够,并且管理也不太好,我后续抽象出来一个通过文件的方式存,并且使用的方式也很简单,但是最终存的时候会收集成一个文件,通过 Json 的方式转成文本存到磁盘里,也支持存档槽。一般游戏有不同的存档槽,所以这个存档系统也会支持对应的存档槽功能。

图片

音频系统。因为如果说你直接通过创建 audio source 的方式去播放一些音频的时候,这时候不太好管理,因为游戏有音效、音量的调节需求,如果一开始没有考虑好,全部都要用 audio source,可能到时候音量管理是一个问题。另外的方式就是说创建出来的太多的 audio source 可能会导致 GC 的问题,所以我弄了一个音频系统可以通过对象池的方式复用 audio source,并且它可以管理好不同音量的管理,包括可以放在不同的物体上,包括它可以直接通过代码的方式,比如说我这个就是通过直接代码的方式给它播放对应一个 key 的,我提前设定好一个 key,然后这个 key 是指定的哪一个音频文件是不用管的,这样做的好处如果有单独一个音频的人员他做音频的时候不需要关注你这个游戏是什么样的,他不需要关注代码怎么写的,你只要在特定的地方打上调用的代码你就不用管,包括他也能控制这个音频是不是随机的音频,比如说有一些脚步声,他会随机地播放一些音频,包括音量多少,包括会有一些更高级的用法,这样会跟音频的开发人员区分开,各司其职。

图片

本地化的问题。因为我们的游戏基本上都会面向全球,所以说我们会有一个本地化的问题,大部分本地化直接 Text,如果一开始没有考虑到本地化的问题,可能直接把文本写在代码里面,这样对未来本地化的时候可能是一个大灾难,所以我们的本地化系统是基于配置表的,我们把所有的本地化语言都写在一个配置表里,我们去设置一个 Key,通过比如说我们在 Text 里面挂上一个脚本对应,然后指定它对应的是哪一个 Key,然后会自动读取对应语言的文本。

图片

我们还会有一些资源管理要考虑,是用 Resource 或者是 AssetBundle,这些可能也要考虑一下。还有就是我们会有一些内存泄露,内存泄露有比较常见的问题我们需要关注,因为有一些时候你在场景里面你写了一个静态的方法,给它设置进去切换场景之后会导致这里面一些引用计数在的话它就不会被清掉,所以这些也要考虑。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++探索学习】第十九弹——进程替换:深入解析操作系统中的进程替换机制

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在Linux操作系统中,进程替换(Process Replacement)是一个重要的概念,它允许程序通过系统调…

SSH克隆github项目

1、生成密钥 ssh-keygen -t rsa -C "你的邮箱xxx.com" 全程回车即可(不用输入ras文件名及密码)、为了方便下面的公钥查看 2、配置公钥 查看公钥内容 cat c:\Users\xxx\.ssh\id_rsa.pub(修改为自己的路径及名字) 将公钥内容复制并粘贴至…

ASP.NET Core 9.0 静态资产传递优化 (MapStaticAssets )

一、结论 💢先看结论吧, MapStaticAssets 在大多数情况下可以替换 UseStaticFiles,它已针对为应用在生成和发布时了解的资产提供服务进行了优化。 如果应用服务来自其他位置(如磁盘或嵌入资源)的资产,则应…

电子信息工程自动化 单片机自动门控制系统设计

摘 要 伴随着社会经济的发展进步、科学技术的发展进步以及人民群众日常生活质量的逐渐提升,自动门开始全面进入人民群众的生活,逐渐发展成为了宾馆、大型超市、政府等当代建筑里必须配备的设备,是建筑自动智能化综合水平的主要标准之一。它具…

防火墙有什么作用

防火墙的作用:1. 提供网络安全防护;2. 实施访问控制和流量过滤;3. 检测和阻止恶意攻击;4. 保护内部网络免受未经授权的访问;5. 监控网络流量和安全事件;6. 支持虚拟专用网络(VPN)。防…

Cesium-地球材质-坡度

1. 创建viewer 创建viewer并添加地形 const viewer new Cesium.Viewer("cesiumContainer", {terrainProvider: await Cesium.CesiumTerrainProvider.fromIonAssetId(3956, {requestVertexNormals: true}) }); 2. 创建canvas色条 添加getColorRamp方法&#xff0…

企业网双核心交换机实现冗余和负载均衡(MSTP+VRRP)

MSTP(多生成树协议) 通过创建多个VLAN实例,将原有的STP、RSTP升级,避免单一VLAN阻塞后导致带宽的浪费,通过将VLAN数据与实例绑定,有效提升网络速率。 VRRP(虚拟路由冗余协议) 用…

VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序 下面是一个完整的Vtk入门程序&#xff0c;我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…

React基础知识四 Hooks

什么是hooks&#xff1f; (coderwhy) hooks是react 16.8&#xff08;2019年&#xff09;出的新特性。 react有两种形式来创建组件——类式和函数式。在hooks之前类式组件就是react最主流的编程方式。 这个时候&#xff0c;函数式组件是非常鸡肋的&#xff0c;几乎没什么用。因…

TYUT计算机操作系统简答题

简述分组交换的优点。 高效灵活、迅速可靠&#xff0c;且各分组小&#xff0c;路由灵活&#xff0c;网络生存性能好。 解决 IPv4 地址紧缺有哪些方案&#xff1f; ① 使用代理服务器&#xff1b;② 使用地址转换&#xff1b;③ 升级到 IPv6。 网络适配器的作用是什么&#…

tomcat+jdbc报错怎么办?

1. 虽然mysql8.0以上的不用手动添加driver类&#xff0c;但是一旦加上driver类&#xff0c;就要手动添加了 不然会报找不到driver类的错误 2. java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:xXX?serverTimezoneU…

Qt6.8 QGraphicsView鼠标坐标点偏差

ui文件拖放QGraphicsView&#xff0c;src文件定义QGraphicsScene赋值给图形视图。 this->scene new QGraphicsScene();ui.graph->setScene(this->scene);对graphicview过滤事件&#xff0c;只能在其viewport之后安装&#xff0c;否则不响应。 ui.graph->viewport…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…

工厂流水线上位机开发--USB转串口收不到数据,485通信时好时坏 不稳定问题

做过众多项目中&#xff0c;出现过很多次USB转485的返回值异常问题&#xff0c;自动化跑的好好的&#xff0c;一段时间后突然就查询不到返回值。 第一次出现时&#xff0c;上位机软件说是下位机问题&#xff0c;下位机说监控到返回数据了&#xff0c;是上位机问题&#xff0c;吵…

Mac曲线救国实现Bandizip右键一级菜单

一、前言 个人认为&#xff1a;Bandizip是Mac上最好用的压缩软件&#xff0c;没有之一。 在Mac系统上&#xff0c;学习版的Bandizip由于签名检验问题无法在访达右键的一级菜单显示 解压相关菜单。 有能力的&#xff0c;希望还是支持正版&#xff0c;找找优惠渠道应该100左右。…

矢量数据库

随着人工智能技术的深入发展&#xff0c;从图像识别到自然语言处理&#xff0c;从智能推荐到自动驾驶&#xff0c;AI的应用场景日益广泛。 而在这背后&#xff0c; 这种变革技术的核心数据概念是矢量。通过矢量化和大型语言模型(LLM) 的强大功能&#xff0c;生成式 AI 实现了其…

大模型学习有什么发展前景?

前景人工智能大模型是指拥有超大规模参数&#xff08;通常在十亿个以上&#xff09;、复杂计算结构的机器学习模型。它通常能够处理海量数据&#xff0c;完成各种复杂任务&#xff0c;如自然语言处理、图像识别等。 2024年政府工作报告提出“发展新质生产力”&#xff0c;并将…

2025澄迈漓岛音乐节品牌招商大会成功举行

——共谋音乐盛事&#xff0c;携手推动文化经济发展 12月6日&#xff0c;“2025澄迈漓岛音乐节品牌招商大会”&#xff08;以下简称“招商大会”&#xff09;在澄迈举行。本次大会由澄迈福山发展有限公司、福山咖啡文化风情镇旅游区联合主办&#xff0c;海南绿发投资有限公司承…

鲲鹏麒麟部署MongoDB4

本次部署采用Docker方式进行部署&#xff0c;服务器为鲲鹏服务器&#xff0c;CPU架构为ARM64&#xff0c;操作系统版本信息为 # cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Tercel)找镜像 首先在https://hub.docker.com/网站上找到相关的额镜像&…

数据结构 (29)基于树的查找法

前言 数据结构中的基于树的查找法是一种高效的查找方法&#xff0c;它利用树形结构组织数据&#xff0c;使得查找过程能够迅速定位到目标元素。 一、树的基本概念 树是一种非线性结构&#xff0c;主要用来描述客观的层次结构关系。在树结构中&#xff0c;一个元素&#xff08;称…