面试题待解决

1、水面波浪起伏的效果是如何实现的?波光粼粼的效果又是如何实现的?

  1. 水面的动态波浪效果,我们这里使用最简单的正弦波加上法线贴图来模拟。如果想要更精确的波动效果可以考虑使用Gerstner波
  2. 不同水深颜色不同的效果,使用该顶点深度和顶点坐标的差值来计算深度,然后映射到颜色
  3. 浪涌效果,还是根据顶点深度和顶点坐标的差值来计算深度,然后叠加上一层浪涌
  4. 折射效果,用grabpass,采样之后进行偏移,最后叠加上去。

      Unity3D 简单水面shader的实现https://blog.csdn.net/o83290102o5/article/details/120296344?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164258319816780264051736%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164258319816780264051736&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-120296344.first_rank_v2_pc_rank_v29&utm_term=%E6%B0%B4%E9%9D%A2%E6%B3%A2%E6%B5%AA%E8%B5%B7%E4%BC%8F%E7%9A%84%E6%95%88%E6%9E%9C%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84%EF%BC%9F%E6%B3%A2%E5%85%89%E7%B2%BC%E7%B2%BC%E7%9A%84%E6%95%88%E6%9E%9C%E5%8F%88%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84&spm=1018.2226.3001.4187

2、静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么?

原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。
限制条件:
静态:不移动,相同材质
动态:较大顶点开销,仅支持小于900顶点网格物体,顶点着色器使用属性越多,顶点开销数量限制越大,
也要相同材质,不同缩放尺度不能动态合批。

原因:相同材质,纹理相同,同时渲染。同时运行着色器代码。
cpu: 减少cpu提交drawcall
gpu:让gpu一次搞定,减少等待时间。
 

Unity__静态合批与动态合批https://blog.csdn.net/Le_Sam/article/details/84929740?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3

Unity动态合批(Dynamic Batching)与静态合批(Static Batching)https://blog.csdn.net/zengjunjie59/article/details/104479667?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164258332516780264092122%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164258332516780264092122&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-104479667.first_rank_v2_pc_rank_v29&utm_term=%E9%9D%99%E6%80%81%E5%90%88%E6%89%B9%E4%B8%8E%E5%8A%A8%E6%80%81%E5%90%88%E6%89%B9%E7%9A%84%E5%8E%9F%E7%90%86%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E6%9C%89%E4%BB%80%E4%B9%88%E9%99%90%E5%88%B6%E6%9D%A1%E4%BB%B6%EF%BC%9F%E4%B8%BA%E4%BB%80%E4%B9%88%EF%BC%9F%E5%AF%B9CPU%E5%92%8CGPU%E4%BA%A7%E7%94%9F%E7%9A%84%E5%BD%B1%E5%93%8D%E5%88%86%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F&spm=1018.2226.3001.4187

3、一个正方体多少个顶点和三角形,为什么?如何合并顶点?

24(38),12(62)
顶点24原因:立方体上贴一张二维图形会走样,所以每个面重复贴一张,一个顶点同时是三张图片uv,所以需要三个顶点,三组UV。三顶点重合。


4、什么是DrawCall,如何减少DrawCall?
5、资源生命周期如何管理?如何加载与释放资源?资源打包颗粒是怎么设计的?资源压缩格式是什么?
6、一个相机中如何做分层渲染?底层原理是什么?

多相机控制图层渲染不同图层的内容,原理:应该跟双缓冲区有关系吧,相机渲染的区域修改颜色缓冲区,不渲染的使用黑边。


7、渲染管线的流程,后处理泛光效果如何实现?

全屏泛光(Bloom)
是一种在实际项目中常用的技术,模拟强光下的效果

技术上并不复杂
在模糊后的渲染结果基础上,再叠加原场景效果

注意:
虽然是全屏泛光,但在实现时还是要限制泛光区域,否则就会过亮
一般的做法是通过阈值的颜色控制
当颜色设置大于阈值的颜色,才被认为是有效颜色,而只有有效颜色才可以计入模糊的采样色中

后处理之泛光效果https://blog.csdn.net/qq_33064771/article/details/114260604?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164491527816780261963512%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164491527816780261963512&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-114260604.pc_search_result_control_group&utm_term=%E5%90%8E%E5%A4%84%E7%90%86%E6%B3%9B%E5%85%89%E6%95%88%E6%9E%9C%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%EF%BC%9F&spm=1018.2226.3001.4187
8、C#delegate、Action(Func)

Action 是将Delegate 的类型定义和实例化省去了

