|
前言
我们在游戏开发中,总会遇到一些问题。那么今天我们就一些常见的问题做出一下解答
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
1.unity+xlua,如何把全部游戏逻辑都放到lua层实现?
Unity+xLua能做到纯Lua开发游戏逻辑,主要在与提供了以下机制:
a: Unity提供了使用引擎的C#的各种接口和组件,同时我们也可以开发一些C#的组件,
而这块xLua提供了机制,LuaCallCSharp能让Lua直接调用到Unity引擎的C#组件与接口,同时能调用到自己开发的C#的组件与接口。而且Lua导出都是xLua自动完成的。只要点下xLua—>Generate Code 就可以自动导出给Lua调用非常方便。
b: xLua 提供了机制,能够在C#层回调Lua层函数,这样就可以把一些物理引擎碰撞检测等回调直接进入到Lua层,Lua层能拿到游戏引擎的事件。
c: 自己封装框架,把组件的开发系统Awake, Start, Update等放到Lua组件脚本里面,这样能让在Lua层具有C#层的开发习惯。一般这个部分我们是自己建立一个Lua组件类,其它的Lua组件都继承这个基类,Lua组件无法直接挂节点,所以,我们做一个管理模块,把GameObject与Lua组件1, Lua组件2, ..等管理起来,然后每次Update的时候,遍历每个GameObject,调用每个Lua组件的update,这样就模拟完成了Update机制,其它以此类推,我们就可以基于Lua组件化来做好开发。
d: Unity编辑器只要做好场景容器,做好资源就可以了,其它的都在Lua层来使用;
e: 如果有复杂的逻辑,对性能要求高得逻辑,可以放C#层,给Lua调用就可以了。
2.unity游戏中,在做性能优化时怎么准确判断是内存、cpu、gpu瓶颈呢?
Unity做性能调优的时候,我们看到一个游戏很卡,或者帧率很低,手机很烫, 如何判断是谁的瓶颈,我们一般会做如下的处理和分析,建议大家按照顺序来:
(1) 查看系统的进程管理器,看看游戏进程与线程的CPU占用率,以及是否有其它的CPU占用率很高的进程或线程。一般我们手机只跑游戏,就帧率很卡,未什么要看其它的呢?因为其它的进程和线程也会来抢占我们的硬件资源。比如当前系统的可用物理内存吃紧,然后有个内核线程不断的做内存到磁盘,磁盘到内存的内存页的数据交换,导致这个内核线程所占的CPU占用率很高,这样就影响了游戏的计算资源。先从OS层面整体分析是哪个app进程或线程等问题来做优化。
(2) 确定了是游戏进程占用的CPU,内存等比较高,没有其它的进程或线程的干扰了以后,接下来我们就来在游戏进程内部来进行分析是谁的问题。Unity游戏内部有两个线程,一个是main thread游戏主线程,也是我们代码逻辑运行的线程,还有一个是Renderer Thread, 渲染线程,主要是负责提交绘制渲染数据给GPU,然后GPU开机绘制。
不同的项目,不同的架构分析方式是不一样,没有办法统一的给一个标准,如果main thread花的时间比较多,比如每帧消耗100ms, FPS 为1000/100=10帧,那么这个时候瓶颈就是CPU处理不过来,要继续的追踪哪一块处理不过来,比如游戏逻辑,物理引擎等。如果GL Thread花的时间较多,导致帧率上不去,意味着我们CPU提交给GPU的渲染数据过多,渲染导致我们的帧率上不去,这种情况还可以通过构建等量的物体,直接来测试,排除其它逻辑进一步确认。
GPU的瓶颈,就要去看真实的GPU的处理结果,这个需要借助一些工具去查看,Unity有一些插件可以去看。
3.Unity开发怎么优化大量物体的物理碰撞而产生的FPS等参数急剧下降?
在不删除物理物体改变物理碰撞的前提下,没有太好的办法能优化。
可以考虑采用非物理引擎方案来解决。也可以通过调整物理引擎的参数,减少迭代的精度和次数,看是否有改善。
使用GPU的一些方式来对物理引擎做加速计算,这类目前还在研究中,不是很成熟,可以关注物理引擎PhyX,在做这块的研究。
4.unity3d手游项目的shader如何组织比较合理?
一般一个手游的unity3D项目先确认美术风格,根据美术风格,和产品要求来定制渲染管线,如果已有渲染管线满足要求,就直接使用如向前渲染管线,延时渲染管线,高清渲染管线,URP轻量级渲染管线等,如果不满足,就自定义渲染管线。渲染管线选好以后,就基于渲染管线的策略来开发shader,如果自带的shader满足要求,直接使用即可,如果不满足要求开发一些特定要求的shader比如轻量级渲染管线下的卡通shader。有些平台shader的效果会有差异,要提前做好验证,通过其它的方式抹平差异。如果是一些比较复杂的shader, 在一些低端机上面,可以换一组shader,或者通过开关来配置,让低端机用性能更好的shader,来牺牲部分效果。
附:学习视频地址 |
|