找回密码
 立即注册
查看: 298|回复: 2

Unity 面试知识整理(整理中。。)

[复制链接]
发表于 2023-3-30 09:37 | 显示全部楼层 |阅读模式
C#基础


  • 堆和栈的区别?
栈:全称是线程堆栈,英文 Stack
堆:全称是托管堆,英文Heap
解释1
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
栈由系统分配内存大小
堆由程序员自己申请
解释2
存放在栈中时要管存储顺序,保持着先进后出的原则,它是一片连续的内存域,由系统自动分配和维护。
而堆是无序的,它是一片不连续的内存域由有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
1,申请方式
heap(堆):程序员自己申请,并指明大小。
stack(栈):由系统分配。
2,申请效率
heap(堆):由new分配的内存,相对效率和速度都较低,且容易产生碎片,但由于是程序员自己申请操作,灵活性强,使用方便。
stack(栈):效率较高,速度较快,但程序员无法对其进行控制。
3,存储的数据类型
heap(堆):存储引用类型。比如:类、接口、数组等。
stack(栈):存储值类型,即存储固定长度的数据。比如:整数、字符、结构、布尔、枚举等。每个程序在执行时都有自己的堆栈,其他程序不能访问该堆栈。
原文链接:c#堆和栈的区别_c# 堆和栈的区别和联系_KindSuper_liu的博客-CSDN博客

  • GC的机制?
参考:C# GC与内存管理 - 简书 (jianshu.io)
Unity基础


  • 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?
LightMap:就是指在三维软件里实现打好光,然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上,这样就使物体有了光照的感觉。

  • Unity中,照相机的Clipping Planes的作用是什么?调整 Near、Far两个值时,应该注意什么?
剪裁平面 。从相机到开始渲染和停止渲染之间的 距离。

  • 将Camera组件的ClearFlags选项选成Depth only是什么意思? 有何用处?
仅深度,该模式用于对象不被裁剪。


  • 在编辑场景时将GameObject设置为Static有何作用?
设置游戏对象为Static将会剔除(或禁用)网格对象当这些部分被静态物体挡住而不可见时。因此,在你的场景中的所有不会动的物体都应该标记为Static。

  • 有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染?
把A组物体的渲染队列大于B物体的渲染队列

  • 判断2个平面是否相交
对于两个平面Ax+By+Cz+D=0与ax+by+cz+d=0,只要(A,B,C)与(a,b,c)不成比例,这两个平面就是相交的。

  • Unity Asset、AssetBundle等资源的详解:
Unity 资源管理 AssetBundle使用详解 - 知乎 (zhihu.com)
Unity面试问题学习笔记(6)——AB包资源管理器 - 知乎 (zhihu.com)
Unity面试题学习笔记(4)——AB包资源加载 - 知乎 (zhihu.com)


  • 碰撞器和触发器的区别是什么?
碰撞器和触发器的区别是什么?_游戏开发_收获啦 (shouhuola.com)
Unity 碰撞检测中碰撞器与触发器的区别 (shuzhiduo.com)


  • Material和SharedMaterial的区别
sharedMaterial和material的区别_material和sharedmaterial的区别_僵师先森的博客-CSDN博客

  • SkinnedMesh原理
人物骨骼蒙皮动画系列4:FK模式的Skinned Mesh 骨骼蒙皮动画 - 知乎 (zhihu.com)
Skinned Mesh原理解析和一个最简单的实现示例_n5的博客-CSDN博客
向量

Unity面试题学习笔记(14)——U3D数学向量篇 - 知乎 (zhihu.com)
SDK

Unity和Android交互(持续更新) - 哔哩哔哩 (bilibili.com)
Unity打包Android最全攻略(含完整流程及常见问题) - 知乎 (zhihu.com)
NGUI

NGUI和UGUI对比及性能提升技巧 - 简书 (jianshu.com)
UGUI


  • 请简述如何在不同分辨率下保持UI的一致性
多屏幕分辨率下的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开发


  • UGUI 合批的一些问题
简单来说在一个Canvas下,需要相同的material,相同的纹理以及相同的Z值,例如UI上的字体Texture使用的是字体的图集,往往和我们自己的UI图集不一样,因此无法合批。还有UI的动态更新会影响网格的重绘,因此需要动静分离。

  • Image和Rawlmage的区别
