库洛

2025年6月20日 下午 7:31|1小时 4分钟 30秒

关键词: 指针、内存、函数、技能、值类型、右值、控制块、析构、缓存、引用类型、右值引用、构造函数、资源加载、方法调用、调用派生类、调用基类、目标节点、配置轨迹

1、自我介绍: 好,面试官你们好,我是来自某大学某学生,然后平时喜欢游戏开发和图形学,在我们学校是我们游戏工作室的一个负责人,之前举办过一些技术分享和一些游戏比赛,并且我自己也参与过一些游戏比赛,并且拿过奖。然后我个人在一些独立游戏、一些引擎下渲染方面都有一些涉猎,并且之前参加参与过腾讯的一个实习,然后也在商业项目上有所拓展,今天平时我一些学习内容也会记录在自己的技术博客上,然后今天也是想参与这个酷客的这个酷洛的客户端面试,去了解下这个一个暑期实习的一个过程呃。

2.游戏经历? 客户端的同学都有,对呃。我最早开始是做客户端的一些内容的,然后我这个春招其实是客户端和同学都在投,都,反正两边都在同时去考虑吧。对,喜欢呃。最近的话我一般是王者,然后还有那个腾讯魔方出了一个新游,叫一人之下的测试,那个我也经常在玩,然后平时也会玩一些二游,像明朝星铁这种。

3.steam上的游戏玩过没? 对。也玩过一些,然后像一些黑神话, Hyper rush,还有最近的那个什么 33 号远征队,然后算隐形眼镜之类的还没打通关,但是刚开始玩就最近也在慢慢面试,反正就。嗯第一章玩了会对,我觉得它,嗯画面效果非常震撼,然后也有一些比较独特的一些。嗯,回合制,即时战斗那种感觉,人也好。

4.33号远征队特点? 就普通回合制的话呃。我觉得普通回合制的话可能就是说你在你的回合之后,你可以,你就放你的技能,然后等怪打完之后就放技能,然后到你回合又放你的技能,但是它做了一个就是即时战斗,你可以根据怪的一些反馈,然后再对它做一些 QTE 这样的一些反击。对,对,就反击嘛。对,嗯,打完了黑神话全成就,对,打两周目,也就对同一个指令。

4.黑神话连段怎么做? 就是这种,一般来说就说我这边其实有几种思路,一种就是说就像你,像就我之前在做一个动作游戏的时候,它就是我的是通过计数还是对一个动画计数?然后当你攻击完第一段的时间的时候,然后你可以按第二段的时候,你再,你需要在动画那个添加一个帧事件回调,然后设置它。

可以进行第二连段,然后计数加一,然后这样去达到第二段的这样攻击,然后这样的话,然后并且会触发一个定时器,可能,然后如果在一定时间内没有按连续掉下阶段它会重新把那个计数记为一,然后我最近又在重实现一个基于配置的和的技能编辑器,不,技能编技能和 buff 的一个系统框架吧。然后他是做了,这就是目前的话,我对技能一些替换和强化,其实这样做的就说我们会对不同的这样一个,同样一个按照一个技能作为实现两个配置。然后可能当它那个第这个技能,它会有个前摇的一个计时,如果它超过这个计时前摇的话,你可能就可以把它替换成另一个同另一个技能配置,并且重新设置它的技能时间,还有它动画实现这样一个技能替换。

然后如果但是他那个没有,目前还没考虑到连招,如果连招的话可能还要设计一个连招的一个计时,就说在超越,超过这个连招时间段,就是把动作做转之后,你再按下一个键,他才会进行一个技能的这个替换呃。我主要是这些思路就肯定不能,因为你不能打断,并且它的伤害能造成,那这样可能就不太适合。但是如果是,但是我想我知道一些游戏它是可能会存一个连招表吧。就你可能如果按下,在一定时间按下的话,你可能就缓存一下你这个当时按键信息,你可能,嗯,在这个前摇播完之后对它造成一伤害之后,然后继续播下一段那种动画,这样也是可以做到的。

对,但是如果按太快的话也也不行嘛,应该需要个检测吧?按太快的话,你可能瞬间按四下它,然后把后面四下全部播完,应该也不会吧。对。

