|
发表于 2023-3-11 13:07:52
|
显示全部楼层
C#基础
栈:全称是线程堆栈,英文 Stack
堆:全称是托管堆,英文Heap
解释1
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
栈由系统分配内存大小
堆由程序员自己申请
解释2
存放在栈中时要管存储顺序,保持着先进后出的原则,它是一片连续的内存域,由系统自动分配和维护。
而堆是无序的,它是一片不连续的内存域由有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
1,申请方式
heap(堆):程序员自己申请,并指明大小。
stack(栈):由系统分配。
2,申请效率
heap(堆):由new分配的内存,相对效率和速度都较低,且容易产生碎片,但由于是程序员自己申请操作,灵活性强,使用方便。
stack(栈):效率较高,速度较快,但程序员无法对其进行控制。
3,存储的数据类型
heap(堆):存储引用类型。比如:类、接口、数组等。
stack(栈):存储值类型,即存储固定长度的数据。比如:整数、字符、结构、布尔、枚举等。每个程序在执行时都有自己的堆栈,其他程序不能访问该堆栈。
原文链接:c#堆和栈的区别_c# 堆和栈的区别和联系_KindSuper_liu的博客-CSDN博客
参考:C# GC与内存管理 - 简书 (jianshu.io)
Unity基础
四种。
平行光: Directional Light
点光源: Point Light
聚光灯:Spot Light
区域光源: Area Light
instantiate: 最简单的一种方式,以实例化的方式动态生成一个物体
Assetsbundle: 即将资源成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块Get 下来,然后从这bunde中load某个obiect,unity官方推荐也是绝大多数商业化项目使用的一种方式
Resource.Load:可以直接ad并返回某个类型的Obiedt,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中
AssetDatabase.loadasset: 这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的。
主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画,
骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨路按角色特点组成一定的层次结构,有关节相连,可做相对运动皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
单一网格模型动画由一个完整的网格模型构成,在动画序列的关键顿里记录各人顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。
LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。
- Unity中,照相机的Clipping Planes的作用是什么?调整 Near、Far两个值时,应该注意什么?
剪裁平面 。从相机到开始渲染和停止渲染之间的 距离。
- 将Camera组件的ClearFlags选项选成Depth only是什么意思? 有何用处?
仅深度,该模式用于对象不被裁剪。
- 在编辑场景时将GameObject设置为Static有何作用?
设置游戏对象为Static将会剔除(或禁用)网格对象当这些部分被静态物体挡住而不可见时。因此,在你的场景中的所有不会动的物体都应该标记为Static。
- 有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染?
把A组物体的渲染队列大于B物体的渲染队列
对于两个平面Ax+By+Cz+D=0与ax+by+cz+d=0,只要(A,B,C)与(a,b,c)不成比例,这两个平面就是相交的。
- Unity Asset、AssetBundle等资源的详解:
Unity 资源管理 AssetBundle使用详解 - 知乎 (zhihu.com)
向量
Unity面试题学习笔记(14)——U3D数学向量篇 - 知乎 (zhihu.com)
SDK
Unity和Android交互(持续更新) - 哔哩哔哩 (bilibili.com)
Unity打包Android最全攻略(含完整流程及常见问题) - 知乎 (zhihu.com)
NGUI
NGUI和UGUI对比及性能提升技巧 - 简书 (jianshu.com)
UGUI
多屏幕分辨率下的UI布局一般考虑两个问题:
1.布局元素的位置,即屏幕分辨率变化的情况下,布局元素的位置可能固定不动,导致布局元素可能超出边界
2.布局元素的尺寸,即在屏幕分辨率变化的情况下,布局元素的大小尺寸可能会固定不变,导致布局元素之间出现重叠等功能。
为了解决这两个问题,在Unity GUl体系中有两个组件可以来解决问题,分别是布局元素的Rect Transform和Canvas的Canvas Scaler组件。
画布的三种模式缩放模式
屏幕空间-覆盖模式(Screen Space-Overlay),Canvas创建出来后,默认就是该模式,该模式和摄像机无关,即使场景内没有摄像机,UI游戏物体照样渲染
屏幕空间: 电脑或者手机显示屏的2D空间,只有x轴和y轴
覆盖模式: UI元素永远在3D元素的前面
屏幕空间-摄像机模式(Screen Space-Camera),设置成该模式后需要指定一个摄像机游戏物体,指定后UGUI就会自动出现在该摄象机的“投射范围”内,和NGU的默认UI Root效果一致,如果隐藏掉摄像机,UGUI当然就无法渲染
世界空间模式(WorldSpace),设置成该模式后UGUI就相当于是场景内的一个普通的“Cube 游戏模型”,可以在场景内任意的移动UGUI元素的位置,通堂用于怪物血条显示和VR开发
简单来说在一个Canvas下,需要相同的material,相同的纹理以及相同的Z值,例如UI上的字体Texture使用的是字体的图集,往往和我们自己的UI图集不一样,因此无法合批。还有UI的动态更新会影响网格的重绘,因此需要动静分离。
。Imgae比Rawlmage更消耗性能,image是可以可以合批,RawImage是单张一个dc
。Image只能使用Sprite属性的图片,但是Rawlmage什么样的都可以使用
。Image适合放一些有操作的图片,裁剪平铺旋转什么的,针对Image Type属性
。Rawlmage就放单独展示的图片就可以,性能会比Image好很多
优化
- 简述一下对象池,你觉得在FPS里哪些东西适合使用对象池?
对象池就存放需要被反复调用资源的一个空间比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。特点: 用内存换取cpu的优化
细节级别 (LOD) - Unity 手册 (unity3d.com)
Unity【LOD Group】- 关于性能优化中LOD的使用与总结_lodgroup_CoderZ1010的博客-CSDN博客
大量的模型文件不但会增加包体的大小,而且在运行时会大量增加内存消耗,因此对于LOD有一句空间换取时间的评价,当然最终是否采用LOD技术要根据具体情况而定,性能优化无非是CPU、GPU与内存之间的取舍。
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要你进行额外的操作
区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。静态批处理:自由度很高,限制很少缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。
- 什么是DrawCall? DrawCall高了又什么影响? 如何降低DrawCall?
Unity中,每次擎准备数据并通知GPU的过程称为一次Draw Ca。DrawCal越高对显卡的消耗就越大。降低DrawCal的万法
Dynamic Batching
Static Batching
高级特性Shader降级为统一的低级特性的Shader。
热更新
- 如何解析版本文件? 如何加载AB包资源? 具体流程是怎么样的?
1.解析版本文件列表
。 File.ReadAllLines(读取文件列表资源路径URL)
获取资源名称,获取AB包名称,获取依赖项,字典容器存储0
获取Lua文件0
2.加载资源
。 异步加载资源AB包,AssetBundleRequest请求,AssetBundle.LoadFromFileAsync
先检查依赖项,再异步加载AB包依赖项0
。加载成功后都有对应的回调方法,将资源作为参数传入
1.整包: 存放在上SteamingAssets里
策略:完整更新资源放在包里
优点: 首次更新少
缺点: 安装包下载时间长,首次安装久
2.分包
策略:少部分资源放在包里,大部分更新资源存放在更新资源器中
一优点: 安装包小,安装时间短,下载快
缺点:首次更新下载解压缩包时间日
3.适用性
海外游戏大部分是使用分包策略平台规定-国内游戏大部分是使用整包策略
4.文件可读写路径
-Application.streamingAssestsPath 只读目录Application.persistentDatapath 可读写目录
资源服务器地址URL
5.[从资源服务器]下载单个文件或多个文件NetWorking.UnityWebRequest获取URL,HTTP GET,连接资源服务器获取到downloadHander的文件数据Data,完成后会回调方法,将文件Data作为参数传出
6.检查是否初次安装
Lua
- Lua如何调用C#
- 资源如何打包?依赖项列表如何生成?
1.查找指定文件夹ABResource里的资源文件
。 Directory.GetFile(资源路径
。新建AssetBundleBuild对象
获取资源名称,并赋值对应AB名称0
。获取各个资源的依赖项: 通过UnityEditor.AssetDataBase类获取各个资源的依赖项2.使用Unity自带的BuildPipeline进行构建AB包
。 BuildPipeLine.BuildAssetBundles(输出AB包路径)
。 File.WriteAllLines(将依赖项写入文件里)
1.表table就是一个对象,对象具有了标识self,状态等相关操作
2.使用参数sel债示方法的该接受者是对象本身,是面向对象的核心点,冒号操作符可以隐藏该self参数
3.类(Class): 每个对象都有一个原型,原型(lua类体系)可以组织多个对象间共享行为
4.setmetatable(A. index=B3) 把B设为A的原型
5.继承(Inheritance) : Lua中类也是对象,可以从其他类(对象)中获取方法和没有的字段6.继承特性: 可以重新定义 (修改实现) 在基类继承的任意方法
7.多重继承:一个函数unction用作 ndex元方法,实现多重继承,还需要对父类列表进行查找方法,但多继承复杂性,性能不如单继承,优化,将继承的方法赋值到子类当中
8.私有性《很少用)基本思想:两个表表示一个对象,第一个表保存对象的状态在方法的闭包中,第二个表用来保存对象的操作(或接),用来访问对象本身。使第一个表完成内容私有性。
均可以用来遍历集合,但是两者有区别。
异:对于有key的集合:
ipairs从第一个数字key开始,依次输出所有的key+1的键值,遇到字母下标并不会结束遍历,只是不输出而已,如果遇到nil则退出;
pairs无序输出字母类型key或者数字类型key的键值,遇到nil不输出,但不会停止遍历
渲染
简而言之,GPU的图形(处理) 流水线完成如下的工作: (并不一定是按照如下顺序)
顶点处理: 这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader (定点着色器)完成。
光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。
纹理帖图: 顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping) 工作完成对多变形表面的帖图,通俗的说,就是将多边形的表面贴上相应的图片,从而生成"真实”的图形。TMU (Texture mapping unit)即是用来完成此项工作。
像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像索的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader (像素着色器)完成。
最终输出: 由ROP (光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。
总结:GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管线中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有: 本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化
Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设
diffuse = Kd x colorLightx max(N*L,0); Kd 漫反射系数、colrLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘,如果结果小于等于0,则漫反射为0。
本影和半影:
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域) 工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
- ShaderLab语法
- MipMap是什么?作用?优缺点?
又乘 几何意义: 得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积。点乘 几何意义:可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影
1.点乘描述了两个向量的相似程度,结果越大两向量越相似,还可表示投影
2.又乘得到的向量垂直于原来的两个向量
3.标准化向量:用在只关系方向,不关心大小的时候
用于表示线性变换: 旋转、缩放、投影、平移、仿射
- 请问alpha test在何时使用? 能达到什么效果?
Alpha Test,中文就是透明度测试。
简而言之就是V&F shader中最后fragment函数输出的该点颜色值的apha值与固定值进行比较。Alpha Test语句通常于Pass{}中的起始位置。Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。
顶点着色器是一段执行在GPU上的程序,用来取代 fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。6像素着色器实际上就是对每一个像素进行光栅化的处理期间,在GPU上运算的一段程序不同与顶点着色器,像素着色器不会以软件的形式来模拟像素着色器。像素着色器实质上是取代了固定功能流水线中多重纹理的环节,而目赋予了我们访问单个像素以及访问每一个像素纹理坐标的能力
5.简述Lua实现面向对象的原理
1)表table就是一个对象,对象具有了标识self,状态等相关操作
2)使用参数self表示方法的该接受者是对象本身,是面向对象的核心点,冒号操作符可以隐藏该self参数
3)类(Class) : 每个对象都有一个原型,原型(lua类体系)可以组织多个对象间共享行为
4)setmetatable(A. index=B)) 把B设为A的原型
5)继承(Inheritance): Lua中类也是对象,可以从其他类 (对象) 中获取方法和没有的字段
6)继承特性: 可以重新定义 (修改实现)在基类继承的任意方法
7)多重继承:一个函数unction用作 ndex元方法,实现多重继承,还需要对父类列表进行查找方法,但多继承复杂性,性能不如单继承,优化,将继承的方法赋值到子类当中
8)私有性(很少用)基本思想:两个表表示一个对象,第一个表保存对象的状态在方法的闭包中,第二个表用来保存对象的操作(或接),用来访问对象本身。使第一个表完成内容私有性。
算法
数列1.1.2.3,5,8,13...第 n 位数是多少?用 C#递归算法实现
public static int Recursion(int n) {
if(n<=1)
{
return n;
}
return Recursion(n-1) + Recursion(n - 2);
}
冒泡排序
public static int[] Sort(int[] nums) {
int length = nums.Length;
for (int i = 0; i < length -1; i++)
{
for (int j = 0;j < length -1 - i; j++)
{
int a = nums[j];
int b = nums[j + 1];
if (a > b)
{
nums[j + 1] = a;
nums[j] = b;
}
}
}
return nums;
}
二分查找
public static int Search(int[] nums, int target)
{
int low = 0;
int high = nums.Length - 1;
while (low <= high) //只要范围没有缩小到只包含一个元素
{
int mid = (low + high)/2;//就检查中间的元素
int guess = nums[mid];
if (guess == target) //找到了元素
{
return mid;
}
else if (guess > target)//猜的数字大了
{
high = mid - 1;
}
else //猜的数字小了
{
low = mid + 1;
}
}
return -1;//没找到元素
}
二叉树
Leetcode:堆栈实现队列。
LeetCode:单链表,输出倒数第2个,奇数个节点输出数据,节点倒序?
单链表,求倒数第二个元素
自我介绍
自我介绍的可以看看这个:
Unity方面面试题 - 哔哩哔哩 (bilibili.com)
深入一些的面试题
[原创]Unity基础—面试经验分享 - 知乎 (zhihu.com)
一些公司的介绍
[万字干货]Unity游戏工程师求职面试指南!_问题 (sohu.com)
上面这个链接里说的资料是两年前的,时效性不是很强。
一些参考:
2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】_呆呆敲代码的小Y的博客-CSDN博客
【Unity面试】 2022年Unity面试题分享 | 全面总结 | 建议收藏_小听歌的博客-CSDN博客 |
|