Unity FPSSample Demo如何深入研究和优化策略?

摘要:1.前言 Unity FpsSample Demo大约是2018发布,用于官方演示新的网络传输层(UnityTransport)+DOTS的一个FPS多人对战Demo。 Demo下载地址(需要安装Git LFS) :htt
1.前言 Unity FpsSample Demo大约是2018发布,用于官方演示新的网络传输层(UnityTransport)+DOTS的一个FPS多人对战Demo。 Demo下载地址(需要安装Git LFS) :https://github.com/Unity-Technologies/FPSSample 下载完成后3-40GB左右,下载后请检查文件大小是否正确。 时间原因写的并不完整,但大致描绘了项目的框架轮廓。 1.1.附带文档与主配置界面 在项目根目录可以找到附带的文档: 在项目中的Fps Sample/Windows/Project Tools处可以打开主配置界面: 其中打包AssetBundle的方式值得一提,因为在资源底部标记AssetBundle非常的不方便, FpsSample将需要被打进AssetBunlde的文件通过Hash值存到了ScriptableObject里, 这样可以自动收集,不必手动一个个文件去标记。 并且AssetBundle区分了Server/Client, 服务端打包AssetBundle时将用一些资源及耗费性能较少的替代版本 而客户端打包的AssetBundle则是完整版本。 2.GameLoop 可参考文档SourceCode.md,不同的GameLoop决定当前游戏下的主循环逻辑: 游戏内的几种GameLoop分别对应如下: ClientGameLoop 客户端游戏循环 ServerGameLoop 服务端游戏循环 PreviewGameLoop 编辑器下执行关卡测试时对应的游戏循环(单机跑图模式) ThinClientGameLoop 调试用的轻量版客户端游戏循环,内部几乎没有System 2.1 GameLoop触发逻辑 游戏的入口是Game.prefab: IGameLoop接口定义在Game.cs中: public interface IGameLoop { bool Init(string[] args); void Shutdown(); void Update(); void FixedUpdate(); void LateUpdate(); } 然后通过命令初始化所需要的GameLoop,内部会通过反射创建(Game.cs中): void CmdServe(string[] args) { RequestGameLoop(typeof(ServerGameLoop), args); Console.s_PendingCommandsWaitForFrames = 1; } IGameLoop gameLoop = (IGameLoop)System.Activator.CreateInstance(m_RequestedGameLoopTypes[i]); initSucceeded = gameLoop.Init(m_RequestedGameLoopArguments[i]); 3.网络运行逻辑 来了解下客户端和服务端之间是如何通信的。 3.1Client -ClientGameLoop 先来看下ClientGameLoop,初始化会调用Init函数,NetworkTransport为Unity封装的网络层, NetworkClient为上层封装,附带一些游戏逻辑。
阅读全文