【面试】U3D初级客户端基础

2

主题

8

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-9-20 08:59:41 | 显示全部楼层
最近老大在一顿面试,招聘小弟,然后今天收到了一份8分的卷子(总分100分),这让她怀疑起自己的卷子,顺手就把卷子扔给我,让我测试一下,看看是不是卷子出难了。我揣摩了一下出题人的意图。凉了,老大想开我!!这是两年前测试我的卷子,我又做了一遍,emmm,50、60分吧,完了我要被开除了,赶紧补一下基础。。。想要面试的同学赶紧补起来。
一、 操作系统

1. (5分) 堆和栈的区别

①申请速度:

  • 栈的申请速度较快,但却不受程序员的控制;
  • 堆的申请速度较慢,容易产生内存碎片,但是用起来比较方便
②申请大小:

  • 栈申请的容量较小1-2M
  • 堆申请大小虽受限于系统中有效的虚拟内存,但较大
③存储内容

  • 栈主要保存线程代码的执行位置和一些调用代码的数据
  • 堆主要保存对象和数据
④管理者

  • 栈自我管理
  • 堆,由项目脚本运行时的内存管理器(Mono或IL2CPP)管理。
自己的记忆口诀:手动堆,自动栈

【拓展】怎么确定数据分配到了哪个内存区?怎么确定数据分配在栈还是堆上?

两个原则

  • a.值类型和指针总分配在被声明的地方,声明在哪儿就分配在哪儿
  • b.非空引用类型对象所有装箱值类型对象总是分配在堆内存

【拓展】值类型一定分配在栈上吗?

不对。
如果声明在函数的局部变量,就分配到线程栈中;
如果声明在一个class类中,就分配在堆内存
<hr/>2. (5分) 协程和线程有什么区别。

先理清楚一个概念:
一个进程可以有多个线程
一个线程可以有多个协程
①多线程

  • 线程是并行的,多个线程可以同时运行。
  • 协程是串行的,在任何一个时刻,同一线程中的协程,只有一个协程在跑。
②开销

  • 协程不需要多线程的锁机制。不存在同时写变量冲突。
  • 协程执行效率高,协程是单个线程执行,以子程序中断的形式切换,没有多线程切换的开销。
③管理

  • 线程需要由内核调度,不受程序管理
  • 协程由程序员自己管理,不受内核调度
<hr/>二、语言基础

1. (5分) ArrayList和List之间的主要区别是什么?这两种类型有什么优缺点?

区别:ArrayList不安全,需要装箱拆箱,List类型安全,支持泛型,不用装箱拆箱效率高。
2、(5分)下面代码有什么问题,为什么?0分

class A
{
  public int value1 = 0;
};

class B : A
{
  public int value2 = 99;
};

A pa = new A();
B pb = new B();
A a = pb;
B b = pa;
B b = pa;这个赋值操作会报错因为父类型无法显示转化成子类型,编译的时候就会报错,A类型无法隐式转换成B,就算改写成B b = (B)pa;,也会报错
InvalidCastException: Cannot cast from source type to destination type.
A a = pb;不会报错,因为b就是从A继承出来的,所有值都能保留
3. (15分)用你熟悉的任意语言输出以下内容



看到题目,不要冲动,分析完再下手,老大说当年是看在我这题做对了才让我进来的,然后现在我做错了,完了,退步了,面临就业危机emmm
这题就是打印九九乘法表
几个注意点就是:内外层循环分别要输出什么,然后注意换行
先用伪代码输出一遍,
外层循环i,遍历[1,9],每次i=+3
内层循环j,遍历[1,9],每次i=+1,然后输出输出9行,3个一换行,所以每行分别输出i+1的乘法和 i +2 的乘法
    void WriteMutiplicationTable()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        for(int i = 1; i <= 9; i+=3)
        {
            for(int j = 1; j <= 9; j++)
            {
                string formatStr = "{0}*{1}={2}\t{3}*{1}={4}\t{5}*{1}={6}\r\n";
                sb.Append(string.Format(formatStr, i, j, i * j ,i + 1,(i + 1)* j,i+2,(i + 2) * j));
            }
            sb.Append("\t\t\t\r\n");
        }
        Debug.Log(sb);
    }
三、Unity基础

2、(5分) Unity的ScrollRect由哪些组件组成?描述一下ScrollRect的实现原理。

todo 研究一下
3、(5分) DC是什么?UI界面的DC受哪些因素影响?

Draw Call就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作。
影响DC因素:材质、图集、深度、Alpha = 0
四、三维几何

1. (5分) 简单说一下,向量的点乘、叉乘的几何意义。



向量的点乘:a · b = |a| * |b| * cosθ



点乘的几何意义:

  • 计算两个向量之间的夹角,判断这两个向量是否垂直
  • 计算一个向量在另一个向量方向上的投影长度。

向量的叉乘:a ∧ b =  |a| * |b| * sinθ



点乘的几何意义:

  • 在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。
  • 在二维几何中,叉乘还有另外一个几何意义就是:aXb等于由向量a和向量b构成的平行四边形的面积
在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示:


<hr/>2. (15分)如下图,已知L向量和单位向量N,向量N和向量P垂直,求P向量

(注意N是单位向量,不可以使用三角函数)



这题我是真的不会。。。因为我前面这道几何意义的题没答对,只是背下来了,没有理解。
解答:(我现在查了一下,再做一遍)
求的是P向量,根据向量的点积几何意义,向量L点乘向量N可以得到向量L在N上的投影长度
len = L·N
那么N * len得到有大小的N矢量,然后根据矢量相加,就可以得到P向量
P = L + N * len
P = L + N * (L · N)

参考

Unity内存问答笔记
用大白话讲进程和线程、协程的区别 - 简书
unity_scroll_rect
回复

举报 使用道具

3

主题

8

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-9-20 08:59:59 | 显示全部楼层
8分2333
回复

举报 使用道具

1

主题

6

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-9-20 09:00:39 | 显示全部楼层
Draw Call知道,说DC就懵了[捂脸]
回复

举报 使用道具

0

主题

6

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-9-20 09:01:06 | 显示全部楼层
P = L + N * (-N·L)
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表