笔试题汇总(更新ing)

2025年11月29日 面试/笔试

问:什么是 upvalue?他有什么作用

它是一个方法内部里面使用了自己外层方法的局部变量

当一个方法引用了不是自己作用域的局部变量,这个变量将会被闭包捕获。即使外部的作用域的方法已经结束,它依旧可以随着内部的方法存活。

它可以让外层方法的局部变量成为自己内部的私有环境中的变量

问:多个协程时,堆、栈是否可以共享

堆可以,栈不行。

堆是共享的只要有引用就可以使用,栈每个协程独立保存局部变量和调用环境,只能自己使用。

问:启用协程的 gameObject关闭后,协程处于什么状态?

如果是active(false)的话协程将会继续执行。但是如果直接将其的gameObject或者monobehaviour destory的话协程将会被停止

问:动、静合批是什么、它们的触发时机?

静态合批:

勾选了 Static Batching 的静态 GameObject 会在场景加载时,根据“材质是否相同”把多个 Mesh 合并成一个更大的 Mesh,以减少 DrawCall。

它适用于完全不会移动的对象,触发时机通常在 场景加载或进入 Play 模式后

动态合批:

对于会移动的 GameObject,只要它们使用完全相同的材质实例,并且单个 Mesh 的顶点数较小(一般建议 300 顶点以内),Unity 就会在 每一帧 的 CPU 端尝试将它们临时合批成一批提交给 GPU,从而减少 DrawCall。

动态合批不会真正把 Mesh 合成一个,而是把多次渲染合并成一次提交。

静态合批是真合 mesh,动态合批是假合 mesh、真合提交。

前者是预处理,后者是 CPU 每帧临时打包。

问:使用getComponentsInChildren获取组件时,是否会包含自身

会,如果有的话

问:Unity中透明物体在哪个阶段进行绘制

透明物体是在不透明物体之后、UI 之前,RenderQueue = Transparent 阶段绘制的。

问:一张1024×1024的图片,最多可以生成多少mipmap

每一层为之前的一半,则:log2(1024) + 1 = 10 + 1 = 11

问:纹理压缩后,打包,运行时显存存放哪类

纹理压缩后打进包,运行时加载进 GPU 时,Unity 会把纹理转换成 GPU 原生压缩格式(如 ASTC / DXT / ETC2)。显存中存放的就是这个 GPU 压缩格式,而不是 PNG/JPG 原图或 CPU 端格式。

问:解释一下lua的元表是什么?

lua的元表本身不会更改table的结构,只是会修改一些行为,例如修改查找或者读取等的行为机制

问:元表中常见的原方法都有哪些?

最常见的是__index 和__newindex。

__index当访问不存在的key时会出发(一般可以作为类的模拟和继承常用)它可以是一个table或者function

__newindex时是当新增一个不存在的key时会触发(一般做只读表或者一些其他限制时使用)。可以是一个table或者function

除此之外,

  • __add:重载 +
  • __tostring:打印 table 时自定义输出
  • __call:让 table 像函数一样被调用
  • __eq / __lt / __le:比较操作
  • __gc:userdata 的析构方法(面向 C 绑定)

问:如何用元表实现“类”或“继承”?

lua本身没有类,但是可以用元表来模拟。

首先让作为类的表将__index设置为自己

然后将要作为实例的表设置元表为作为类的表。如果需要继承的话,那么可以让父类成为子类的index

Animal = {} Animal.__index = Animal function Animal:new(name) local o = { name = name } setmetatable(o, self) return o end function Animal:Speak() print(self.name .. ” says hi”) end

问: 元表有什么常见的用途?

  • 面向对象(class、继承)
  • 代理表(监控读写、只读表)
  • 运算符重载(+、==、< …)
  • 自定义 tostring、call 行为
  • 性能优化(共享方法表)

问:ref 和 out 的区别

ref 用于传入并修改已有变量,因此调用前必须初始化;out 用于返回多个值,因此调用前不需要初始化,但方法内部必须为它赋值。两者本质上都是引用传递,只是语义限制不同。

问:进程和协程的区别

进程是操作系统调度的独立执行单元,拥有自己的内存空间;

协程是用户态的轻量级任务,依赖所在线程运行,不能并行,只能通过 yield 时间片轮转。

问:byte int long float 的长度是多少?

byte 是1自己 int是4字节 long是8字节 float 是4字节。

问:for(byte i = 0; i <= 255; ++i){ debug.log(i)} 这个会打印什么?

无限打印 0~255

问:1字节等于多少byte

是 1 个字节(byte)= 8 bit

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注