5.问实习 这主要就是说之前一些搜索器,它那个对于项目的那个一些搜索就比较少,然后我就开这边就开发了不少搜索器功能,就是说通过一些字段,它可能就说因为它场景里面也会缓存一些实体,然后我是去对一些实体的字段进行检测,然后并将它显示到,并将它在游戏编辑器内部去显示它的那个,去用一个球形或者方形,就你自己设定它那个 prefab 去显示它的这个样子,然后方便快速找到它。这个就说很多实体里面的。嗯,你想要了的对应实体,然后也可以同时也做了一些过滤的功能,就说把一些不需要的信息也可以过滤掉,然后这些可以通过配置来去实现啊。对,就你设置好你的目标想要的一些字段和一些过滤的字段,然后你就可以在你的游戏编辑器内部去看到它的高亮显示吗?最后我是用一个 filter 去把它。嗯显示出来的什么。

6.问到我自己的引擎项目资源管理怎么做的?

这里估计想问我怎么做Unity的资源管理的,但是我这边引擎项目做的资源管理不是热更新。。。

这个是主要就是说这个是我在引擎里面做的一个资源管理的功能的。然后就举个例子,首先是就如果我自己去实现一个引擎的话,我需要把一些场景去序列化下来,然后这是一个场景,然后,然后对,还有一些场景的一些资源,然后全部序列到一个窗口里面,然后这个资源的话,我如果你想找,同时你要,你可能要拖动自然放在你场景里面,然后去,嗯,加载,然后整体是这样一个过程哦。这个倒不是,就可能这个差别比较大,这个我是,嗯,主要是仿照就 Unity 这样一个,就主要是保存和加载的过程,运行时倒是没有,不过运行时我在 Unity 里面去做过一点。

7.Unity怎么做热更新的

简历没写,第一次被问,早期做过但是之前做过的细节忘太多了

Unity 的话,我一般这边是一般是资源运行时加载一些和那个代码资源加载一般都是用 AB 包去,就是说可能就加载或者说进行一个异步加载,用一个协程去返回它的异步的一个加载的过程,然后像 Lua 这种,可能是就你去在用 Lua 渲染器去,诶,用 XLUA 这种直接去调用那个 Lua 的代码,然后不过这个没有做太深,反正就单纯了解了一下。

lead 的话我这边一般都是说,嗯,去打包一些preferve,它会自动把一些连接的一些资源去,嗯,一起去打包进去吧。然后大家也可以去做一个单独的一个包,去存一些公共资源,然后当打入一个包的时候,它可能会去引用另一个这个公共资源的包体。这样是可以,我是我是,我这样做的,大概是这样子,然后不过因为没有商业的一些实操,可能就他具体的可能不太清楚。

8.继续问实习 对,这是我是一个合金弹头,就我也不知道怎么想的,就横版格斗枪战差不多。嗯,对,核心大脑觉醒上线的项目了,应该也可以说。

我中间其实有做过一个转组过程,我前面一段时间大概两三个月是做了系统组那边,然后开发了一些活动界面。然后后面的话我转到战斗组,是了解了一些技能的一些开发,然后并且做,主要是做一些工具的开发吧。

9.实习的技能是怎么做的 嗯,技能、子弹、 buff 这些,对,通用的一些bug。

10.讲讲buff的实现,比如说你们有没有什么时间设置比如永久、持续什么的? buff 的话说是这样配置的,就说永久型的话它是-1,然后 0 的话它是这种一些瞬发的一些buff。然后一,然后如果大于 0 的话,它就是些持续性的buff,持续时间的buff。

11.周期的呢? 周期型的啊。有,它是都进行,是应该是另一个字段,就是说就我们有,我们配这个时间是持续时间的,然后周期性字段它会配一个周期的一个配置,大概是这样子的,然后它会在那个持续时间去隔一个周期去持续检测一次,并且触发一个回调去实现你的功能。这是一个一个持续一种多的伤害的这种效果能有不止吧?