1:Action用于没有返回值的方法(参数可以根据自己情况进行传递)

2:Func恰恰相反用于有返回值的方法(同样参数根据自己情况情况)

3:记住无返回就用action,有返回就用Func


9、如何实现物体被墙遮蔽后显示轮廓的效果?shader的pass是什么东西?

        每个Pass定义了一次完整的渲染流程

Unity——物体遮挡角色轮廓显示(URPShaderGraph)https://blog.csdn.net/qq_45946883/article/details/118070864?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164491661416781685328400%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164491661416781685328400&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-118070864.pc_search_result_control_group&utm_term=%E5%AE%9E%E7%8E%B0%E7%89%A9%E4%BD%93%E8%A2%AB%E5%A2%99%E9%81%AE%E8%94%BD%E5%90%8E%E6%98%BE%E7%A4%BA%E8%BD%AE%E5%BB%93&spm=1018.2226.3001.4187
10、TCP连接的流程是怎样的?
11、项目中的打包工具做了什么事情?如何做自动化打包?
12、lua的闭包是什么?闭包产生的内存泄露如何解决?

函数内使用外部变量,例如嵌套函数的父函数的变量
解决方法:函数内的局部变量都会在栈上面,函数执行后不释放引用的闭包函数,由于闭包内有引用的外部变量,闭包也不会自动释放,所以需要释放闭包函数的引用就行了


13、A*寻路算法的原理是什么?还知道其他寻路算法吗?

8个方向
估价函数,估价出最适合的格子前进。两个列表,open,Close,从open中找出f(n)最小的格子,将它周边的格子加入到open中,并将自己从open中删除加入到close中,如此循环。边界判断。


14、求一个大型排行榜的Top100用什么算法,过程是怎么样的?

客户端:topk问题,原地建个100的最小堆解决。遍历一遍数据集合解决
服务器:不全局全服,分服。


15、lua的table的底层实现原理是什么?为什么这么设计?

array数组和hashtable(哈希表)两种数据的结合。 提高table的插入查找效率
部分整形key作为下标放在数组中, 其余的整形key和其他类型的key都放在hash表中。


16、如果让你自己实现C#字典,你如何设计?
17、3D转2D碰撞检测的实现过程,使用什么算法进行检测?
18、讲讲你对URP的了解。

URP 概念https://blog.csdn.net/liquanyi007/article/details/109776525?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164491711216780269821305%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164491711216780269821305&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-109776525.pc_search_result_control_group&utm_term=URP&spm=1018.2226.3001.4187        通用渲染管线,URP(Universal Render Pipleline)

        在2019.3版本中,Unity将轻量渲染管线LWRP重命名为通用渲染管线URP,通用渲染管线是制作精美图形和显示效果的强力方案,并且同时支持多个平台。轻量渲染管线设计初时具有快捷、可伸缩的优点,可为所有移动端带来高质量的图形效果。URP是Unity未来的默认渲染方式。
Unity官方将致力于改进通用渲染管线,为用户带来VFX Graph、Shader Graph、Custom Render Passes及最新Post-Processing的各种便利,实现等同甚至更好的品质与性能,且只需一次开发,便能在大量的平台上部署。

        需要注意的是,通用渲染管线将不会取代或包括高清渲染管线(HDRP)。

URP相比较内置渲染管线优化方面:1、光照处理(包括阴影);2、SRP bacher(SRP批处理)


