您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 胖纸_DHW 于 2020-6-10 09:54 编辑
一、 操作系统1. (5分) 堆和栈的区别①申请速度: - 栈的申请速度较快,但却不受程序员的控制;
- 堆的申请速度较慢,容易产生内存碎片,但是用起来比较方便
②申请大小: - 栈申请的容量较小1-2M
- 堆申请大小虽受限于系统中有效的虚拟内存,但较大
③存储内容 - 栈主要保存线程代码的执行位置和一些调用代码的数据
- 堆主要保存对象和数据
④管理者 - 栈自我管理
- 堆,由项目脚本运行时的内存管理器(Mono或IL2CPP)管理。
自己的记忆口诀:手动堆,自动栈
【拓展】怎么确定数据分配到了哪个内存区?怎么确定数据分配在栈还是堆上?两个原则 - a.值类型和指针总分配在被声明的地方,声明在哪儿就分配在哪儿
- b.非空引用类型对象和所有装箱值类型对象总是分配在堆内存上
【拓展】值类型一定分配在栈上吗? 不对。
如果声明在函数的局部变量,就分配到线程栈中;
如果声明在一个class类中,就分配在堆内存中
2. (5分) 协程和线程有什么区别。 先理清楚一个概念:
一个进程可以有多个线程
一个线程可以有多个协程
协程,英文Coroutines,是一种比线程更加轻量级的存在。 协程的调度完全由用户控制。
协程拥有自己的寄存器上下文和栈。
协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,
可以不加锁的访问全局变量,所以上下文的切换非常快。
①多线程 - 多个线程可以同时运行;
- 协同程序是通过协作来完成,协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力。
②开销 - 协程不需要多线程的锁机制。不存在同时写变量冲突。
- 协程执行效率高,协程是单个线程执行,以子程序中断的形式切换,没有多线程切换的开销。
③管理 - 线程需要由内核调度,不受程序管理
- 协程由程序员自己管理,不受内核调度
自己的记忆口诀:用户级别协程、系统级别线程 二、语言基础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坐标系。如下图所示: 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)
|