12.什么buff? 我觉得,就我感觉就是说我们那边技能 buff 就啥都可以干的,然后比如说去可能播放一些音效,播放一些特效,就。包括做一些什么?就是一个跟随攻击跟随,还有一些就移动,移动攻击那种,然后还有反正也不只是素材属性,就我们这边我感觉就是什么东西都是用 buff 完成的。有的有的呃。不过这个倒是没具体看。

13.buff 有设计层数吗? 底层的话一种是 buff 本身的层数,它可能是做一个加倍的过程,这块逻辑我好像没看,就可能给对它一个伤害进行一个加倍,或者说它的一个会,或者有用一个循环去连续去对他进行一个伤害。然后还有一种可能,你就说你可能他本身有些负面状态,就。你可能要这种叠层的话,它是,它就不是在 buffer 里面写,它可能是在那个人物上面写的去,它是去增加他那个,比如说他负面的一个状态被控制眩晕的这种一种计数,那计数如果大于 0 的话,他可能就会现进入到那种动不了的状态,或者说然后当等于 0 的时候,它会重新进行一个恢复的这样一个过程哦。

就之前那个系统我有点没印象了,但是我觉得这东西肯定是应该有的,就像 buff 的话,它肯定会有一个就是初始化的这个过程,然后初始化你这边它你写的 buffer 功能的时候,你肯定是要去写它一些 buffer 的一些触发逻辑的。你如果你可能,你说你检测到你可能当前实体里面可能会有一个冰冻 buff 这种,然后你可能就会,你就,你就可能会直接把这个 buff 给结束掉了,或者说把原来的 buff 给停掉,然后变成现在这样一个buff,或者说进行一些功能,就是可能说,嗯, buff 肯定有个,基本上有个 start 阶段吧。

14.你们的子弹是什么样的? 嗯,就什么形状都有,我觉得它其实也本身就是一种飞行物技能了嗯。对。

嗯,速度也可以配置轨迹的话我这边写过,是单独写过轨迹的一些逻辑的,就,嗯,它是轨迹,它是一个类,然后你可能它有不同的轨迹,然后我这边就是说,嗯,做了这样一个轨迹,他可能说他是在逻辑帧里面去单独地从开始一个初始化,然后中间他可能 Tik 的时候会有一些不同一些逻辑,然后再到结束,然后它导致总把这些代码这个开插到那个实体原本上有的一些初始化,还有 Tik 的一些。

还有回收的这样一个生命周期里面,然后去完成这样一个子弹的效果,然后色花这边可以就直接走去选择你自己想要的这个轨迹,然后去调数值去。嗯,做出真那个实际上的轨迹是什么样子的啊?有什么样子都有,就直线、抛物线跟随,然后什么螺旋线啊?嗯,各种都有呃。就每一种就是螺旋,它肯定它就是一个单独的类,然后它里面肯定还是有些数值需要去策划、去配置,对,跟随它也是单独的layer。对呃。大部分是不行的,可能有小部分那种一些飞行器的,一些敌方的一些导弹是可以打掉的,但是我不知道它是不是属于子弹逻辑,它可能也是另一个飞行物的那种实体的逻辑,我不太确定就这个是,它是有一些导弹可以打掉的。对。

15.子弹是怎样计算碰撞的? 嗯,这个我倒是没看了,如果我说我要做的话,可能就是说它肯定不是一个。嗯,只计算距离,因为它各种大小、形状和的一些都有它可能,但是它可能也只是一个什么圆形或者一个方形的一个地方的一个碰撞进行一个处理。我是这样想的,因为它子弹各种形状太多了,不可能就只凭距离去判断。嗯,主要 c C + +,然后 c sharp 也会一点。可以没问题。

16.C++重载 重载是一种动态多态的实现形式,然后它主要就是说它可以做到就是同一个函数的一个名,然后不同的函数参数可以一一起去实现一个,在底层上它形成一个,在编辑器上实现一个不同的这样一个函数签名的这样一个机制。然后当我们调用的时候,它其实就是说像调用不同的函数签符号表签中调用不同函数签名。实现一个,就说传入不同参数调用,就同一个名字方法调用功能,然后但是这种东西如果我之前做过一个像 C + + 和 seed 这样一个交互,它可能就需要取消这种函数签名机制,就用 extra c 这样一个东西,然后去取消这个只保留它的单纯的一个函数的签名,然后去完成一个交互,