。Imgae比Rawlmage更消耗性能,image是可以可以合批,RawImage是单张一个dc
。Image只能使用Sprite属性的图片,但是Rawlmage什么样的都可以使用
。Image适合放一些有操作的图片,裁剪平铺旋转什么的,针对Image Type属性
。Rawlmage就放单独展示的图片就可以,性能会比Image好很多
UGUI内核大探究(九)Image与RawImage_凯奥斯的博客-CSDN博客
优化

  • 简述一下对象池,你觉得在FPS里哪些东西适合使用对象池?
对象池就存放需要被反复调用资源的一个空间比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。特点: 用内存换取cpu的优化


  • LOD是什么,优缺点?
细节级别 (LOD) - Unity 手册 (unity3d.com)
Unity【LOD Group】- 关于性能优化中LOD的使用与总结_lodgroup_CoderZ1010的博客-CSDN博客
大量的模型文件不但会增加包体的大小,而且在运行时会大量增加内存消耗,因此对于LOD有一句空间换取时间的评价,当然最终是否采用LOD技术要根据具体情况而定,性能优化无非是CPU、GPU与内存之间的取舍。

  • 什么叫动态合批? 跟静态合批有什么区别?
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要你进行额外的操作
区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。静态批处理:自由度很高,限制很少缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。


  • 什么是DrawCall? DrawCall高了又什么影响? 如何降低DrawCall?
Unity中,每次擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。降低DrawCal的方法Dynamic Batching 、Static Batching
高级特性Shader降级为统一的低级特性的Shader。


  • C#堆内存优化
C#代码优化:斩断伸向堆内存的“黑手” (weibo.com)
Unity堆内存优化 - 桫椤 - 博客园 (cnblogs.com)
Unity内存/GC优化方法_unity gc优化_永恒星的博客-CSDN博客

  • shader 预热
Unity Shader 变体处理与预加载流程_unity加载shader_真像大白阿的博客-CSDN博客
Shader.WarmupAllShaders();编译问题 -- UWA问答 | 游戏开发者互动问答社区 | 侑虎科技 (uwa4d.com)
Unity - Manual: Shader variant collections (unity3d.com)
热更新

Unity热更新机制_unity 热更新_OntheSnow的博客-CSDN博客

  • 资源如何打包?依赖项列表如何生成?
1.查找指定文件夹ABResource里的资源文件
。 Directory.GetFile(资源路径
。新建AssetBundleBuild对象
获取资源名称,并赋值对应AB名称0
。获取各个资源的依赖项: 通过UnityEditor.AssetDataBase类获取各个资源的依赖项2.使用Unity自带的BuildPipeline进行构建AB包
。 BuildPipeLine.BuildAssetBundles(输出AB包路径)
。 File.WriteAllLines(将依赖项写入文件里)

UI框架

Unity手游实战:从0开始SLG——UI框架篇(一)各种UI框架模型简介(试读篇) - 知乎 (zhihu.com)
unity 前端场景搭建UI框架的设计_unity 触摸屏框架_轻澜-诀袂的博客-CSDN博客
Lua


  • Lua如何调用C#
原生实现C#与Lua相互调用方法(Unity3D可用) - 技术经验 - W3xue
[转]Unity之Luaframework框架lua调用C#方法_小小姑娘很大的博客-CSDN博客
【ToLua】C#和Lua的交互细节 - 知乎 (zhihu.com)


  • 简述Lua实现面向对象的原理
1.表table就是一个对象,对象具有了标识self,状态等相关操作
2.使用参数self表示方法的该接受者是对象本身,是面向对象的核心点,冒号操作符可以隐藏该self参数
3.类(Class): 每个对象都有一个原型,原型(lua类体系)可以组织多个对象间共享行为
4.setmetatable(A. index=B3) 把B设为A的原型
5.继承(Inheritance) : Lua中类也是对象,可以从其他类(对象)中获取方法和没有的字段
6.继承特性: 可以重新定义 (修改实现) 在基类继承的任意方法
7.多重继承:一个函数function用作 Index元方法,实现多重继承,还需要对父类列表进行查找方法,但多继承复杂性,性能不如单继承,优化,将继承的方法赋值到子类当中
8.私有性(很少用)基本思想:两个表表示一个对象,第一个表保存对象的状态在方法的闭包中,第二个表用来保存对象的操作(或接),用来访问对象本身。使第一个表完成内容私有性。
Lua 面向对象 | 菜鸟教程 (runoob.com)


  • Lua中pairs 和 ipairs区别是什么?
均可以用来遍历集合,但是两者有区别。
异:对于有key的集合:
ipairs从第一个数字key开始,依次输出所有的key+1的键值,遇到字母下标并不会结束遍历,只是不输出而已,如果遇到nil则退出;
pairs无序输出字母类型key或者数字类型key的键值,遇到nil不输出,但不会停止遍历
渲染


  • GPU的工作原理?
简而言之,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图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。


  • 什么是渲染管线?
是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管线中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
主要步骤有: 本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化
计算机图形学笔记(一)渲染管线概述_少侠只用刀的博客-CSDN博客

  • alpha blend工作原理?
Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设


  • 写出光照计算中的diffuse的计算公式?
diffuse = Kd x colorLightx max(N*L,0); Kd 漫反射系数、colrLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘,如果结果小于等于0,则漫反射为0。


  • 两种阴影判断的方法、工作原理?
本影和半影:
本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域) 工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)


  • Vertex Shader是什么,怎么计算?
顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。


  • ShaderLab语法
  • MipMap是什么?作用?优缺点?
Mipmap详解(有无Mipmap区别、原理、优点、缺点、优化)_爱吃的板栗.的博客-CSDN博客

  • 向量的点乘、又乘以及归一化的意义?
又乘 几何意义: 得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积。点乘 几何意义:可以用来表征或计算两个向量之间的夹角,以及在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上运算的一段程序不同与顶点着色器,像素着色器不会以软件的形式来模拟像素着色器。像素着色器实质上是取代了固定功能流水线中多重纹理的环节,而目赋予了我们访问单个像素以及访问每一个像素纹理坐标的能力

  • 软光栅可以看看这个人的一些文章:
从零开始的软渲染器(1) - Hello,三角形 - 知乎 (zhihu.com)
从零开始的软渲染器(2)- 旋转木箱 - 知乎 (zhihu.com)
从零开始的软渲染器(2.5)- 再谈裁剪与剔除 - 知乎 (zhihu.com)
从零开始的软渲染器(3)- 摄像机与模型 - 知乎 (zhihu.com)
从零开始的软渲染器(完)- 光照 - 知乎 (zhihu.com)
这是那个人的专栏,里面还有一些其他不错的图形学知识:
猫游记 - 知乎 (zhihu.com)

  • Games101 回顾:
一篇搞定!GAMES101现代计算机图形学入门(全) - 知乎 (zhihu.com)
算法

堆排序时间复杂度_堆排序算法_weixin_39844942的博客-CSDN博客
数列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个,奇数个节点输出数据,节点倒序?
单链表,求倒数第二个元素

互联网公司最常见的面试算法题有哪些? - 力扣(LeetCode)的回答 - 知乎
设计模式

免费在线学习代码重构和设计模式 (refactoringguru.cn)
简单理解-Head First 设计模式_Swuagg的博客-CSDN博客
图片摘自上文


自我介绍

自我介绍的可以看看这个:
Unity方面面试题 - 哔哩哔哩 (bilibili.com)

深入一些的面试题

[原创]Unity基础—面试经验分享 - 知乎 (zhihu.com)

