KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 336|回复: 11

同步写异步功能

[复制链接]

58

主题

215

帖子

803

积分

高级会员

Rank: 4

积分
803
发表于 2018-12-22 14:25:38 | 显示全部楼层 |阅读模式
由于是分布式部署,不同玩家之间的数据调用都是异步,在玩家Entity里都不能用带有返回值的对外方法了

能否原生支持带有回调函数的异步调用呢?
不然逻辑中需要通过其他Entity上的属性来判断后续逻辑很麻烦,如果要来回判断简直是灾难

python新版本已经支持async wait功能功能了,如果更进一步用async await来写异步,那就极大解放生产力了
回复

使用道具 举报

5

主题

5247

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-24 15:15:32 | 显示全部楼层
通常你这样的设计方法或许本来就是灾难。
引擎将来是打算做一些支持, 但你的设计方法就会导致性能陷阱, 想想你内部可能会大规模高频跨进程交互。
支持了这个特性也只是语法上舒服点而已,没用好背后的事情才是恐怖的。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

58

主题

215

帖子

803

积分

高级会员

Rank: 4

积分
803
 楼主| 发表于 2018-12-24 16:17:19 | 显示全部楼层
柯标 发表于 2018-12-24 15:15
通常你这样的设计方法或许本来就是灾难。
引擎将来是打算做一些支持, 但你的设计方法就会导致性能陷阱,  ...

这个问题的本质是不同进程上的用户需要交互,如果不做分服那么分布式这个问题很难避免吧
回复

使用道具 举报

5

主题

5247

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-24 16:55:45 | 显示全部楼层
很多时候你需要用空间换速度。

比如大世界服务器, 一个场景被分割成2部分, 边界部分a实体攻击B实体, 从功能上来说就不允许异步过程, 这个时候就要考虑需要相互无缝访问的属性, 可以类似于服务器同步给客户端的属性, 更新一份过去, 让对方无缝计算。
比如客户端想知道某个怪的状态是否是死亡, 然后决定玩家自动攻击是否攻击这个怪, 如果先去服务器获取属性再计算就太慢了, 直接弄个all_clients类属性, 客户端就可以直接计算了。
如果这个过程即使用协程做到了你说的写法, 高频率计算的mmorpg内部的远程调用会让服务器直接承担不住。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

58

主题

215

帖子

803

积分

高级会员

Rank: 4

积分
803
 楼主| 发表于 2018-12-24 17:22:52 | 显示全部楼层
本帖最后由 CC2012520 于 2018-12-24 17:25 编辑
柯标 发表于 2018-12-24 16:55
很多时候你需要用空间换速度。

比如大世界服务器, 一个场景被分割成2部分, 边界部分a实体攻击B实体, 从 ...

如果做数据冗余会带来不一致性问题吧?

特别是A依赖B的某个属性值做后续逻辑判断的话,如果B的值不稳定会带来逻辑不一致,
你这个例子里服务器会做验证,如果设计是杀怪掉全服唯一奖励的话,即使客户端表现为双杀,服务器也会分个先后,抛弃后上传的数据
如果是数据唯一的话,就能维护逻辑一致性了,在具体逻辑上这两种方案也是有取舍的

如果是进程间高频远程调用,那确实需要做优化,就是不知道这个消耗的瓶颈在哪,如果一组服务器的瓶颈不在远程调用,那这块可以做一定的让步
回复

使用道具 举报

5

主题

5247

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-24 21:02:15 | 显示全部楼层
我说的是很多时候不代表任何时候, 比如扣钱扣元宝就要小心。

用客户端举例是想比较好理解这样的界限分隔。服务器与服务器之间很多东西都可以这样做。
否则mmorpg一个技能需要几个进程来回跑,服务器根本没法跑, 即使你做纠正, 也能在来回的发包之间双方状态一直在改变, 纠正也没完没了甚至无法纠正只能取舍结果(比如a攻击了b, 此时要防止连续放技能这次技能魔法耗完了,a其实极短的瞬间时间接着放了无敌,由于没有魔法释放不成功, 而攻击中转过去时发现b不在那个地方了,或者b的状态已经是不可攻击, 回去再还原a的魔法, a由于无敌没有释放成功已经死了,如果你复活a, 那攻击a的人也要回溯,没完没了)。