17.重写 然后重写的话,它其实是处于一个动态多态的一个预算的,就是说但我们函数里面有虚函数,它需要一个呃。个,然后你的派生类的话,你要去重载它父类的方法,然后就需要去重写,就,就它就会相当于去覆盖这样一个父类的这样一个方法,并且将将它加到一个虚表里面去,然后当父类的话就可以通过虚机制。嗯,现在去看你就是说去,嗯,你的指针去指向什么样一个巨量的方法内,然后就需要调用它不同的这样一个实现。就是重写。

18.没有虚函数的类呢? 可以,但是这种是相当于是把它那个父类去直接覆盖掉了,就如果是直接去重写的话,它是一个覆盖,或者说是一个隐藏,会把 g 列的这样一个方法去隐藏掉了,然后直接去调用 派生类 的方法。

19.有无虚函数,调用派生类的差异 那可能就用你的基类,首先你的是一个公共继承,然后你是,然后你调用基类的呃。比如说你基类是a,你就用 a 冒号去调用这个方法,它是指向了派生类吗?那它是肯定就调用派生类的实现。

有区别,就你如果是 Virtual 的话,它是通过虚表去找到它那个派生类的这样一个实现的,然后你不是 Virtual 的话,它可能就是,还是就说你去,因为你的那个指针其实是,其实相当于是本类在调用,那你就是不会有的去,就是你调用的是本类的,可能是基类的这样一个同样的函数。对。

因为它本身没有虚表,它是不会去找到它的虚表里面的,它那个子类的这样一个函数的。早早就是运行时都在走,但是它本身是编译时去产生的。这个就是编译时就决定了,如果它不是,它没有虚函数的话,

20.构造和析构virtual 对构造函数不能加Virtual。然后但是它本身其实可以去调用,它本身构造函数里面去可以去调用,就是说一些写的虚函数的这样一个方法,但是它产生它调用这个效果又是相当于就是没有虚函数的效果,因为它本身构造时候是没有,还没有将虚表完全加载好,然后它可能就,嗯是这样,是不能去用它的这样一个,嗯, Dota 的语义的析构可以加,而且尽量就是说有继承的都要加一下,因为它如果你析构的话,你如果没有去加这个 Virtual 的话。它可能就说你将他可能就会减少,他就可以,他可能就没法去触发这个子类虚构,然后去将它那个产生一些内存碎片的问题,就说它没有把这个内存去释放掉呃。

21.传值和传引用 传值的话,就是说它是相当于把整个内容进行一个拷贝的,然后传引用的话相当于就是说它是一个可能就引用的话,它其实就是说它传了一个别名,它就说它不会进行拷贝,它而是直接拿这个引用,然后你自己在这构造,然后对,反正传值的话,如果大于它那个指针大小的话,一般来说开销都是会比较大的,那个多一次拷贝。

22.传引用和传指针的区别 嗯,引用这别名,它是如果在就你目前是看不到它,就在外面,你是看不到这个引用,它是有个大小的传指针的话,就是说它用一个指针去指向这个对象,然后它可能一个大概是一个指针大小的这样一个传值,然后复制过来,然后你可以通过这个指针去获得对象。但是如果你的指引你的值本身没有那个一个指针大,就 8 字节,那可能有些时候,嗯,传值可能效率会高一点。

传指针,那会拷贝个指针,但是指针实际指向的内容不会拷贝啊。

23.int*&这种指针引用同时存在可以吗? 等一下,我有点没理解到,那我理解就是这个引用其实是对于这个指针的一个引用。对,然后不然后你可能你通过这引用拿到的这个是这个指针,然后你再想拿到指针指向内容,你还要通过这个引用的这个指针去指向,再去通过指针去指找到你的内容,我觉得这样应该是可以的。对啊。

