算法

排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性
冒泡排序 O(n²) O(nlogn) O(n²) O(1) 稳定
简单选择 O(n²) O(n²) O(n²) O(1) 稳定
直接插入 O(n²) O(n) O(n²) O(1) 稳定
希尔排序 O(nlogn)~O(n²) O(n^1.3) O(n²) O(1) 不稳定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 不稳定
快速排序 O(nlogn) O(nlogn) O(n²) O(nlogn)~O(n) 不稳定

排序:冒泡排序、快速排序
字符串:KMP
二叉树:遍历(深度、广度)
递归:目录遍历,子物体查找,多维数组遍历
遍历(深度,广度)
数学题:斐波那契数列,杨辉三角,九皇后算法

设计模式

*MVC三层开发思想
MVVM:设计思想
*单例模式
工厂模式
观察者模式

面向对象

类和对象

方法

构造方法
虚方法和重写
重载
Lambda表达式
静态
保护类型(public、protected、private)

结构体

抽象类和接口

抽象方法

继承和复合

继承:is a
复合:has a

宏指令(比C++弱)

数据容器(数据组织结构,序列化,反序列)

XML(简化成JSON)
JSON(简化成ProtoBuffer)
ProtoBuffer

服务器通信

OSI七层模型

应用层(HTTP)
表示层
会话层
传输层(TCP,UDP)
网络层(IP)
数据链路层
物理层

TCP/IP五层模型的协议

应用层(HTTP)
传输层(TCP,UDP)
网络层(IP)
数据链路层
物理层

HTTP通信

连接一次后断开
Request- Request
基于TCP
URL地址(协议[http/https](不加密/加密),主机,端口,路径,文件,传参)
URL参数 参数1=参数1值&参数2=参数2值
状态号:200成功,302重定向,403找到了禁止访问,404找不到,500服务器内部错误(java把状态号屏蔽也出现这个)
头部信息:编码格式,cookie
Unity内部封装的HTTP请求类

TCP长连接通信

TCP连接(三次握手)与断开(四次挥手)
套接字
TCP连接与断开数发送和接收
端口绑定(服务器)

数据包处理

打包,解包
分包,粘包
心跳包

开发

消息号-回调函数
发送消息
接受消息

UDP通信

套接字
帧序
服务器帧定时器
数据同步到unity系统
防作弊

Unity

编辑器,Editor工具开发
基础API(GameObject,Transform,物理引擎)
场景搭建(地形编辑,NavMesh)
相机系统(参数设定,多相机叠加,渲染层,排序层)
声音系统(音频编辑系统,音频播放系统[2D,3D])
动画系统(Animator状态机,Animation动画片段,Avatar,融合树,IK,事件插入)
资源系统(IO操作(C#),Resources(打在包里),AssetBundle)
UI系统(UGUI(基础组件,复合组件),DOTween)
Eventsystem(2D给UI,3D给相机)
3D数学(向量和点,坐标系转换[世界坐标系和本地坐标系],欧拉角和四元数)

优化技巧

降低DrawCall

图集
少写pass通道
GPUInstancer

减少Update生命周期函数

计时器
多个脚本,注册给一个脚本,在一个脚本中调用其他脚本的Update

对象池

创建(单帧,跨帧)
回收

il2cpp的代码优化(C#转C++)

避免装箱拆箱(不用object)
避免使用foreach(遍历有垃圾碎片)尤其注意Update中编写foreach
减少在上线项目中,使用Debug(性能开销大)

静态配表

将不常变的数据,生成为数据(JSON,XML,ProtoBuffer)文件,可以减少服务器传递的数据量

减少CPU消耗

动画裁剪(动画在相机视椎体外不运行)

内存优化

(gpu参考博客 课程笔记完成)
飞出屏幕,不需要再次渲染的对象,记得销毁
(参考博客 AB包)
加载带有资源文件(精灵)的资源时,内存会上升,当带有资源的GameObject被销毁时,资源所占用的内存,不会被释放(懒释放-为了快),Resources.UnloadUnusedAssets()
对象存储在静态变量上,变量不会被垃圾回收机制影响,当不再使用时,需要赋值为null
继承自IDispose接口的对象,当不再使用时,需要调用dispose()函数
WWW( )
Stream处理 (流处理)
Using()
{
//自动执行dispose()函数 文件操作
}

Using用法例如

1
2
3
4
5
6
7
8
9
10
11
StreamReader sr = new StreamReader(“文件路径”);
string content = sr.ReadToEnd();
sr.close();
sr.Dispose();
//代码优化
using(streamReader sr = new StreamReader("文件路径"))
{
string content = sr.ReadToEnd();
sr.close();
//隐式调用sr的Dispose方法
}

异步实现

线程在Unity中是存在,注意不能在线程中操作Unity的对象树 (gameobject操作)

异步加载场景(代码是协同,底层是线程)
异步加载Resources(代码是协同,底层是线程)
异步加载AB包(代码是协同,底层是线程)
异步加载AB包中的资源(代码是协同,底层是线程)

HTTP请求(代码是协同,底层是线程)
TCP请求(代码是线程)

延迟实现

利用协同实现(yield return null),可以实现每一帧做一些事情

列表页元素过多时,如果在一帧中加载所有cell,则会卡顿,可以使用逐帧加载多个cell的方式,或通过滚动条的OnValueChange回调函数,执行多次加载

Lua

Lua的基础语法(表和面向对象)

.tolua独立开发与xlua腾讯
Lua和JavaScript很像(一切皆对象)

C#与xLua的互调

C#调xLua 为了执行一些生命周期函数
xLua调C# 为了实现一些API

热更新

Shader

矩阵运算,齐次矩阵,坐标系转换
渲染流水线
Cg语言
顶点、片元着色器
属性控制与数据传递
光照(兰伯特定律,高光)

着色方式

Phong着色,

高洛德着色

纹理渲染

主纹理,光照纹理

渲染指令

多pass通道,
渲染队列,深度测试,深度缓冲,颜色缓冲
反向裁剪
透明度测试
片元丢弃

版本控制

SVN:基于版本控制的集中式管理系统
学习:https://www.runoob.com/svn/svn-tutorial.html
软件:
Git:基于分支实现的版本控制软件
学习:www.liaoxuefeng.com/wiki/
软件:www.sourcetreeapp.com

VR

硬件搭建
Unity中整合SteamVR(OpenVR)
开发

动作设置

设置VR场景
接入设备(两个手柄,眼镜)

功能实现

人物瞬移
道具拾取
UI交互

知识点

物理引擎
场景搭建
Shader

AR

SDK添加
图片识别
平面感知

打包和SDK接入

NDK(Unity c#-c++) SDK(android) JDK(java)

打包

环境配置
参数设定
真机测试(LogViewer)
ADB观察打印(主要是安卓 ios 直接xcode)

SDK接入(c#和原生语言)

配置AS
根据文档,修改代码,生成AAR包
将aar包放入Plugins目录
C#调用unity写好的桥梁代码,进而调用java

Unity项目上传GitHub的注意点

Unity项目中必须上传的3个文件夹

  • Assets——关系到项目的资源
  • Packages——关系到导入的一些包
  • ProjectSettings——关系到你的项目设置
    Assets文件夹里的以meta为后缀的文件也要上传