[Unity] U3D初级客户端基础

查看:696 |回复:0 | 2020-6-10 09:49:50

您需要 登录 才可以下载或查看,没有账号?注册

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)

1.jpg

评分

参与人数 1活跃度 +12 展开 理由
慕先灵因铭世界 + 12 虽然不知道这是什么,但不妨碍我不明觉厉

查看全部评分

2020-6-10 09:49:50  
 赞 赞 0

使用道具 登录

0个回答,把该问题分享到群,邀请大神一起回答。

CG 游戏行业专业问题

图文教程技术文章技术文库手机游戏引擎手游引擎
显示全部 9
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表