24.移动语义 有吧就,嗯,我觉得它就是 CC 11,就说就比较明显的一个有用的东西,然后它主要解决一个问题,就是说你如果直接传右值,你要就 c 11 之前你要去获得一个右值,像比如说一些字面量,就 11 可能,然后就 i into i 等于11,它可能 i 相当于它算个拷贝,然后你用嗯右值引用的话,你直接把 11 传进去,它可能就直接拿 11 传进去,在原地址进行这样一个拷贝。

就避免了减少一次拷贝的发生,然后这是一个应用,然后对于一些资源就是左值,然后他,你如果你不想,你想转移他的资源的所有权,你就在原来就没有右值引用的时候,它也同样也是需要重新拷贝一次的时候呃。然后你现在如果你想转移自有权资源所有权的话,你就是通过一个 move 就把它转成一个右值引用,然后你可以再传入这样一个移动构造里面,然后可能我的移动赋值,然后这样去,嗯,直接拿到原对象这样的。的一个资源,然后就避免了减少,也同样也是减少拷贝的发生。对。就普通的右值,就最开始说的是那个在普通右值,就字面量一些,字面量左值就是些有地址的些值。然后它本质是就你传左值就会多一次拷贝,传右值的话,之前的右值也是需要先传给一些左值,然后再对左值进行拷贝,然后你现在一现在就可以通过一些移动到,你可以直接去拿到这个右值,然后进行这样一个移动啊。

25.智能指针 再加上智能指针的话,目前是就autoptr,然后 UNICORN Patrol,然后 shared Patrol,然后还有 weak Patrol,然后 old Patrol,由于它本身是会触发一些,就说你可能就说两个函数同时引用一个函数的话,两个,那同两个指针同时引用一个对象的话,一个弹一个对象析构了,可能会造成另一个对象反复析构,或者说你再去从另一个对象另一个指针去拿到对象的时候,可能会触发一些野指针的问题。

好,现在已经基本上好,已经被弃用了,它是去,然后在后面就在 Boost 去发展了,就一个 scope patrol,也就是现在 Unipatrol 还有一个就 share Petro 这样一个两个功能,然后 unique Petro 主要是解决了一个,首先是解决 auto Petro 的问题,然后它去本身是它是独占型的一个指针,它可以持有单一的资源,然后不允许它拷贝构造,也不允许它拷贝,然后只允许它那个,但是可以通过移动语义去转移它的所有资源权。

然后 share proto 就会, share proto 就是一个共享指针,然后它本身的实现是通过它本身就一两个指针,一个是指向它的资源,一个是等它指向它一个控制块,它的控制块的话就是说你它是本身是会里面会有一些。会有这个,会有一个强引用计数,弱引用计数,强引用计数就是用来指有多少个 share proto 去指向这个资源,然后这个资源,然后当你只有当你的强引用基数变为 0 的时候,你的资源才会被析构掉,然后这个控制块,嗯,它目的也是就说避免就多份,这就说多份 share payload 这个资源去控制,然后它就单独生成回资源去控制它这个资源,它控制块去控制它本身这个持有的资源。然后控制块里面还有一个东西叫弱引用技术,就是说当你强引用技术全送完之后,它一些 weakptr 可能会去持有这个还是持有的控制块,只有当所有弱引用技术操作系统这个控制块才被完全释放。

然后做到这样一个共享的,嗯,多个指针共享同一个资源的这样一个功能字典就是 job 字典,是吧?

20.字典 C + + C + + 字典可以说是 onedict map,然后 Ccache 和那个是 dinkne necessary,它们底层都是用哈希表去做完这个一个实现的,然后。基本上它是一个以红黑树为底层的这样一个数据结构。

哈希表、 hash 表插入的。

时间复杂度?最坏还是 on 码?平均呢。 O1 是不是不太清楚呃?

就原理主要是说哈希表它,再加上它本身是用一个拉链法去。去实现的这样一个功能,然后当就说它可能有一个同样一个,对于同样有在同一个位置的这样一个哈希表,如果它在同一个位置,它可能就在这个链表后面继续去加上这个新增的值,然后如果在不同的这样一个哈希计算下来,它的可能在不同的这个一个哈希桶里面,然后他可能就加到其他的桶里面了呃。

