1. 下载LockstepPlatform [https://github.com/JiepengTan/LockstepPlatform/releases/tag/v0.3.5][11]
2. 下载Demo [https://github.com/JiepengTan/Lockstep_Demo2D_Tank/releases/tag/v0.3.5][12]
3. 解压 LockstepPlatform 并命名为LockstepPlatform (注意目前一定需要这样命名)
4. 使用Rider 或visualStudio 打开 LockstepPlatform/LockstepPlatform.sln。(不要编译,等待编译器价值完成)
5. 打开你想要使用的Unity的版本
6. 执行 Lockstep_Demo2D_Tank-0.3.5/Setup.sh
7. 点击 Lockstep_Demo2D_Tank-0.3.5/RunServer.sh 运行服务器
8. Unity 打开Lockstep_Demo2D_Tank-0.3.5/Src/Unity/ 运行游戏
想看视频的可以点击这里 [Mac环境搭建视频][15]
//TODO ———-
朋友们,我又回来了,继上一次的 shader教程 后,这次推出的是游戏开发框架教程,目标受众是中高级程序员(有梦想的初级程序也行),当然了,这次会伴随着教学视频,毕竟视频+声音 学习效果会比文字好很多 :)
本教程会同时伴随一个框架的诞生LockstepPlatform,该框架核心技术点是 帧同步 & ECS,目标是提供双端的帧同步解决方案 本框架的初衷:
本教程内容涵盖:
LockstepPlatform 从v0.1.0->v0.8.0 代码的框架的迭代过程
1. 数据格式的设计
2. 内存管理
3. 资源管理
4. 多线程
5. shader优化
本框架会同时涵盖多个demo,即使这些demo很简单,但还是会在这些demo中遵循相应的编程范式, 初,中级程序可以参考里面的编程技巧
1. 基于ECS快照回滚帧同步技术,提供一个游戏双端解决方案。
2. 服务端:实现一个游戏平台,同时支持多个小游戏的运营,类似qq游戏平台
3. 客户端:实现一个小引擎(除Audio,以及渲染器模块以及Editor,其他的都会基于确定性计算(整型)重写)
1. Excel 数据& 代码生成库 (done)
2. 基于消息回调的网络消息库(done v0.6.0~v0.7.0 会增强为c# 基于await 异步回调 以及actor 模型)
3. 客户端编程范式正式改为面向接口编程
4. 服务器支持分布式(目前不成熟 仅用于测试双端游戏流程,v0.6.0~v0.7.0 会增强)
1. ECS 目前采用Entitas (后续版本会改为基于c#指针&struct的版本。以及兼容Unity ECS 开发模式)
2. (确定性)碰撞检测库 3D
3. 序列化库(done)
1. 基于整形的数学库 (done)
2. (确定性)碰撞检测库 2D
1. 基于c# 指针和struct实现的 内存紧凑版 行为树 (done)
2. (确定性)NavMesh 库 (done) (TODO指针版本)
3. ECL(a domain-specific language(DSL) for Entity component design)(解释器正在开发中)
4. AssetBundleLoader (TODO)
5. ECS代码生成器 (done) ECS 代码生成器 目前支持Entitas, 后续版本会同时支持生成Unity ECS代码,以及兼容Unsafe ECS代码 (新增)
1. BehaviorTree 添加 Eidtor 支持
2. ECL
- 兼容Unity ECS
- 开始支持基于c# 指针&struct 的版本
- 支持导出为Excel 方便配制
3. 2D 物理库
4. NavMesh 指针化&struct 化
5. AssetBundleLoader Editor
@TOC
在相对大型的游戏中,总是会碰到需要CPU占用时间长的任务,为了避免卡顿,可能需要进行分帧处理,在Unity中通常使用协程,但是需要协程本质上也是运行在主线程中,它依然会占用大量的主线程时间分片.所以使用多线程,但是多线程需要考虑下面几个因素:
1.游戏的很多逻辑都是基于单线程开发的,所以使用多线程的时候,任务完成时,回调必须在主线程中回调,不然容易引起线程安全的问题。 2.游戏的有时候常常必须运行在主线程中,如需要使用实例化GameObjec,需要创建新的游戏资源如Texture,Mesh等,这些在Unity中必须运行在主线程中. 3.任务有时候需要中断,如一些先决条件的改变 4.如果我们的游戏是帧同步游戏,为了保证逻辑的一致,有些任务所有客户端都必须在同一个逻辑帧中完成。而这就要求其不能运行在其他线程。 5.当然主线程不能被挂起,否则游戏就卡死了. 6.游戏中不能到处充满Lock,Unlock的代码,不然维护成本过高
所以线程框架必须具备以下几个特点:
1.任务完成时候的回调必须在主线程中。 2.任务的某些阶段必须可以在主线程中运行 3.任务可以被取消 4.有些任务必须只能在当前帧中完成 5.主线程不能被其他线程给挂起 6.性能要好,因为引入多线程的原因就是为了性能
基于上述几个需求:
1.在没有任务的情况下,那些线程不应该占用CPU时间分片,所以应该被挂起。 需要使用信号量实现 2.我们拥有两种不同的运行环境,主线程和非主线程,但是为了同时满足上面的需求1,2需要一个运行在主线程的MainQueue,多线程本身就要求拥有一个运行在其他线程的AnyThreadQueue,需求4,所以我们还需要一个CurFrameQueue,这些队列都必须是线程安全的,所以必须加锁 而BlockQueue可以很好的满足上面的加锁和信号量的需求 3.//TODO
- 游戏优化中的通用技巧和思想
- 涵盖通用的资源管理设计模式,多线程,序列化框架等
- 游戏中不同模块的优化分析,以及优化技巧
- 游戏框架的设计
- 通用库的抽取
1.一个人的能力和见识毕竟有限,对于框架的设计如果有好的建议或者参考项目源码,可以给我留言,或者给我发邮件JiepengTan@gmail.com,非常感谢。 2.如果发现了我的源码中的bug,你可以在对应的文章下面留言,或者给我邮件,我会非常感谢并尽快的修复
本篇主要技术点有:
栅格化屏幕空间 函数设计技巧:”凑” 2D旋转