找回密码
 立即注册
查看: 317|回复: 0

Unity3D游戏开发中一些常见的问题解答(三)

[复制链接]
发表于 2024-1-19 12:57 | 显示全部楼层 |阅读模式

前言

我们在游戏开发中,总会遇到一些问题。那么今天我们就一些常见的问题做出一下解答
对惹,这里有一个游戏开发交流小组,但愿大师可以点击进来一起交流一下开发经验呀!
1.怎么让代码的逻辑更清晰?
让项目的代码逻辑清晰,可以测验考试从一下几个点来注意:
(1) 清晰的目录布局: 目录布局很重要,什么样的目录放什么样的代码,目录的名字代表着逻辑组织。
(2) 清晰的启动流程与代码主干:代码逻辑一般都是流程性很强,所以清晰的启动流程和代码主干是代码逻辑清晰很重要的一个点。一个项目,如果启动流程主干很清晰,要看懂他的代码逻辑就变得非常的容易。
(3) 功能函数与流程逻辑分隔:这一点也是很重要的,法式往往是复杂的逻辑+功能的代码的组合,我们把功能实现成一个一个的函数,用函数名暗示好这个功能,然后流程来组合功能,这样泛泛维护的时候,只要看流程,把功能当作黑盒看,新人上手可以指看流程,把很多算法都当作了黑盒,这样,心里承担要更小。
(4) 规范的代码定名,是逻辑清晰的此外一个关键。
(5) 分层设计: 把机制放底层,设计到策略的,往上一层来进行区分,分层布局。
还有很多的一些细节,我个人感觉最有辅佐的就这些了。但愿大师早日写出好的代码
2.unity中,shader,材质,和衬着管线有什么区别?
衬着管线: 包含了游戏引擎给GPU传递数据的策略, 游戏引擎在措置光源光照,暗影等策略,并调用shader中的pass来控制衬着。衬着管线基于游戏引擎来定制衬着策略,比如默认的向前衬着管线,为了撑持任意多的光源,每个重要光源的光照计算,走要走一次shader的pass, 所以多光源实时光照情况下这个策略很消耗性能,于是有了轻量级衬着管线,多个光源,再一次pass里面完成计算,但是这种错误谬误就不能撑持任意的光源。还有暗影策略等。衬着管线还制定了CPU会在衬着的时候传递哪些数据给GPU,这些数据分袂放在哪里,比如摄像机的位置,比如暗影贴图等。这些都属于衬着管线的内容。
Shader: 是给GPU执行的代码法式,在衬着管线的大体策略下,负责具体的衬着效果的算法。分歧的衬着管线,shader编写的格式是纷歧样的。向前衬着管线的shader不能直接用到轻量级衬着管线中去。
材质: 是一个配置文件,选一个shader, 并设置好shader所需要的参数,通过CPU传递给GPU。
3.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有一些插件可以去看。.
4.基于 Unity 中的 UGUI 或者 NGUI 插件,如何设计尽可能通用的 UI 框架?
这个问题考虑有点过度了, UGUI, NGUI本省作为UI框架,已经非常好了,解决了UI常用的问题,一般我们项目基于UGUI, NGUI来做UI框架主要解决几个问题,但是无所谓通用,还是和项目由关系:
(1) 解决3D角色的UI血条+昵称等问题;
(2) 解决便利的改削界面上的UI元素的内容问题,比如便利的能把游戏成果更新到UI的Label上;
(3) 解决方案绑定UI组件中的一些响应函数,比如按钮的响应函数;
(4) 解决游戏开发中一些系统弹窗打点的问题。
其实没有必要考虑太多,结合项目,结合上面的几个点,做出简单好用的东西即可。
可以参考一个博主的讲解,打造基于MVC的UI框架。
5.Unity-Shader和OpenGL-Shader有什么分歧之处?
Unity Shader 结合了Unity的衬着管线的策略,基于OpenGL的shader封装了一层。
有一些CPU传递给GPU的数据这些法则策略等,比如暗影贴图,当前的光源等,Unity Shader都进行了封装,如果只是基于OpenGL来做,很多东西都要本身从头做过。
附:学习视频地址

本帖子中包含更多资源

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

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-29 10:17 , Processed in 0.274998 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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