有像一种像线性探测,还有就平方探测,就现阶段这个可能隔一段距离找一个平方,就可能隔这样一个一段距离的平方去下面找一个这样一个位置去插入下一个值呃。清空肯定是不会的,就一般来说有两种方法去解决这个问题,就一种是它将它设置为一个有特殊的一个值或者一个标记,它这一块内容被质控了,然后去,然后避免它下次找的时候它会跳过这个质控内容去找下一个节点。然后还有一种就可能,就是说你可能就是我可能会把后面的一些值全部移往上,移一个位置呃。就是这两种方法,就对这种会发生一些比较消耗,就主要一般来说是让它标记为空,那这样就说它本身是会留在那个位置。

因为它哈希平方,它那种建议它的平方,那它是通过一个值找到下一个值,再找下一个值的啊。如果你找这个值,如果不标记为空值,就把它删掉的话,那你后面的值你也找不到了,因为这个位置已经它那边清空了,然后你就默认为它后面的值全部都没有了。

21.C#常见值类型和引用类型 嗯,对,值类型就常规的一些 int float,然后引用类型就像class。我不记得这种都是,然后它们两个区别主要是值类型,它是值类型,它就是说就是固定的一些大小,然后引用类型,它主要是一般说它会用一个地址去存储,然后去指向它的一个位置。然后像比较典型的一些,像 struct 这种,它值类型,嗯,它如果是空的话,就是也是就为一的一个大小。然后 class 本身的话,它本身会有一个一个些一些元数据的一个记载,还有些一个一个用于异步区域,然后一个还有一个保留的一个 4 字节,就保留一个地址,就说大概一个 class 它可能会本身就说没有,你没有从任何来源,它本身也会有一个大概一个三个字段指针的这样一个大小,这 32 位就是 12 位,嗯,然后 64 位就是 24 位这样一个指针的大小吧。

22.拆箱装箱 然后是这样想的,然后它们中间也可以做一些转换,比如说一些装箱,你可以把 object 去把它转换成int,用 object 去强转,去转换成那个引用类型,然后或者在一些地方它可能是自动,它会一个隐式的转换。然后拆箱的话它可能就会将 object 这样一个,也是用个强转去把它转到拆箱,对。string。

23.string

这里答完突然想起来引用计数应为引用类型,猪鼻了,stringbuilder才是纯字符数组

我知道它string,它底层是其实是个字符数组,但是我也忘它是值类型还是引用类型,但是它如果字符单纯只是一个字符数组的话,我觉得它应该就是一个值类型。

值类型一般就是说在它是在栈上进行一个直接栈帧里面去开辟它的内存,然后引用类型的话,它会在堆里面去开辟它的内存。

类型信息呃。

  1. 为什么要装箱拆箱 这个我没想过,应该是不存在,它会根据它那个目标类型的这样一个,就是进行,可能会进行一个转换的这样一个过程。看隐私转化和强制转化嗯。这是因为装箱拆箱它就本身是会发生一个主要是跟 GC 有关,因为 GC 它本身是,它会对所有引用类型进行一个这样一个检测的一些分配内存和释放内存这样一个功能。如果你去大量的频繁装箱、拆箱,会频繁的去触发GC。

  2. 24.还有其他的吗? 其他的呃。

