unity学习日记(1)

1、Object.Destroy对象后,该对象以及所有孩子节点都会被销毁,节点上带的组件也会被销毁,场景中不显示;其存在延迟时间,预计下一帧回收销毁,本帧对象还存在
    Object.DestroyImmediate是立刻回收
2、 gameObject.SetActive(true); 用来激活显示对象,此时对象在场景中
3、组件的enable 只是用来停用该组件逻辑,不会对(GameObject)的其他组件造成影响
4、组件的awake 只在创建时调用一次,不管脚本是否enabled;Start是在对象被第一次enable时调用;如果对象(GameObject)本身没激活,那么Awake,Start都不会调用。
5、gameObject.activeSelf判断自身是否激活,activeInHierarchy判断在场景中是否激活(父节点禁用也算不激活)
6、在组件内用 this == null 来判断是否对象已被销毁;
7、继承于MonoBehaviour的组件类在 Object.Destroy后不久就会销毁回收(OnDestroy);销毁后对象name被命名为"null"
    其他自定义类,则在失去引用后由C#的回收器固定时间销毁(析构函数),失去引用包括对象被销毁回收、赋值为null。
8、增加1W 次new GameObject 加1个组件的效率远高于一个GameObject 增加1W个组件,初始化时,前者约0.28s 后者约4.3s。 
    执行1W 次GameObject 自带updade约1.2ms,for循环执行1W次约0.45ms。所以大批量逻辑对象最好不要继承于MonoBehaviour,效率较低
9、gpuinstance 需要同个材质球,shader内可以自定义不同的参数,需使用UNITY_DEFINE_INSTANCED_PROP注册参数,不然不算;合批渲染也是有上限的。
    值得注意的时引擎自带的渲染排序,有时候会不是同个渲染顺序,造成不同材质球的渲染批次打断;
    3D的最好每个不同材质球设置一个不同的渲染序号RenderQueue,以保证不会因为同个批次排序问题造成不合批,但会失去深度排序渲染的效果;
    2d可以设置SortingLayer 与Order in Layer,一般设置Order in Layer来保证同个渲染批次只有一个材质球。
    如果调用了MeshRendered的material,会导致渲染批次打断,因为新生成的material与_sharedMaterial不一致。

10、使用AnimMapBaker烘焙骨骼动画时, 需制作成一个带Animator的模型预制体,也可使用旧版动画,2者只处理一个,最好拖动到场景中再拉到对象中进行烘焙,
    注意看下烘焙出来的图片是不是纯黑的,纯黑的说明烘焙失败了,这时候可以删掉已烘焙出来的图片再处理,已存在的纹理图片可能会写不入数据。
    会自动将Animator里所有状态的骨骼动画节点导出到一张图片中,可生成材质球,预制体,同个动画状态会只保留一份但状态参数还在。

11、MeshRendered的material的get方法里面,会判断_material跟_sharedMaterial是否相同,如果相同,返回_material,如果不同,会新建一个_sharedMaterial的拷贝,并赋值给_material和_sharedMaterial。
    可能会导致gpuinstance 合批失败,因为是不同的材质球


12、srp batcher 是使用了 常量缓冲区数据cbuffer定义结构体,用instanceID来区分;gpuinstance也是,只是会创建一个结构体数组,缓存不同的数据,通过instanceID计算当前数组偏移来获取值
    
13、动态设置MaterialPropertyBlock 不生效,可能因为Material频繁切换shader文件里存有残留数据,导致生成时数据混乱错误,也有可能设置的Material不对
14、修改的Lit.shader在手机上显示异常, 可能是因为 只修改了subshader里的 #pragma exclude_renderers gles gles3 glcore  #pragma target 4.5 类型下的pass处理,未修改target 2.0下的pass处理,
     一般手机平台使用的是target 2.0 也就是#pragma only_renderers gles gles3 glcore 模式下的pass,如果上面使用target 4.5的subshader里有一个全平台的pass会导致不执行target 2.0的
15、shader 深度,即距离摄像机的远近,越小越近;写入深度,即渲染时把该值记录在该坐标信息块上;然后进行深度测试,就是对比之前该点上记录的深度值,判断是否需要跳过颜色值渲染。
16、渲染队列值renderQueue越小越先渲染,同个渲染队列值,按透明层(2500是透明与不透明的分水岭),不透明的(2500以下)的,深度越小越先渲染,透明的深度越大越先,按照包围盒的中心点的深度进行排序

17、低版本android模拟器运行游戏会帧率卡住,打包时需勾选 Frame pacing
18、手游上限同屏20W面,一般指的是cpu数据准备传输带宽,通过GPU instance 或 SRPBahcer 只会传输一次mesh,变相提升了同屏面数
19、唯一mesh的值在运行时动态修改 会导致可能被保存, 可在编辑器模式下使用mesh实例
20、PS给的颜色值是gamma空间的,Unity默认颜色也是gamma的,当选择线性空间时,unity设置颜色值到shader 默认会转一次线性空间,所以在预览材质球里选择的颜色,用代码设置时,要手动转一次Color.gamma
21、向量点乘,两向量夹角为锐角时为正,钝角时为负,垂直时为0

22、  GPU shader优化if else  用step等判断代码来执行,因为GPU计算是把所有分支都计算完才选择结果分支执行,也就是多个分支代码都会被执行,还不如直接只有一个分支
23、shader hlsl常用优化接口  step(a,b) 当b>=a(a<b)返回1 其他为0,即可认为a大为0,b大或相等为1;smoothstep(min,max,x)  小于min返回0,大于max返回1,在区间内返回0~1之间的曲线值;clamp(x,a,b)返回x限定在 a~b之间的值;
    saturate(x) 如果x大于1返回1,其他返回0;sign(x);//x少于0返回-1.0 ,x等于0则返回0.0 ,x大于0则返回1.0

24 、shader 在手机平台上 ,优化不能用half类型去存 step(a,b)返回值*step(a,b)返回值  ,貌似出问题,要用float, step里的参数不能用 half,最好强转为float;不然导致手机上被裁切掉了
25、 AVProVideo插件的  mediaplayer组件里  android 的  Default_MinBufferTimeMs相关4个不能太低 暂时设置1000ms以上吧,不然个别机型(如:一加ACE  CPU天机8100的) 播放30S后会卡住。

26、项目文件夹名 后面加空格,  导致报 miscrosoft(R) Visual c# 库的错误,还会生成一个没用空间的项目文件夹
27、animator 的Cull Update Transforms模式 有个坑,如果你animator 底下的渲染元素全是隐藏的。那么他就不会正确执行动画,所以动画文件上不能全隐藏。不然只能换always 模式,或者留一个未隐藏的渲染节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值