V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Game Engines
Unreal Engine
MyCryENGINE
devh0407
V2EX  ›  游戏开发

想问问大家有没有了解类似于王者荣耀的房间系统的设计思路,如何能在完成对局后又重新退回房间?

  •  
  •   devh0407 · 2019-07-22 02:18:23 +08:00 · 5173 次点击
    这是一个创建于 1954 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初接触游戏设计,大致想了解王者荣耀在 pvp 房间系统的设计思路:是否是进行任意游戏匹配,创建房间,[假设房间为临时存储],对局完成使用,返回房间,玩家退出房间销毁。若是临时存储,那怎么通过个人历史战绩知道那一局对战为创建过房间邀请过好友的对战;但不是临时存储,房间这个的数据变化量极大,不同玩家的进入退出操作多是否会对储存造成影响呢? 有此问的原因是实习期间公司项目曾遇到相关问题,最后在信息展示方面减少些许,放弃房间的存储。希望能给在下解惑,感谢!

    neoblackcap
        1
    neoblackcap  
       2019-07-22 02:35:22 +08:00
    没看懂你这个历史战绩跟房间有什么关系
    房间当然是临时的,这个根据服务器状况来分配创建,不是很好理解么?房间的信息都是存在服务器内存,不是很明白有什么存储影响。
    你战绩系统,游戏结束之后入库就可以了,跟房间有什么关系呢?

    PS:没玩过王者荣耀,不是很了解,只是根据之前观看的网游架构回答
    mumbler
        2
    mumbler  
       2019-07-22 02:39:15 +08:00 via Android
    说破天了,就是个关系数据库嘛,用户表,房间表,玩家状态表,select,update,insert,数据量大就主从,分库,分表
    msg7086
        3
    msg7086  
       2019-07-22 04:33:12 +08:00
    一局对战只存了多少数据?
    参与对战的人,战绩和数据,互相评价,没了。
    要存储房间历史的话,存下这点东西也就几百字节撑死了。

    另外我读你的主题真的是读得累,5 行字里找不出一个主语,上下文意思模糊,我觉得很难理解你的具体疑问。
    devh0407
        4
    devh0407  
    OP
       2019-07-22 09:29:50 +08:00
    @neoblackcap 首先十分感谢您回复,我昨天又自己想了一下,我的问题是房间表的 ID 是否会和对局结果进行外键关联,在我的理解中,房间中的玩家列表是经常会变化的,当玩家列表发生变化后再对局,对局结果所引用的房间 ID 是否应该变化。
    我在王者荣耀看见的历史战绩中,会有标识某场对局是否有队友或二人 /三人排位这样子的属性,不太理解是在对局的记录中进行保存,还是在引用的房间中进行保存然后联表查询的。感谢!

    @mumbler 您好,感谢您的回复。您说的我能理解,就是觉得他们这种用户量级的游戏是否会在这种信息的存储上有巧妙的地方,想学习学习。感谢!

    @msg7086 非常感谢您的回复哈,在表达方面很抱歉,第一次发贴,我说不清楚,您还能耐着性子看完。您说的对的,我也想了,实际上房间历史存与不存的影响比较小,我只是之前对经常变化的房间和引用了房间的对局结果在关联查询的时候比较疑惑,想了解下大用户量的项目有没有啥高级的操作来处理这种东西。感谢!
    neoblackcap
        5
    neoblackcap  
       2019-07-22 10:31:41 +08:00
    @devh0407 你为什要存房间 ID ?房间应该是临时的,用完就删除或者回收了,房间我想不到为什么需要跟游戏之后的数据关联,哪怕是游戏回放功能都不需要房间 ID,你需要记录什么数据,就放在一个赛后记录表就可以了。
    devh0407
        6
    devh0407  
    OP
       2019-07-22 10:49:14 +08:00
    @neoblackcap 嗯嗯,我明白了,谢谢。我还想问一下,开始匹配是将房间放到匹配队列中,匹配成功后移出匹配队列,这时候这个房间的数据应该存放在哪里,是找个 List 放进去吗,然后等游戏结束后再让房间移出 List,状态变为组队中,再可以进行开始匹配?对应功能是对局结束返回房间的操作。我有点说不太清楚,很抱歉
    neoblackcap
        7
    neoblackcap  
       2019-07-22 11:52:50 +08:00
    你可以这样做,不过我觉得这个队列也不是很必要。
    因为可以以用户积分排序,然后按照每居人数进行匹配。人数一旦满足,就由世界服务器将用户移交到游戏房间服务器,这时候用户也就不可能再排队了。
    我记得拳头好像是这样设计英雄联盟的,你可以搜一下,我记得他们分享过他们的服务器架构。
    你可以粗略地用两个 List 来表示这个过程,不过一般都是两个独立的模块,互不影响,中间是通过通讯来进行沟通的。房间可以固定也可以不固定,不过我觉得为了游戏体验,可以通过检测服务器配置进行预分配。
    因为我也不是搞游戏服务器开发的,所以我也只能通过之前看到的文章告诉业界是怎么做的。我建议你最好先去读读别人是怎么设计的,GDC 上面有游戏开发的分享,各个游戏公司的技术博客好像一般也有提及。可能老了一些,不过你可以尝试去找找 EVE 他们的分享,还有魔兽世界,还有国内的云风。他们的经验都是很好的。不懂就先读,否则你造的东西真的会玩具。
    j0hnj
        8
    j0hnj  
       2019-07-22 11:54:56 +08:00
    @devh0407 #6 房间的数据一直存在,要匹配的话就把房间 ID 加到匹配队列中,匹配完成就移除,游戏完成后把房间数据销毁就可以了。
    devh0407
        9
    devh0407  
    OP
       2019-07-22 12:26:39 +08:00
    @neoblackcap 感谢您的讲解,我大概明白了他们是咋做的了,也知道了更多了解相关知识的渠道,我去看看学习一下。感谢!

    @j0hnj 感谢回复,我明白您的意思了,这对我的 demo 思路有不小的帮助,感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3742 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:32 · PVG 18:32 · LAX 02:32 · JFK 05:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.