太吾绘卷吧 关注:255,147贴子:4,700,908

我也来云一把程序设计和架构的问题

只看楼主收藏回复

昨天在NGA看到了前游戏主程和很多大佬对程序设计问题的讨论,我越琢磨越觉得这个问题有意思,也值得探讨。在思考这个问题的过程中,我也更加体会到了《太吾绘卷》和其他一般单机游戏的差异以及它独特的魅力。
先说一个观点,我觉得从开发的角度来说,《太吾》更像是一个网络游戏,而非单机游戏。
原因是《太吾》里玩家操控的角色和所有NPC在本质上是一样的。所有角色都有自己的属性、功法、物品、经历等等。这就意味着,可以把每一个NPC都视作一个AI操控的玩家,大家都在一个游戏世界里活动。这就像你在玩一个除了自己,其他人都是bot的网络游戏。
有了这一层游戏机制的认识以后,我觉得对于之前讨论的一些架构和设计问题就可以有一些判断。例如,
1. 前后端分离问题。这一点我觉得非常合理,前端负责当前玩家的角色交互,所有反馈机制以及NPC行为都交由后端处理。至于端口问题、前端页面卡顿问题都不是由架构导致的,也都有成熟的解决方案,在这就不赘述了。
2. 存档问题。这个问题我觉得非常关键,也确实是一个难点。因为如果是传统单机RPG,存档只需要记录当前角色的位置、状态等,NPC的位置、状态是不需要记录的。而如果是网游,则没有存档的概念,玩家的行为最终会落地为数据库的记录。回到《太吾》,我认为会很适合采用关系型数据库来计算和保存数据,物品持有、功法修炼、经历等等都是对实体关系的记录。当交互发生时,对应到数据库中进行更新和插入,到了人物主页面再做数据查询。这样一方面可以减少存档大小,另一方面也不用时刻把所有数据加载到内存中。就是不知道过月的时候,计算的压力有多大。
最后,写这个帖子也是抛砖引玉,想和各位讨论,如何设计《太吾》这样游戏机制的程序架构。《太吾》确实是一款非常优秀的游戏,在游戏玩法上做了很大的创新。无论功过,还是希望螺舟能够克服暂时的苦难,把《太吾》打磨完善。