取舍是你自己的取舍, 一个游戏如果多数时候特别是主要玩法都是这样远程交互调用基本上就会卡死或者说你的cpu都在这耗了,一次rpc要走的流程比本地读一个属性多多了代价是较大的,网络是一种io消耗。
即使是语法做到无缝, 你依然要能掂量好这个问题才能较好的发挥性能。


QQ:3603661
3603661@qq.com
回复

使用道具 举报

58

主题

215

帖子

803

积分

高级会员

Rank: 4

积分
803
 楼主| 发表于 2018-12-25 09:56:39 | 显示全部楼层
柯标 发表于 2018-12-24 21:02
我说的是很多时候不代表任何时候, 比如扣钱扣元宝就要小心。

用客户端举例是想比较好理解这样的界限分隔 ...

感谢解答

如果是只需要对方数据做自己的单独逻辑可以做冗余,但如果是双方游戏中只要执行逻辑就要给对方同步状态,那不在一个进程上的话,那每次交互至少要走一次rpc吧

我在想当用户登录的时候,能否通过全局判断,把玩家的base主动创建在其对手的进程上,如果对手没有上线,就做负载平衡,登录的时候能加入这样的逻辑判断吗?
回复

使用道具 举报

5

主题

5247

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-25 11:10:52 | 显示全部楼层
你这样的需求, 应该把双方创建到一个space中, 就可以高频本地互相访问交互。
在base上做相当于做了cell的功能。
登录到哪里是无法编程的。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

58

主题

215

帖子

803

积分

高级会员

Rank: 4

积分
803
 楼主| 发表于 2018-12-25 15:20:59 | 显示全部楼层
柯标 发表于 2018-12-25 11:10
你这样的需求, 应该把双方创建到一个space中, 就可以高频本地互相访问交互。
在base上做相当于做了cell的 ...

我有一个测试项目是这样做的,这样减少了用户之间的跨进程互访,但Account.base -> Space.cell -> Account.client 这个过程是否也要跨两次进程呢
回复

使用道具 举报

5

主题

5247

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-25 16:31:51 | 显示全部楼层
baseapp可以看做网关。 所以从cell转发过去的操作仅仅类似于从网关转发到客户端。

一般需要实时多个实体交互的逻辑都在cell做, 期间应该一直是cell-》base-》client, 而不是总是Account.base -> Space.cell -> Account.client的过程。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

58

主题

215

帖子

803

积分

高级会员

Rank: 4

积分
803
 楼主| 发表于 2018-12-25 16:57:43 | 显示全部楼层
柯标 发表于 2018-12-25 16:31
baseapp可以看做网关。 所以从cell转发过去的操作仅仅类似于从网关转发到客户端。

一般需要实时多个实体交 ...

我理解的是,如果是服务器运算同步到客户端而客户端操作比较少的情况,主要是通过cell计算,然后走cell -> base -> client 来广播消息,但客户端上传消息,还是得走 base -> cell -> base -> client 这个流程吧

而且即使是cell -> base -> client 这个流程,由于cel和base本身就不在一个进程,而且也很有可能不在一个物理机上,那cell -> base这个过程本身也是一个rpc吧

这与把某一个base当cell用,rpc次数也没有减少吧,还是说base -> base 和 base -> cell 的消耗不同呢(前提是他们都是跨物理机)

不知道我理解的对不对
回复

使用道具 举报

5

主题

5247

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-12-26 09:42:55 | 显示全部楼层
你的理解是错的。

需要多个entity在一个空间内相互可见的应该在cell做。
一般的服务器架构都有个网关, 中转是正常的, 再说中转也都是同步型中转, 跟上面提到的计算需求导致的rpc不是一个概念和量级。
计算都是本地计算了。
QQ:3603661
3603661@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2019-6-25 12:33 , Processed in 0.062757 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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