当前位置: 首页 > news >正文

小飞机工作笔记(一)方案简述

    今天主要就是在继续核心战斗的开发。游戏的玩法很传统,就是带一队英雄在2D横版副本上,可以划线拖动,以及释放技能刷怪。对战我希望可以做成多人实时的,但由于涉及到玩家的操作,想要做到很平滑的体验,状态同步加简单的渲染层预测依然是不够的。多人实时对战的,之前用unity做手游时,探索过帧同步+ECS+渲染层预测回滚的解决方案。但是帧同步对于小团队开发太耗心力了,其它的不说,光是辅助的调试工具以及大规模的测试都是小团队难以胜任的,更何况是采用Js的H5呢。不过我还是使用Js实现过一个帧同步的版本,因为开发H5才又去学习的Js,然后开发过程发现Js的number数据类型无法区分整型和浮点,虽然说动态语言似乎都是不区分整型和浮点的,但是像Lua这种我还可以嵌入C模块,可Js要跑在浏览器里面,目前就我的了解,是无法嵌入C模块的。这样就使得定点数的实现非常困难。后来还是找了个BigInteger.js,内部直接用字符数组来模拟整数运算的去实现定点数运算,但是性能堪忧。
    因为这个原因,同步方案成了我的一块心病,有一天突然想到,其实状态同步也是可以和ECS、状态回滚很好地结合在一起的。轻io竞技的这种,参与的玩家一般是3V3或是5V5左右,而玩法一般也不会太复杂,地图上不会像RTS或是MOBA那种出现大量的作战单位,因此相较于帧同步,需要同步的数据量并不会多多少。核心的逻辑依然独立出来,每帧计算出单独的数据副本,渲染层轮循核心逻辑层作插值展现。服务器的话,也同时跑同样一套核心逻辑,在检测到不同帧的状态数据有改变时,则将改变的数据按帧同步到客户端即可。如果客户端的演算超前于同步状态帧的话,则只需要以服务器的状态帧为准,重置先前的逻辑帧,并且从重置帧重新向后演算即可。渲染层因为是插值演算,在网络抖动不是很大的情况下,重置后依然可以保持平滑的体验。由于是以服务器状态为准,两边客户端的本地演算出现偏差也没有关系,而且一些关键的数据(比如玩家或怪物死亡等)必然会被检测到并同步到客户端,因此即使客户端演算与服务端演算出现偏差,出现服务器认为没有变动而客户端演算认为变动的数据,导致画面的展现与服务器状态不是完全一致,也不会对用户体验造成多大的影响。更何况这种不一致本来就是小概率事件。
    对于数据变动的检测,在服务端,只需要每帧之间对所有entities的components做一个对比,搜集变动的数据并打包下发到客户端即可。当然,这也是归功于ECS(Entity-Component-System)的设计思路,不仅使得数据与行为完全分离,中间状态的计算与回滚成为可能,也使得能够摆脱类型的束缚,以一种统一的方式来处理对象各属性的数据。

转载于:https://www.cnblogs.com/Jackie-Snow/p/9353029.html

相关文章:

  • iOS6.0下获取通讯录用户列表
  • Niagara物联网框架机制二(笔记)
  • Python: Enum枚举的实现
  • IntelliJ Idea学习之常用快捷键
  • Facebook AccountKit 接入的坑点
  • oracle数据查询的基本方法
  • 以Java工程师为例,技术面试应该怎么准备?
  • 安装Android Studio遇到中文乱码的解决方法
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • Nginx爆出漏洞 百万网站面临风险
  • 免费https证书
  • Linux 下压缩与解压.zip和.rar及.7z文件
  • JDK里的设计模式
  • Oracle查询访问同一表的两个以上索引(二)
  • Android CMake轻松实现基于OpenSSL的HmacSHA1签名
  • 08.Android之View事件问题
  • Odoo domain写法及运用
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Selenium实战教程系列(二)---元素定位
  • springMvc学习笔记(2)
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue2.0项目引入element-ui
  • 前端攻城师
  • 深入浅出Node.js
  • Spring第一个helloWorld
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 飞书APP集成平台-数字化落地
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • (12)Hive调优——count distinct去重优化
  • (27)4.8 习题课
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm高校实验室 毕业设计 800008
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)jdk与jre的区别
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)利用webkit抓取动态网页和链接
  • .dwp和.webpart的区别
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core 中插件式开发实现
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 高效开发之不可错过的实用工具
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [2023年]-hadoop面试真题(一)
  • [AIGC] 如何建立和优化你的工作流?
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [Docker]十.Docker Swarm讲解
  • [hdu 2896] 病毒侵袭 [ac自动机][病毒特征码匹配]
  • [IDF]聪明的小羊
  • [IOI2007 D1T1]Miners 矿工配餐
  • [iOS]中字体样式设置 API