IP属地:湖南1楼2022-09-27 10:28回复
    我觉得太吾的设计思路可能是和你推测的差不多。程序篇也说了类似的东西。


    IP属地:四川来自Android客户端2楼2022-09-27 11:32
    回复
      2025-05-13 08:45:30
      广告
      淘宝秒杀那么大的并发都能做。这个游戏算什么。只要是前后端分离。后端数据处理大不了放云上,现在数据处理就不是问题。各种缓存,消息队列,中间件……
      感觉pc游戏瓶颈还是前端。
      不管是游戏设计和UI交互,用户第一感受就是前端的反馈。
      就拿红字报错来说。前后端分离,后端就算报错,也应该捕获异常,使其前端代码继续运行,不应该导致游戏崩溃。前端的健壮性不行。


      IP属地:北京来自Android客户端3楼2022-09-27 11:33
      收起回复
        现版本统一下设计思路就好了,茄子加那么多想法,改这改那,无非就是去数值化,但是又处处用数值限制玩家的选择,首鼠两端做出来的东西能好才怪。他想做的游戏和别的游戏差别多大他自己不知道么,套用其他游戏的办法死路一条。


        IP属地:辽宁4楼2022-09-27 11:37
        回复
          存档,如果是前后端分离,像这种千人千面的npc,反而要用非关系的数据库做冗余缓存存储,提高效率。
          存档,就用json把关键信息存储就行。读档,就读取json时再去查询库中的信息就行。然后前端再读取数据渲染展示


          IP属地:北京来自Android客户端5楼2022-09-27 11:43
          收起回复
            最后那个担心没有必要,之前录视频的时候就说过,会在你玩的时候就开始算,过月只是保底算完而已。


            IP属地:天津6楼2022-09-27 11:44
            回复
              一开游戏那段假死就知道游戏加载的数据量有多大了,这种连鼠标都卡的记载超越了我的认知。
              至于程序是否合理这个对于玩家来说就两点,流畅度和加载速度,包括过月演算这种,这是玩家唯一能体会到的。
              其他的你用什么技术什么流程都不重要的,重要的是流畅就好了,这游戏本身不到1g,数据量应该也远没有网游那么多,流畅不卡记载速度快才是应该有的表现,顺便说下最影响体验的是ui这块做太烂,能多墨迹就多墨迹。


              IP属地:山东7楼2022-09-27 11:49
              收起回复
                他们的存档是面相数据编程的优化方案,能走到这一步说明是有点东西的。个人感觉比关系行数据库还要好


                IP属地:浙江来自Android客户端8楼2022-09-27 11:59
                回复
                  2025-05-13 08:39:30
                  广告
                  问题在于健壮性,很多时候出了问题都应该捕获,然后继续往下走,茄子的程序猿没有这个思维就很奇怪,直接抛出体验十分差


                  IP属地:广东来自Android客户端9楼2022-09-27 12:02
                  收起回复
                    我觉得用非关系形数据库如mongodb存较好


                    IP属地:江苏来自Android客户端10楼2022-09-27 12:16
                    收起回复
                      大概这几个方面吧:
                      1. 游戏最适合的存储是文档型数据库,例如楼上说的mongo,但是 mongo 存在 AGPL的问题,可以选择别的替代;
                      2. 预计算,过月事件,外道刷新等延迟逻辑以及非本地图的npc可以提前计算做缓存;
                      3. 多级缓存,参考 chrome 使用 leveldb的方式,太吾村相关数据可以放 leveldb里;
                      4. 历史记录,时间序列存储,利用influxdb 存日志及历史数据;


                      IP属地:北京11楼2022-09-27 12:38
                      回复
                        在贴吧看见了奇异的事物,入魔值减少了


                        IP属地:四川来自Android客户端12楼2022-09-27 21:08
                        回复
                          你在前段体验到的9成9卡顿都是前段本身自己的问题,既然前后分离,我都能猜到现在的大概处理模式
                          首先现在的前端估计都没开线程支持,具体表现在ui卡顿,跨地图卡顿,很明显ui和逻辑是跑在一个线程上,所以才会出现计算量高的时候鼠标都闪现的问题
                          其次,各个界面大部分都是你点击的时候才去生成实例,甚至例如对话面板里的选项都是你选择一个他才现加载,所以中间会有卡顿
                          而进各个实力地图或者太吾村更是如此,明显的卡顿说明都是当时才去加载,你反复进去关闭,每次都是卡顿,说明他加载完就放弃掉,明明这些都应该做成一次加载常时存在的东西
                          至于npc数据,当前地图肯定是前端在主线程里进行或者主程序频繁在访问处理线程导致后期卡顿的核心原因
                          作为一个前端,无处不在的卡顿,只能说明ui线程里进行了大量逻辑计算或者极高频率的去等待外部数据,这种设计只能说是极其没有经验的做法


                          IP属地:辽宁来自Android客户端13楼2022-09-27 21:36
                          收起回复
                            不,他们不锁精纯


                            IP属地:湖南来自Android客户端14楼2022-09-28 09:28
                            回复
                              2025-05-13 08:33:30
                              广告
                              数据方面有个问题就是行为结果的规模难以控制,如果数据运算多增加速度快,就应当智能的限制一部分npc的行动。运算与存储集中于过月,可以认为只有过月时npc才活着,可以先确定那些npc能到太吾本月能到的地方,先运算他们,让本月太吾无法到达的地方的运算与存储独立,后运算。同时增加元素防止太吾连续过月,或者让太吾可以直接过若干月。


                              IP属地:山东来自Android客户端16楼2022-09-28 22:09
                              回复