终于体会到了风后的良苦用心
太吾绘卷吧
全部回复
仅看楼主
level 9
qweytr_123 楼主
怎么说呢,从前我一直觉得风后很有道理,毕竟后端就是快,无脑快
在优化NpcScan的时候……我终于意识到了什么。
已知大概有7000个class要传,传过来之后要实例化几万个字符串
后端的确快,但后端快的代价是前端卡顿。
曾经风后说,“前端就应该异步啊,写成同步不符合编码规范”
emmm,几万个需要更新的字符串(物品,可能不止几万),要不然异步加载,每帧加载若干个,花费好几秒钟加载完成,在此期间需要冻结NpcScan的一切功能,否则前端逻辑会不准确(比如搜不到汗血宝马的原因是汗血宝马没有更新)
要不然卡顿几十到几百毫秒(视优化等级而定,原NpcScan几百ms,现在几十ms)等待所有数据更新完毕
要不然后端执行一切运算但是翻页时候需要从后端重传全部翻页数据……于是一次长卡顿变成每次翻页的短卡顿。
当然,理论上有万能解法避免上述一切缺点,但万能解法有一个后遗症,就是,程序员花费在编写万能解法上的时间,严格大于,其他所有人能因万能解法节省的时间的和。
不得不说风后的用心真的良苦……毕竟,风后的后端,的确快到亲🐴上天
但是,这里的快是以前端变卡为代价的。
就比如,打开所有界面,只要界面的人一多,就会卡。
卡的道理非常简单:
前后端的分离增加了开销。
你永远需要做一个,我在NpcScan中遇到的三选一
而本来你根本不需要选。
没有后端,最差最差的编程习惯,也能保证200ms刷新出50个NpcScan条目
加上后端,会变快多少,我不知道
我只知道,序列化与反序列化加起来基本上需要1秒。
2023年04月05日 10点04分 1
level 8
怪不得风后吹他的后端写得没有问题,原来他把所有程序要处理的压力都丢给前段,根本没有考虑整体延迟问题。在他自己意识到这个前后分裂框架卡顿延迟问题后,自己也没有办法解决然后就跑路了是吧
2023年04月05日 10点04分 2
换句话来说他就是拿新太吾来试错,成了就扬名立万,不成就积累经验,🐴的
2023年04月05日 10点04分
我不确定风后有没有意识到这一点……如果你只碰后端,你只会纳闷为什么只负责显示的前端这么卡……
2023年04月05日 10点04分
level 13
🐴
2023年04月05日 10点04分 3
level 9
只能说🍆识人不明了
2023年04月05日 10点04分 4
有的时候,根本识不动的。风后说的都是对的,但问题是有更多问题风后没说。比如mono的确慢,但风后并没有说他的替代方案会导致前端更慢
2023年04月05日 10点04分
level 8
说白了就是没自知之明的废物。[呵呵]
2023年04月05日 10点04分 5
吧务
level 14
[滑稽]旧日本陆海矛盾是吧
2023年04月05日 10点04分 6
风后写的代码高效率仅在于他负责的那块,根据能量守恒定律,被风后“节省”的那部分操作通通堆积在前端,螺洲的前端技术力又无法优化风后丢出来的大量工作量,前后分离框架反而导致整体效率低下,这就是上面说的二战时候造星际航母
2023年04月05日 11点04分
不是。这是二战时候开发宇宙战舰大和号[怒]
2023年04月05日 10点04分
level 9
qweytr_123 楼主
记得很久很久以前,风后解释过为什么上前后端的原因
“Mono对多线程的支持不好”
emmm这个我也发现了,NpcScan中Aux-Model.CS的第63行有一个完美的吐槽
风后表示,Mono在new object的时候有全局锁,这完美地阻止了程序的并行
这点真是我的知识盲区,毕竟我是真的不知道编译型语言可以差到这种程度
然而,后端的计算部分并不会牵扯过多new object的动作,反而是反序列化的时候,需要new一大堆东西。
也就是说后端其实加速了一个寂寞。该卡的地方,并不会因为跑到后端就不卡了。卡顿只会因为对应数据的缺失而加剧。
理论上,前后端分离是一种非常优秀的设计模式
毕竟玩网游的时候,如果前后端必须黏在一起……那么网吧的生意或许会因此红火不少。
但……前后端分离的时候,玩家有可能接触到的所有的数据,都应该尽量在前端有备份
不然?
不妨想象一下,LOL切换地图的时候,需要等数据包跑一个来回,才能看见地图上有没有野怪,有没有人
不妨想象一下,CS
中门对狙
时,需要等数据包跑一个来回,才能一个幽灵凭空刷新在你面前
不妨想象一下,炉石传说,卡牌结算到一半忽然卡住,原因是后续结算结果没过来
……
如果数据都放在后端,游戏外挂会少很多很多
所以,你聪明的,猜猜看
为什么网游外挂如此流行呢?
2023年04月05日 10点04分 7
一个单机游戏哪还要这么复杂,创意工坊里官方外挂都一大堆
2023年04月06日 05点04分
看起来后端计算的部分,主要是在过月的时候会用到多线程,而过月使用多线程的方式是按照区域并行计算,不加🔒,new一堆临时对象来记录被修改的数据等回到主线程再执行Set操作,这么说来这个流程确实会极大的受到Mono的新建对象加锁的限制,过月会慢非常多,其他地方倒是没什么联系了
2023年04月09日 11点04分
ff14好像就是,啥都要返回服务器处理
2023年04月08日 05点04分
level 8
不管谁对,🍆都得站还在岗位的上的人那一边。这是职场的基本逻辑。
2023年04月05日 10点04分 8
这楼主明显在嘲讽风后,就比如船夫吹他船快,别人上了船问他你这船怎么沉的这么快,船夫表示你就说快不快吧[笑眼]
2023年04月05日 11点04分
@很闲啊- 快,很快啊[笑眼]
2023年04月05日 15点04分
@很闲啊- 唐伯虎点秋香是吧[笑眼]
2023年04月06日 14点04分
风错就是茄错,茄才是领导,第一责任人。
2024年02月15日 13点02分
level 9
qweytr_123 楼主
后排update
几万个字符串是第一版NpcScan
我已经优化过了
但还是慢
毕竟反序列化的开销不小(目前还是Json反序列化,手写二进制反序列化实在太恶心了)
2023年04月05日 11点04分 9
@暗之爆弹 我放弃了一镜到底
2023年04月05日 18点04分
我只想说不管他设想的多好,他都没有实现。而没有实现的东西,就是垃圾。就像伟大的特级厨师小当家曾经问过“那你的酱呢?没有完成的料理,连试吃的资格都没有[滑稽]
2023年04月05日 11点04分
fastjson试试?
2023年04月05日 13点04分
@夜雨斯人归 花时间的部分要不然是int跟字符串的相互转化,要不然是要new六千多个人的class和几万个数组,这个用多快的json大概都不行。我正在考虑到底是手搓二进制序列化,还是干脆写一套Rust自己玩(我是linux……配交叉编译的话这个星期真的不一定能做完)
2023年04月05日 14点04分
level 11
所以说不如全丢内存里
2023年04月05日 11点04分 11
level 1
单机游戏做前后端分离得不偿失吧
2023年04月05日 11点04分 12
@qweytr_123 让前端做个翻页特效,每次加载也就拿一页数据,顶多几十上百ms吧。实在慢就预加载
2023年04月05日 12点04分
@贴吧用户_03K2C9D 是啊,这种没有网络消耗的前后端传输理论消耗很小,一次加载个前后3页的缓存理论很简单
2023年04月05日 15点04分
@东苑南墙 一页信息是选项2,序列化与反序列化很快,但翻页速度呢?
2023年04月05日 12点04分
@qweytr_123 要异步肯定要异步到底啊,异步加载前后页缓存。连续快速翻页的情况理论上不多
2023年04月05日 14点04分
level 11
这类需求,我不信其他场景没有。自己空想出一个方案,来处理复杂问题,是极不靠谱极不负责的。
2023年04月05日 11点04分 14
level 9
这个类似于一个窗口排了好长的队,而且吃饭的地方只有一张桌子
2023年04月05日 11点04分 15
@白渡泽♤冥风 [滑稽]厨师只负责从仓库里吧食材拿出来,掌柜的不但要接客还得在上菜的时候把菜做好
2023年04月05日 15点04分
且切菜切的很快,而做饭很慢,
2023年04月05日 12点04分
@白渡泽♤冥风 [滑稽]厨师:都是掌柜的问题,你就说我快不快吧
2023年04月05日 15点04分
厨师做的东西,本质上差不多,npc的年龄与是否超重才是更新的关键
2023年04月05日 12点04分
level 11
可不可以这样优化一下,不换地图,所有对象先放内存里,换地图的时候再统一序列化
2023年04月05日 11点04分 16
感觉你这个更新逻辑不考虑任务需要,不能优化即时的请求。
2023年04月05日 11点04分
@白渡泽♤冥风 先过个月[滑稽]
2023年04月05日 11点04分
@windyranger 我想通逻辑了,npc状态发生改变,对玩家来说重要程度不一,最容易发生改变的是年龄大的与超重的及其相关npc。所以分两步更新,一步是用旧的数据做筛选免去序列化让玩家选择感兴趣的目标,另一步是更新这几个目标的信息,如果他们发生了剧烈的变动,就更新跟他们相关的npc。
2023年04月05日 12点04分
回复 白渡泽♤冥风 :筛选也是有开销的,不太好说。想法就是把部分后端计算拿到前端,减少序列化频度,但是人死了,物品丢了什么的肯定要序列化吧,造诣、属性什么的倒是关系不大。
2023年04月06日 02点04分
level 8
我焯,这下真的是游戏养成游戏了哈哈哈,这里是一枚应届毕业的php和java程序员,收藏了,坐等大佬们给思路。我这边抱着薯片看大佬们如何对屎山斗法[滑稽]
2023年04月05日 11点04分 17
这个还用给思路吗?开一个stopwatch看哪里慢把速度提上去就好。目前是json反序列化慢,但改这个需要小心,毕竟手写代码一时爽,添加字段火葬场。
2023年04月05日 12点04分
我觉得要从底层入手,反正都是单机内数据交换,有没有一种技术后端数据直接内存映射到前端。或者用更底层的方式让前端json解析变得十分快
2023年04月06日 10点04分
1 2 3 4 尾页