1.快速排序的原理

随机选一个基准值 pivot(避免最坏情况 O (n²))

把基准交换到数组末尾(方便统一处理)

用一个指针标记 “小于基准区” 的边界

从头遍历数组

  • 遇到比基准小的元素 → 放到 “小于区”,指针右移
  • 遇到比基准大的元素 → 跳过

遍历结束后,把基准放回 “小于区” 和 “大于区” 中间

递归处理左右两部分

2.Mask以及Rect Mask 2D的区别是什么?

都是两者都是图形遮罩

  • Mask的使用场景更通用可以用任意形状的 Image / Sprite 做遮罩,而Rect Mask2D主要用于矩形遮罩,不能做圆形、异形遮罩
  • Mask开销大,容易打断 UI 合批,大量使用会掉帧,Rect Mask 2D性能极高,几乎无额外开销,适合滚动列表、背包等大量遮罩
  • Mask:基于 Stencil Buffer(模板缓冲),GPU 层面实现,会打断合批,Rect Mask 2D:基于 裁剪矩形,纯 CPU 计算裁剪范围,不占用 Stencil(模板)
  • Mask:支持多层嵌套 Rect Mask 2D不支持嵌套,只能一层

3.OutLine的实现方式是什么?

outLine也就是描边,主要是使用在text上,给文字的进行描边

实现方式:把原文字向上下左右四个方向偏移绘制一遍,再叠上原文字,形成描边效果。复制 4 份顶点数据,分别向 上、下、左、右 各偏移一个描边宽度,颜色统一设为描边色,最后在中间绘制原图,视觉上就出现一圈轮廓。

4.点乘和叉乘

点乘是用来判断2个向量是否是同方向的cos,而叉乘可以用来判断点是否在三角形内部

5.怎么判断一个点在矩形内部

讲矩形分成2个三角形,在讲三角形的每个顶点与该点组成向量,分别与每条边进行叉乘,如果结果都是相同的,则在矩形内部

6.A*算法

A*算法是存在2个部分,一个部分G成本,也就是起点移动到当前节点的真是代价,一个部分是预估代价,是启发式猜想。

对于预估代价,一般采用曼哈顿距离来进行判断

7.你觉得自己的优势是什么?

8.平常用AI来做哪些工作?

9.实习对你的帮助?

10.Lua在你项目中的使用场景?

11.C#调用Lua的原理

在 Unity 中使用 xLua 或 tolua 时,C# 调用 Lua 首先会在 C# 层创建并初始化一个 Lua 虚拟机实例,用于承载 Lua 的运行环境、全局变量与函数,之后 C# 会将 Lua 脚本加载到虚拟机中并编译为字节码执行,让对应的函数、变量等内容生效;由于 Lua 底层由 C 实现,其与外部交互依赖统一的 Lua 栈进行数据传递,C# 调用 Lua 函数时,会按照规范将函数名与参数依次压入 Lua 栈,再通过底层的 Lua C API 触发函数执行,执行完成后的返回值会留在栈中,最后 C# 从栈中取出返回值并完成类型转换,整个过程依靠虚拟机和栈交互完成跨语言调用,上层封装库则简化了手动操作栈的繁琐步骤。

12.Lua调用C#的原理

Lua 本身无法直接访问 C# 的类与方法,需要 C# 主动将相关成员暴露并注册到 Lua 虚拟机中,通常会通过代码生成工具生成对应的 Wrap 包装类作为桥接层,在程序启动时把 C# 的类、方法、属性注册到 Lua 的全局表并绑定对应的元表,当 C# 对象传递到 Lua 环境时,会以 userdata 指针形式存在而非直接复制数据,当 Lua 调用该对象的方法时,会通过元表找到对应的 Wrap 函数,Wrap 层从 Lua 栈中获取参数并转换为 C# 可识别的类型,再转发调用实际的 C# 方法,执行结果会重新压入 Lua 栈并返回给 Lua,同时通过对象引用表管理双方对象生命周期,避免 GC 异常,整体依靠元表、Wrap 层和栈交互实现跨语言调用。

儒意景秀二面