19、讲讲你对HDRP的了解。

        高清渲染管线,HDRP(High Definition Render Pipleline

        在Unity2018版本,Unity为了提高引擎的画面表现,推出了High Definition Render Pipeline,高清晰渲染管线,简称HDRP。
        HDRP专注于高端图形渲染,针对高端硬件配置,像PC、XBox和Playstation,其面向高逼真度的游戏、图形demo和建筑渲染、超写实效果,以及所需的最佳图形效果,目前还不支持在手机移动端使用HDRP。
        想得到HDRP的完美表现能力,需要大量的贴图,漫反射贴图、高光贴图、金属贴图、平滑贴图、AO贴图、法线贴图、凹凸贴图、高度贴图等等,所以要做HDRP流程需要非常长的时间和庞大的制作团队以及充足的预算。


20、开放封闭原则:

        一个软件实体应当对扩展开放(open),则修改关闭(不修改原来的代码这就是closed)。在设计一个模块时,应当使得这个模块可以在不被修改的前提下被扩展(这就要求我们不能在一个类中写死所有的功能)。也就是说,应当可以在不必修改源代码的情况下修改这个模块的行为。

        
21、Unity内置的渲染管道只有ForwardDeferred两种。

Forward Shading
原理:每个作用于物体的像素光单独计算一次,drawCall随着物体与光照数量增加而成倍增加
优点:不受硬件限制
缺点:光照计算开销成倍增加随着光源和物体数量增加。
每个物体接受光照数量有限。

Deferred Shading
原理:物体颜色、法线、材质等信息先渲染到G-Buffer中,光照最后单独渲染,避免每个物体多个光照批次的问题
优点:作用于每个物体光照数量不再受到限制,光照计算不随着物体增加而增加
缺点:移动设备需要支持OpenGL3.0。
不支持MSAA。
半透明物体仍然使用前向渲染。


22、性能优化做了什么内容?
23、LineRenderer的底层实现原理是什么?

顶点数组,两点确定一条直线,DDA或者Bresenham直线算法绘制像素


24、讲讲你对ECS的了解。

        实体组件系统,主要由3个部分组成,Entity(实体), Component(组件), System(系统),之前我接触的都是面向对象的编程,而ECS是面向数据的编程。


25、热更新的流程,如何做版本管理,如何校验热更包,如何确保下载过程,热更包的颗粒策略。


26、设计模式

 装饰模式:抽象构件类(Component)、具体构件类、抽象装饰类(维持抽象构件类型对象的引用)(Decorator)、具体装饰类

        构件类为实体对象,装饰类为装饰对象,

        例子:对新房进行装修,基本内容不变,美化具体对象

外观模式:Facade(外观角色)、SubSystem(子系统角色)

        子系统角色,实现子系统的功能

        例子:一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现

中介者模式:使对象之间的关系数量急剧减少,引用中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构抽象中介者(1、声明抽象业务)、具体中介者、抽象组件类(1、维持一个抽象中介者的引用,2、申明自身方法,处理自己行为,3、定义依赖方法,与中介者通信)、具体组件类(对具体中介者保持引用)

        例子:1、一个客户信息的内容管理

                2、有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,就称为同事类。

27、 lua和C#或C语言响度调用的底层实现原理是什么?

lua 底层c语言实现的。
C#与Lua交互过程:
C# Call Lua : 由C#文件调用Lua解析器底层dll库(由C语言编写),再由dll文件执行相应的Lua文件;
Lua Call C# :
1.Wrap方式 首先生成C#源文件所对应的Wrap文件,由Lua文件调用Wrap文件,再由Wrap文件调用C#文件
2. 反射方法
C#与Lua交互原理:
C#与Lua进行交互主要通过虚拟栈实现,栈的索引分为正数与负数,若果索引为正数,则1表示栈底,若果索引为负数,则-1表示栈顶。

C# Call Lua:由C#先将数据放入栈中,由lua去栈中获取数据,然后返回数据对应的值到栈顶,再由栈顶返回至C#。

Lua Call C#:先生成C#源文件所对应的Wrap文件或者编写C#源文件所对应的c模块,然后将源文件内容通过Wrap文件或者C模块注册到Lua解释器中,然后由Lua去调用这个模块的函数。
代码层面:
CSharp调用Lua过程:
C#生成Bridge文件,Bridge调dll文件(dll是用C写的库),先调用lua中dll文件,由dll文件执行lua代码
C#->Bridge->dll->Lua OR C#->dll->Lua


28、 双面Shader怎么实现的

每个Pass定义了一次完整的渲染流程

两个pass,一个用来渲染正面,一个用来渲染背面

29、 数组和链表的区别?数组和哈希表区别?

面试题解答系列:数组和链表的区别 - 知乎

30、 点乘和叉乘分别表示的物理意义

点积

可以通过向量的点积的结果的符号来判断两个向量的位置关系。

如果值大于0,则夹角在0度到90之间(不包含90度),两个向量的方向基本相同。

如果值等于0,则夹角为90度,两个向量的方向相互垂直。

如果值小于0,则夹角在90度到180度之间(不包含90度),两个向量的方向基本相反。

向量的点积还可以用来求得一个向量在另一个向量上的投影。

vector3.dot

叉积

 我们可以通过向量的叉积来得到一个平面的法向量

还可以通过向量的叉积得到的结果向量的方法来判断向量b是在向量a的顺时针方向还是逆时针方向

 Vector3.Cross

31、值类型和引用类型

值类型:int、long、float、char、bool、枚举(enum)、结构体(struct)。

引用类型:类,数组,接口,string,委托,

32、 (=>)lambda表达式底层原理

匿名方法

委托delegate的声明和使用、匿名方法、Lambda表达式https://blog.csdn.net/SwordArcher/article/details/102913462?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164455150816780269846675%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164455150816780269846675&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-13-102913462.pc_search_result_cache&utm_term=%E5%8C%BF%E5%90%8D%E5%A7%94%E6%89%98&spm=1018.2226.3001.4187

33、 UI方面你遇到什么优化上面的问题

        1、UI使用图集加载

        2、问题:UI抗锯齿不起效

        Canvas的Render Mode设置为Screen Space - Overlay的时候,UI的渲染不会经过MASS         buffer,而是直接写入到Final buffer

        解决方案

        使用Screen Space - Camera模式。

        3、关闭静态或非交互式元素的Raycast Target

        4、避免使用Camera.main

        5、避免使用布局分组。
        使用锚点进行比例布局。在拥有动态元素数量的活跃UI上,考虑编写代码来计算布局,仅在需要时运行该代码,而不是每次发生改变的时候。

34、 字典和哈希表的区别

区别:

 35、 堆栈Stack和Queue的区别

 36、 渲染管线

1、一个渲染流程分为3个阶段:应用阶段(Application Stage),几何阶段(Geometry Stage),光栅化阶段(Rasterizer Stage)。

应用阶段:cpu负责,由开发者准备好摄像机,模型,光源等数据,做好粗粒度的剔除工作,并设置好材质,纹理,shader等渲染状态,最后输出渲染所需要的图元的过程。

几何阶段:gpu负责,把上个阶段传过来的图元进行逐顶点,逐多边形的操作。把顶点坐标从模型空间经过一系列转换最终到屏幕空间,输出屏幕空间二维顶点坐标,顶点深度、着色等数据,交给光栅器处理。

光栅化阶段:gpu负责,对上个阶段的逐顶点数据(纹理坐标、顶点颜色等)进行插值,再逐像素处理,决定哪些像素应该被绘制在屏幕上,并计算他们的颜色。
 

Unity URP/SRP 渲染管线浅入深出【匠】 - 知乎
 

37、 代码绘制一个正方体

Mesh是Unity内的一个组件,称为网格组件。
◦ Mesh 网格
◦ MeshFilter 网格过滤器
◦ Mesh Renderer 网格渲染器
Mesh:是指模型的网格,建模就是建网格。细看Mesh,可以知道Mesh的主要属性内容包括顶点坐标,法线,纹理坐标,三角形绘制序列等其他有用属性和功能。因此建网格,就是画三角形;画三角形就是定位三个点。
Mesh Filter:内包含一个Mesh组件,可以根据MeshFilter获得模型网格的组件,也可以为MeshFilter设置Mesh内容。
Mesh Render:是用于把网格渲染出来的组件。MeshFilter的作用就是把Mesh扔给MeshRender将模型或者说是几何体绘制显示出来。

它们之间的关系大概就是Unity中的对象就是GameObject,每个GameObject都可以有一个MeshFilter组件(也可以没有),该组件又有Mesh属性(这个一定有),而该属性又有顶点坐标,法线等属性。而如果GameObject里有MeshFilter,则必须要Mesh Renderer才能将此网格渲染出来,不然是看不见该网格的。
Mesh的属性:
• 顶点坐标(vertex)
• 法线(normal)
• 纹理坐标(uv)
• 三角形序列(triangle)
顶点坐标:顶点坐标数组存放Mesh的每个顶点的空间坐标,假设某mesh有n个顶点,则vertex的size为n
法线:法线数组存放mesh每个顶点的法线,大小与顶点坐标对应,normal[i]对应顶点vertex[i]的法线
纹理坐标:它定义了图片上每个点的位置的信息. 这些点与3D模型是相互联系的, 以决定表面纹理贴图的位置. UV就是将图像上每一个点精确对应到模型物体的表面. uv[i]对应vertex[i]
三角形序列:每个mesh都由若干个三角形组成,而三角形的三个点就是顶点坐标里的点,三角形的数组的size = 三角形个数 * 3.

正方体有6个面 12个三角面,6*4(24个顶点:因为需要受光照影响,所以一个顶点用在不同方向的面上时,该顶点就应该多写一个,因为虽然点的x,y,z相同,但法线却不同,这样算来,正方体的一个面上的点法线相同,一个面四个顶点,所以6个面24个顶点)

8个顶点,24个顶点信息,12个三角序列,上下左右前后6中共24个法线,与顶点信息对应,每个面获取不同的贴图,24个UV顶点信息

/uv贴图就是把你想要展示的图片顶点信息对应模型的顶点信息

unity3d之浅谈Mesh组件:mesh绘制三角形,正方形,正方体https://blog.csdn.net/yffgamestart/article/details/90268680?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2.pc_relevant_paycolumn_v3&utm_relevant_index=5

38、顶点着色器

顶点着色器的最基本的任务就是把顶点坐标从模型空间转换到裁剪空间中

 39、ShaderGraph

ShaderGraph使用教程与各种特效案例:Unity2020(持续更新)https://linxinfa.blog.csdn.net/article/details/108049048?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&utm_relevant_index=2

 40、排序算法十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序_HK的博客-CSDN博客_插入排序比冒泡排序快

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序https://blog.csdn.net/m0_37741420/article/details/106981276?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164500050016780366511409%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164500050016780366511409&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-106981276.pc_search_result_control_group&utm_term=%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F&spm=1018.2226.3001.418741、Unity中获取物体尺寸(size)的三种方法

  1. Renderer.bounds.size:这个值的结果真实反应出有MeshRenderer这个组件的模型的尺寸。不须要再乘以localScale。缩放多大都会读出来多大
  2. MeshFilter.mesh.bounds.size:通过MeshFilter获得原始模型的mesh,该值返回的结果是原始mesh的尺寸。此时不管人物怎么缩放,输出结果都是一样
  3. Collider.bounds.size:为物体加入Collider,然后使用Collider.bounds.size。不过这个不能非常好的反应物体的大小,bounds获得的是物体的外包矩形,并且这个外包矩形的X,Y,Z和世界坐标一致。因此,若物体有旋转,获得的尺寸就不能反应出物体的真实大小,仅仅是其外包矩形的大小。

42、Screen Space和Viewport space

 43、链表

        链表是一种物理存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

        线性表的顺序存储结构缺点是每一次插入和删除元素,大量元素的移动会导致时间效率低下。为了改进顺序存储结构的缺点,引入链式存储结构,即为链表。

        链式存储结构的特点是用一组任意的存储单元来存储线性表中的数据元素。这样在插入和删除元素时,可以通过直接修改指针完成操作,时间效率大大提高。但因为链式存储结构的存储单元不连续,所以需要通过指针来访问它的后续元素。

        为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,我们需要存出一个其直接后继的存储位置。我们把存储数据元素信息的域成为数据域,把存储后继位置的域称为指针域,这两部分构成一个节点。

        n个节点链接成一个链表,即为线性表的链式存储结构。因为每个节点只有一个指针域,所以又将这样的链表称为单链表。

44、FixedUpdate真的是固定的时间间隔执行吗?

FixedUpdate真的是固定的时间间隔执行吗?聊聊游戏定时器 - 慕容小匹夫 - 博客园 (cnblogs.com)

45、UnityWebRequest

UnityWebRequest将HTTP事务分解为三个不同的操作:

  1. 向服务器提供数据
  2. 从服务器接收数据
  3. HTTP流量控制(从定向和错误处理)
  4. UpLoadHandler

    处理数据将数据上传到服务器的对象

    DownLoadHandler

    从服务器下载数据的对象

    UnityWebRequest

    与HTTP通信并管理上面两个对象

46、 Dictionary的内部实现机制

        Dictionary之所以能实现快速查找元素,其内部使用哈希表来存储元素对应的位置,然后我们可以通过哈希值快速地从哈希表中定位元素所在的位置索引,从而快速获取到key对应的Value值。

        在添加元素过程中,有一个很重要的问题,如果产生冲突怎么办?即如果我后面需要插入的一个元素(假设这个值为11吧)的key值的哈希值也为6,此时targetBucket的值也是为0,但元素列表中0的位置已经存放了元素了,这样就出现了冲突,那Dictionary是怎样处理这个冲突的呢?处理冲突的方法有很多种,Dictionary处理的方式是链接法。Dictionary会把发生冲突的元素链接之前元素的后面,通过next属性来指定冲突关系。

    可以说,Dictionary的实现原理也是一种空间换时间的思路,多使用一个buckets的存储空间来存储元素的位置,从而来提升查找速度。

47、齐次坐标

 48、怎么判断两个平⾯是否相交?不能⽤碰撞体,说出计算⽅法

  • 对于两个平⾯Ax+By+Cz+D=0与ax+by+cz+d=0,只要(A,B,C)与(a,b,c)不成⽐例,这两个平⾯就是相交的
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值