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为上层封装,附带一些游戏逻辑。