而它就本身会多发生多个拷贝,然后这样也会多分配不少内存,我是这样想的。

  • GC中有引用计数可以释放掉吗 可以释放,就 un unigin XC 本身是从根结点去找到对应的这样一个目标,这样一个应用节点的,它本身它是不会管它的这个循环引用的。对。 Unity 它 GC 本质是一个标记清除法,然后它会先去扫一遍就是所有的引用,然后判断他们是否还在使用,然后如果没有使用的话就会将其标记为一,然后嗯第二遍去重复地去,嗯,让他去会进行一个 stop the war 过程,去全把它们全部清除,然后不过在 UAT 后续升级的时候,好像出了一个就逐帧销毁,它会标注一个就是说分帧销毁、分帧清理,然后它会有个也有个分帧的标记。然后可以让它在多帧之内将它慢慢释放出去。 4 分结束释放过程。

  • GC的释放过程 首先是一个标记的处理,就是说先把它标记,然后释放的话,它会用把它链表相当于,把它相当于把这个释放这块内存它变成为空位空内存,然后将其用链表去连起来,然后在下次分配内存的时候,你可以再从这个链表叫 HB l、b、 k 的这样一个内存里面去找到它也是合适的内存,再去将它分配到这个释放过的这个内存里面。

  • 只能由GC释放吗? csharp 它本身,还有它本身也可以做一些就非托管的,就是 UNSAFE 的去操作底层的一些机智吧。非托管就就非托管,就可能底层它是 C + + 实现的,它可能比如说举个例子,就我之前写过一些ECS,它本身是,它可能会有一些内存池,就是说它是通过,就非托管机制,它可能去操作 C + +,然后这怎么说呢?就反正就是说不是,就是绕过了 GC 的机制,你自己去手动控制内存,就这样一个功能。

  • c#析构和idisposable有什么区别

    这不是一个东西?

c 效果,它,我我目前对下的了解就指的是idisposable,它本身相当于是一个析构函数, c 下本身还有析构吗?我不太了了解这个就而 Displayport 它是可以去处理,你可以去定制它的这个 HEVC 的内容哦。嗯, REF 的话就是说它是一个 auto REF,它们都是一个引用类型。然后 REF 的话你就说你传参的话,你先得去赋个值,然后将它传进去。然后 Alt 就是说你在函数里面去引用了它之后,然后你也需要对 Alt 也是说你赋了值之后才能把它传出来,不然会报错。嗯, Alt 就是需要在函数内赋值,对,什么关键字?

  • internal这个关键字有什么用? internal, internal 这个就是。就好像就说你这个函数可能就或类,可能就只能在嗯, system 你这个程序集里面去使用了吧?

嗯,了解。

  • osi网络模型 唉,我这边可能的声音有点小,等一下我把声音调大一点,我刚才有还是有没听清? OS 网络模型是,它是一种网络协议的一些规则就定义,然后它有 7 层,是物理层链路层网络层传输层。会话层、表示层,还有应用层,这 7 层。

  • ICMP什么层 ICMP 是是网络层的。

  • TCP、UDP是什么层 TCP UDP,它是一个传输层的一个协议。 TCB 主要是它的区别,它主要是一个是可靠传输,另外一个是 OS 是基于字节流的这样一个控制,然后是基本上是一对一的,然后 UDP 的话它是一个数据报的形式的一个传输,然后它没有这个可靠机制,然后可以广播方便广播,就然后 TCP 的话,它本身它可靠机制就会通过什么些三次握手、四次握手去保证它连接,然后本质也会有一些像 ACK 流量控制、拥塞控制一些超时重传一些功能去实现它这样一个可靠的这样一个机制。然后我自己是做过一些网络框架的一些开发的,然后就我自己写过 TCB 的话,它本身就说它可能还要去做一些,你可能去做一些缓存的一些数组,然后你去它就字节数组,然后你去将 TCB 内容放到里面,然后它可能会做一些对它这个包体进行分包,因为它是面向自流式的,你可能就要在前面去设置一个这个消息字段长度,然后去,然后一些消息的这样一个名字类型,然后去 TCB 保证数据安全嗯。就是 at 机制,就呃。

还有一些会它的 botting 里面还会有一些 sing APP 这样一个功能,然后比如说它会有一个滑动窗口,如果你发过去,你这条消息发过去,它会它本身还有个序号,对不对?它会根据序号就检测你的你的这个包体是否是完按顺序,然后完整地去发送到这样一个这个服务端是接收到这些数据的,如果没有的话,你可能就会要让它重传一遍,就,然后不然就对。收到了消息不对。

  • 发送的数据有错误怎么办 数据错误本身可以用那种,就是说它本身的一个校验码去检查它,就可能把它字节按照一定规律去生成一个校验码,然后这个校验码如果不对的话,那它 TCB 里面有个校验码这个字段,然后不对的话它可能就检查有误的话,它可能就也是需要重传的。

  • 粘包拆包 嗯,对,我刚刚才其实就在讲这个东西就自然包,它就说我们需要在它这个,我们就是我们我自己写自那个 CP 框架的时候,它自己会,它会用个字节数组去存一些数据,然后你在将这个,你这个 TCB 包发到缓存处的时候,你需要在这个包体前面定义一些消息的一些字段,还有消息的这个长度,对,消息类型,然后以此来做区分。然后当我们先我们读包的时候,就先从缓存数据里面去检测到它最前面这个长度和消息类型,然后去读取这样一定长度的这样一个数据,这样去处理分联包的林字节是关闭连接吧。

  • https了解么 什么什么?