Q:C# GC原理
C#——垃圾回收(GC)_c# gc_面向大象编程的博客-CSDN博客
Q:Unity 使用的渐进式GC原理
Unity内存 - 简书 (jianshu.com)
Unity内存详解 - 爱码网 (likecs.com)
.目前Unity的重点转向了il2cpp,采用了Incremental GC(渐进式GC),解决主线程卡顿问题,原理是分帧进行,将一次卡顿峰值平摊到多帧里面,平摊卡顿时间
Q: Lua GC 的垃圾回收机制?
答:lua使用的是经典的标记清扫算法;Lua所有类型的对象都统一为Tvalue;所有动态分配的对象串连成一个链表(或多个);Lua里的注册表,主线程等,这些根集对象再去引用其他对象,由此展开成对象的关系结构
Lua的垃圾回收周期共分为四个阶段:标记、整理、清扫、收尾 标记阶段:Lua会首先将根集合中的对象标记为活跃,然后将可以通过根节点访问到的对象也标记为活跃 整理阶段:Lua会遍历所有的userdata,找出未被标记且有__gc元方法的userdata,将它们标记为活跃,并放入单独的列表中。再根据所有的弱引用table,删除那些未被标记为活跃的key或者value 清扫阶段:Lua遍历所有对象,如果当前对象未被标记,就收集它,否则清除它的标记 收尾阶段:根据上面生成的userdata列表来调用终结函数(类似C#的析构函数)

LuaGC_lua gc_山木风的博客-CSDN博客
Lua 垃圾回收 | 菜鸟教程 (runoob.com)

Q:Lua与C#如果实现相互调用
C#与Lua进行交互主要通过虚拟栈实现,栈的索引分为正数与负数,若果索引为正数,则1表示栈底,若果索引为负数,则-1表示栈顶
因为C#不可以热更新,(lua可以当作文本资源,然后运行时才编译);
一些比较特殊的关键逻辑代码可以复用,比如 属性计算,战斗系统等与纯逻辑算法,能最大程序做到客户端服务端同步
1. 到现在为止,可以知道整个c#函数在导出过程中的操作,在启动时候如何通过程序集和反射来实现动态的加载,最后Lua的虚拟机中都会注册前面导出的类文件的相关函数和属性。lua文件在执行的时候,是会编译成字节码在lua的虚拟机中执行的,这样lua的字节码和c#的导出文件,都在同一个环境中执行,调用pcall就可以相互的执行和调用了
2. 如果C#要调用Lua中的函数,则

  • 首先要在Lua虚拟机中加载该函数(LuaState.DoFile)
  • 拿到目标函数(LuaState.GetFunction)
  • 执行目标函数(LuaFunction.Call)

Q:lua表内存优化?
分表,考虑把一些较长重复出现的数据,替换为变量
配置表:
Lua性能优化—Lua内存优化_UWA的博客-CSDN博客
Lua性能优化(二):CPU性能优化 - 知乎 (zhihu.com)
Lua配置表存储优化方案 - UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 (uwa4d.com)
Q:Lua 怎么用Profiler?
如何使用Profiler测试Lua代码? - 普通熊猫的回答 - 知乎
如何使用Profiler测试Lua代码? - 低级工程师的回答 - 知乎
还有一些第三方插件
Q:Lua内存优化
lua内存管理及优化方式_lua内存优化_一棵橙子树的博客-CSDN博客
Q:Lua 和C# 共同持有对象的释放问题
Lua与Unity的内存优化技术_lua c# 内存泄露_海洋_的博客-CSDN博客
Lua和C#交互开销探究_lua c# 内存泄露_Don里个冬的博客-CSDN博客
Unity中Lua造成的堆内存泄露问题 (taodudu.cc)
Q:Lua中的 light Userdata
对Lua中Userdata的理解_lua userdata_阿成_的博客-CSDN博客
Q:Assetbundle框架
AssetBundle的原理及最佳实践 - 知乎 (zhihu.com)
Q:PNG 和ASTC区别?
[图形学]ASTC纹理压缩格式-CSDN博客
游戏开发中,常见的贴图压缩方式_pvrtc_流浪打工人的博客-CSDN博客
Q:ASTC和PVRTC区别?
ASTC纹理压缩格式详解 - 知乎 (zhihu.com)
Q:LZ4和LZMA区别?
AssetBundle压缩与解压方式是什么 - 大数据 - 亿速云 (yisu.com)
LZ4&Lzma
LZ4是一种trunk-base的压缩技术,速度几乎是Lzma的10倍,但是压缩的体积会高出30%,trunk-base的压缩方式,在解压时可以减少内存占用,因为不需要解压整个文件,解压每个trunk的时候,可以复用buffer(在中国增强版中会推出一个基于LZ4的AssetBundle加密功能)
Q:UGUI底层重建原理?
UGUI性能优化学习笔记(一)网格重建_ugui重建_夜槿笙歌的博客-CSDN博客
Q:如何性能分级?
特效、分辨率,同屏人数,shader lod分级,阴影
低端 阴影片;中端主角ShaderMap+其他角色阴影片;高端ShaderMap实时阴影
Q:做过哪些深入的优化的事情?

Q:怎么显示更多的小兵,使得低端机达到它的极限?
考虑更激进的lod分级显示,降低逻辑更新频率,场景、特效进一步压低
Q:GPU instancing GPU skinning
GPU Skinning 加速骨骼动画 - UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 (uwa4d.com)
GPU Instancing 深入浅出-基础篇(1) - 知乎 (zhihu.com)
基于GPU Skin的骨骼动画Instance的实现_unity gpuinstance_leonwei的博客-CSDN博客
Q:IOS 低内存 闪退
使用 Application.lowMemory接口(安卓和IOS都支持)在低内存时候进行释放,IOS不采用静态合批
Q:导入器
内置导入器 - Unity 手册 (unity3d.com)
资源审核 - Unity 手册 (unity3d.com)
UnityEditor.AssetPostprocessor - Unity 脚本 API (unity3d.com)
Unity+模型/动画的优化方案 - 知乎 (zhihu.com)

项目中的使用:
有一个基础导入器 XXBaseImporter
XXTextureImporter、XXSpeedTreeImporter、XXModelImporter、XXFileImporter、XXAnimationImporter继承于XXBaseImporter
XXBaseImporter--》 OnPreImportAsset、OnPostImportAsset
XXCoreImporter 类才是继承Unity默认的 AssetPostprocessor ,这里调用各类文件处理

XXTextureImporter--> OnPreImportAsset
1.根据文件夹和文件名后缀,判断是否需要处理
2.名字中有特殊字符的,根据文件名后缀,修改贴图textureType, sRGBTexture, alphaSource ,filterMode, wrapMode
3.根据路径获取图片类型,三大类:Default、NormalMap、Sprite,设置图片类型
4.修改读写设置、mipmap设置
5.设置贴图尺寸
        //展示角色高模贴图 2048  低模1024
        //敌兵Boss 2048   敌方小兵 1024
        //地形等贴图最大上限1024
        //特效贴图256限制  动画序列帧512
6.设置图片压缩格式

XXModelImporter-->OnPreImportAsset\OnPostImportAsset
OnPreImportAsset
1.根据文件夹和文件名后缀,判断是否需要处理
2.修改基本设置(压缩设置、读写设置、导入切线、法线的设置等等)
3.修改一些动画的设置

Q.UI 和特效穿插、特效裁剪如何实现的
Unity___粒子特效与UI的排序 - lxp_blog - 博客园 (cnblogs.com)
雨松使用了shader去裁剪特效,把UI需要的区域传给shader,超出范围的设定为透明的
一些公司的介绍

[万字干货]Unity游戏工程师求职面试指南!_问题 (sohu.com)
上面这个链接里说的资料是两年前的,时效性不是很强。
一些参考:
2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】_呆呆敲代码的小Y的博客-CSDN博客
【Unity面试】 2022年Unity面试题分享 | 全面总结 | 建议收藏_小听歌的博客-CSDN博客

一些项目优化总结

如何分析瓶颈?
通过Profiler、UWA看CPU和GPU的耗时,做不同开关的对比,比如关掉战斗逻辑,隐藏场景去对比帧率的变化。

首先是资源,建立导入器限制格式,定期排查不合理资源和冗余资源。粒子分级策略
瓶颈主要在CPU,
比如UI,做了3D冒血字和3D血条,这是为了避免UGUI的频繁的触发UI合批
动画采用GPU Skinning:使用GPUSkinning后性能为啥没明显提升? -- UWA问答
缓存池
Lua战斗逻辑优化,比如减少穿透,数据打包再传递;降低不重要的小兵的逻辑更新频率
GPU 做了一些  不同玩法高低模型切换、减面、Mipmap 、Lod,降分辨率 中低1280*720,高1920*1080
帧率较差时,自动根据帧率降档
因为静态合批的包体较大,项目中采用了使用代码进行合批
StaticBatchingUtility
UnityEngine.StaticBatchingUtility - Unity 脚本 API (unity3d.com)
解决Batching Static静态合并网格的容量问题_unity mesh 定点上限_阿赵3D的博客-CSDN博客
【Unity游戏开发】合批优化汇总 - 知乎 (zhihu.com)
几种合批方式
acnestis:Unity渲染优化的4种批处理:静态批处理,动态批处理,SRP Batcher 与 GPU Instancing

主将 (展示用)高模 8W面 (战斗用)低模 1.6W- 1.8W面
小兵 2k面
场景 33W面

GPU 评分:Mobile GPU Rankings 2021 (Adreno/Mali/PowerVR) - Tech Centurion
高中低机型是什么?
机型GPU评分
高端机型  Xiaomi Mi 10Adreno(TM) 650122.3
中端机 华为畅享20 ProMail-G57105
低端机  Xiaomi MI 6XAdreno(TM) 51279


  • 自定义事件系统
Unity UGUI优化:解决EventSystem耗时过长的问题 第一部分_魔术师Dix的博客-CSDN博客


  • UI 是否采用了异步加载?
没有,同步加载,做了缓存机制,之后获取从缓存中取。

本帖子中包含更多资源

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

×
发表于 2023-3-30 09:37 | 显示全部楼层
好东西!!赞
发表于 2023-3-30 09:40 | 显示全部楼层
谢谢,也是整理的别人的资料
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 21:39 , Processed in 0.107557 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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