1.红点系统设计
参考:lua使用前缀树实现红点系统
2.快速排序
参考:快速排序详解
3.点乘,叉乘,投影的数学意义以及几何意义
点乘
数学意义:
向量点乘结果是标量,是两个向量在一个方向的累计结果,结果只保留大小属性,抹去方向属性,就相等于降维;
点乘运算:
#####几何意义
点积是两个向量的长度与它们夹角余弦的积。点乘的结果表示向量A在向量B方向上的投影与向量B模的的乘积,点乘的意义就是两个向量在一个向量方向的共同积累的结果,但是这种结果只保留的大小属性,抹去了方向这个属性;同时反映了两个向量在方向上的相似度,结果越大越相似。基于结果可以判断这两个向量是否是同一方向,是否正交垂直,具体对应关系为:
1.结果>0:夹角在0°到90°之间,则方向基本相同,
2.结果=0:相互垂直,正交,
3.结果<0:夹角在90°到180°之间,方向基本相反
叉乘
数学意义:
向量叉乘,是这这两个向量平面上,垂直生成新的向量,大小是两个向量构成四边形的面积。相等于生维。
参考:向量点乘与叉乘的概念及几何意义
4.拼ui如何减少DC(DrawCall)
1.合理的分配图集,合理的分配图集可以降低drawcall和资源加载速度
具体细节如下:
同一个UI界面的图片尽可能放到一个图集中,这样可以尽可能的降低drawcall。
1.共用的图片放到一个或几共享的图集中,例如通用的弹框和按钮等;
2.相同功能的图片放到一个图集中,例如装备图标和英雄头像等;这样可以降低切换界面的加载速度。
3.不同格式的图片分别放到不同的图集中,例如透明(带Alpha)和不透明〈不带Alpha)的图片,这样可以减少图片的存储空间和占用内存。(UGUI的sprite packer会自动处理这种情况)
合理的资源目录
resources目录中应该只保存prefab文件,其它非prefab文件(例如动画,贴图,材质等)应放到resource目录之外;因为随着项目的迭代,可能会导致部分资源(动画,贴图)等失效,如果这些文件放在resource目录下,在打包时,unity会将resource目录下文本全部打成一个大的AssetBundle包(非resouce目录下的文件只有在引用到时才会被打到包里),从而出现冗余,增加不必要的存储空间和内存占用。
基于以上UGUI的网格更新原理,我们可以做以下优化:
1.使用尽可能少的U元素;在制作U时,一定要仔细查检U层级,删除不不必要的U元素,这样可以减少深度排序的时间以及Rebuild的时间 。
2.减少Rebuild的频率,将动态UI元素(频繁改变例如顶点、alpha、坐标和大小等的元素)与静态U元素分离出来,放到特定的Canvas中。
3.减少重建的频率,将动态UI元素(频繁改变例如顶点、alpha、坐标和大小等的元素)与静态U元素分离出来,放到特定的Canvas中。
4.谨慎使用UI元素的enable与disable,因为它们会触发耗时较高的rebuild,替代方案之一是enable和disableUl元素的canvasrender或者Canvas。
5.谨慎使用Text的Best Fit选项,虽然这个选项可以动态的调整字体大小以适应UI布局而不会超框,但其代价是很高的,Unity会为用到的该元素所用到的所有字号生成图元保存在atlas里,不但增加额外的生成时间,还会使得字体对应的atlas变大。
6.谨慎使用Canvas的Pixel Perfect选项,该选项会使得ui元素在发生位置变化时,造成layout Rebuild。(比如ScrollRect滚动时,如果开启了Canvas的pixel Perfect,会使得Canvas.SendWillRenderCanvas消耗较高)
7.使用缓存池来保存ScrollView中的ltem,对于移出或移进View外的的元素,不要调用disable或enable,而是把它们放到缓存池里或从缓存池中取出复用。
8.除了rebuild过程之外,UGUI的touch处理消耗也可能会成为性能热点。因为UGUI在默认情况下会对所有可见的Graphic组件调用raycast。对于不需要接收touch事件的grahic,一定要禁用raycast。对于unity5以上的可以关闭graphic的Raycast Target。而对于unity4.6,可以给不需要接收touch的UI元素加上canvasgroup组件。
5. lua为什么能热更
热更新问题的本质是代码更新而不是资源更新。
LUA是解释型语言,并不需要事先编译成块,而是运行时动态解释执行的。
C#为什么不能热更新?准确的说,C#在安卓上可以实现热更新,但在苹果上却不能。在安卓上可以通过C#的语言特性-反射机制实现动态代码加载从而实现热更新。具体做法是:将需要频繁更改的逻辑部分独立出来做成DLL,在主模块调用这些DLL,主模块代码是不修改的,只有作为业务(逻辑)模块的DLL部分需要修改。游戏运行时通过反射机制加载这些DLL就实现了热更新。
6 堆,栈的理解,我们写的代码是堆还是栈
堆
堆(Heap):是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。
堆的相关特性:
1,堆是由操作系统管理的一片空间,事先是没有在进程空间里分配的(比如你在没有分配堆的时候就访问堆空间会报一个内存访问错误),一般是由程序动态的分配出来,一旦分配了以后,一般需要程序去释放自己的堆空间.
2,堆的空间较大,但访问速度没有栈快
3,堆受垃圾处理器GC管理(GC会去找那些很久没有引用地址指向的内存块,把它们清理掉)
栈
栈(Stack):是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域。
栈的相关特性:
1,栈上是向下填充的,数据只能从栈的顶端插入和删除(先进后出原则)。把数据放入栈顶称为入栈(push),从栈顶删除数据称为出栈(pop)。
2,栈的空间较小,但访问速度快。
3,栈的生长方向是有高地址向低地址生长的。
4,栈的清理是由系统自动完成的。
分配
值类型的实例通常是在线程栈上分配的(静态分配)。
引用类型声明时并没有为其分配堆上的内存空间。引用类型的对象总是在进程堆中分配(动态分配)。
值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct
引用类型:string 和 class
7.lua如何实现继承
function base:New()
local obj = {}
setmetatable(obj, self)
self.__index = self
return obj
end
继承使用:
local test = base:new()
8.3d游戏的攻击范围计算
Unity3D实现攻击范围检测Unity3D-游戏中的技能碰撞检测
9.tcp