这个我没有单独了解,我是知道它是基于 TCP 实现的,但是没有去单独做过东西,它会,它还会,我知道它是,它会发送一些请求,比如说 get post,然后当这边吴菊收到之后会回复一个就消息,如果错误的话可能就404,反正一些会返回一些状态码回去。然后。

get 它是相当于请求资源,它可能比如说你去把 URL 去后面,比如说你要请求资源,比如说你想要密码什么的,你可能去 URL 增加个什么 password 等于什么什么去获取资源。 post 的话它会有个消息体去把一些数据有,但是没怎么用过就有。我想我之前有个什么 delay put 什么的。

  • 没用过吗 我其实没有在游戏中用过这个东西,然后但是但不我做过,就我做过一些像网页端的这样一个前后端的一个通信,就但是比较早期大一的时候做过,然后它会就说,比如说登录页面的话,它可能会发一个 require request 这样一个用 Gateway post 去,但是游戏中我确实没有怎么碰接触到这个东西。

  • a* 算法是做什么的 对。 a 星它是一个启发式的算法,然后它。本质上是他一般来说他会先计算自己周围的这样一个节点到它的距离,然后比如说你上下左右它是一,如果斜向的话,它是就如果取欧几里得就1.4。然后像,然后它同时它会计算它这个点到目前那个到目前终点这样一个距离。还是说的反正两种距离,两种启发的函数写的方式,一种是欧拉距离,一种是曼哈顿距离,欧拉是斜向的,欧拉距离是横轴竖向的,这样加起来的一个计算,然后将它进加入到开列表里面去,然后这个开列表里面你可以对它进行一个排序,然后或者你直接用堆结构也可以,然后先学到它这个奇葩,这个函数现在是这个代价最小的这样一个节点,拿到这个节点,然后就放到了这个 b 节点里面去, b 列表里面去。然后你然后再从这个节点去搜索它周围这一圈,然后将它加入到开列表里面,然后排序之后再去拿到最近的代价最小这个节点,然后继续的这样一步一步加入到这个 b 列表里面,然后每次加入列表还要还会还要继续继,还要记录它那个父节点,然后当中搜到这个节点之后,你的目标节点之后,然后你进行一个递归,这样一计算就可以找到它这样一个,它的这样一个最难的路径了。

对。

  • 其他的算法了解吗,贪婪算法? 贪婪算法呃。未来广义上看一些算法,但就我先说一下我了解的一些寻路就复杂简单一点就DFS、BFS,还有dijkstra。然后在游戏中常用的就像 NavMesh 的那种漏斗算法,或者说是一些可以节省一些跳点信息的Jps,或者说像那种流场寻路。这看具体的那个应用场景,

  • Dijkstra了解过吗? 就啊。对, dijkstra 它是一个多源最短路径。它就是说你可以,它可以同时找到,就是说多个目标的最短路径。然后。

  • 反问 对,想问一下,就说这边项目组大概是什么?

就目前项目组就战双和明潮还有新项目了解了呃。那就是如果,嗯,就是我想问下,就是我们招进来之后,嗯,一般会分配什么样的内容项目?对。

就大项目人比较多了解了。然后引擎都是用虚幻吗?现在都是虚幻的。嗯,就像就,嗯这边就说如果对 Unity 上去做转虚幻会有什么影响吗?就想问一下。

嗯,好。嗯,那我大概就了解了,也没什么其他问题。好,感谢面试官,拜拜。