一、游戏物品/道具系统数据模型设计特点

为了让游戏更加的丰富,我们1201团队的新手机游戏设计了道具系统。于是丰富了游戏、取悦了玩家,哭了开发——道具/物品数据子系统是简单的、复杂的、不确定的:

  1. 简单,说起来不就是选择一个或多个数据库产品,然后定义一种数据模型,然后增、删、改、查。
  2. 复杂,物品/道具可以在细分为装备、时装、坐骑、宝石、buff等等,每类物品有不同的属性需求,于是:

    • 首先物品数据是游戏核心数据里数据量最大、操作最频繁、数据结构最多元化的数据
    • 如果用一种数据表结构,那么会浪费很多的字段或数据空间(而物品表超大);
    • 如果用不同的数据表结构,那么游戏逻辑就要麻烦一些了,比如物品在玩家中转移的时候、修改、丢弃的时候。
    • 是否进行应用逻辑层水平切分?切分了就可以将数据库分布到多个数据库服务器上,那么理论上数据规模就不会成为瓶颈了;但如果切分了,道具数据分析、后期的合区逻辑就会很复杂。
    • 装备、时装是会有多个属性的,且每件装备的属性值、属性类型都不一样,如何设计数据字段(当然如果用nosql数据库就不存在这个问题了)?
  3. 不确定:

    • 随着游戏开发及运营的进行,各种新的道具的需求会不断涌现出来,有可能就会需要增加新的属性和功能需求
    • 到底每一个玩家最终会有多少的物品?
    • 最终单个区服的数据规模有多大这个其实很难预计。我们做的很完善(当然开发代价也大)的设计与开发会不会有些多余,甚至被老板认为想多了?

二、游戏物品/道具系统数据模型设计目标及解决思路

上面分析做了,槽也吐了,还是要做事嘛,呵呵。根据我们的新游戏的具体需求,对物品数据库表的设计定义了如下要求和解决思路:

序号 要求 解决思路
1 确保数据操作的性能 充分利用缓存服务器
2 降低程序开发和后期客服工作的复杂度 各类道具不分表
3 必须可以方便、灵活的支持道具新功能需求的开发 将多变的装备属性以json格式存于一个字段
4 保留充分的可扩展性 根据玩家id进行数据库表水平切分
5 尽量降低合区操作时数据处理逻辑的难度和效率 用自增长ID、玩家id、区服id做联合主键

三、具体开发设计方案

根据以上的分析结果,我们在总结了以前的游戏开发经验并参考了网上的一些文章后形成了我们新手机游戏的物品数据子系统的设计、开发方案。

所有数据访问都封装在model层。

  1. 在程序的model层里定义公共函数GetDb(playerid,areaid),用于物品数据及其它需要进行按用户水平分割的数据获取数据库(连接)
  2. 每一个物品的主键由itemid,playerid,areaid三个字段组成
  3. 将装备buff及某道具特有属性统一以json字符串形式保存在一个varchar字段里
  4. 道具表定义 失效时间 字段,这个字段同时表示道具有效期的三种情况:
    • =0 ,表示是不限时的永久性道具
    • 小于等于600000,表示有效时间段,如双倍经验卡有效时长3小时,那么着个字段值为 180 (分钟),使用此道具时,用当前时间加上这个字段值得到失效时间戳修改此字段或做其他处理
    • 大于600000,表示该道具的失效时间戳(unix时间戳格式)
  5. 玩家道具数据查询流程:
    • 首先检查redis里有没有
    • 如果有,返回
    • 如果没有从数据库里查询并存到redis,返回
  6. 修改/或增加道具数据流程:
    • 首先检查redis里有没有
    • 如果没有,从数据库里查询并存到redis
    • 如果有,继续
    • 修改/增加redis数据,同时在key为“item_update_list”的redis list 数据里记录下该道具的主键
    • 定时根据“item_update_List”数据写回mysql,并清除“item_update_list”
  7. 删除一个道具数据流程:
    • 在redis 里key为“item_delete_list” 的redis list 数据里记录下该道具的主键
    • 删除redis里记录
    • 定时根据item_delete_list”数据删除mysql里记录,并清除“item_delete_list”
      8.注意:
    • 配置redis 为 在每次更新操作后进行日志记录
    • 缓存定时同步mysql处理程序可以作为一个独立的进程运行
    • 这个解决方案可以针对其它用户私有数据,如技能、buff。

四、总结

数据库表水平分割和缓存应用基本上已经是服务器端程序员的常识,在google上查相关技术资料时,大多数博文也是写的这些。

本文先是对游戏道具/物品数据模型的进行了简单的需求分析,然后讲了思路和方案,其实我最想表达的是我的三个设计细节或idea:
+ 道具数据记录主键设计(方便合区)
+ 装备buff及道具特有的属性字段设计(为道具丰富的功能需求提供灵活、便捷的数据基础)
+ 所有道具类别不区分存储(方便后期的客服查询和数据统计)

最后声明:

其实我是一个程序员,呵呵!

创新手机游戏《3L》开发点滴(1)——道具、物品、装备表设计的更多相关文章

  1. 创新手机游戏《3L》开发点滴(3)——道具、物品、装备表设计 V2(最终版)

    我们正在开发一款新手游,里面有道具,之前也写了一篇博文记录了下我们的设计思路,但是国庆到了,于是我有了时间继续纠结这个问题. 其实我主要是在到底是用mysql还是mongodb上纠结.这个复杂.痛苦. ...

  2. HBase概念学习(八)开发一个类twitter系统之表设计

    这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...

  3. Android——Cocosd2d-x手机游戏开发学习思路

    手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...

  4. android手机游戏开发Cocos2d-x开发分享

    我想现在应该没有人没有玩过手机游戏了吧,当然所有人都玩过,但不是所有人都知道怎么去开发手机游戏,因为许多人都感觉做开发是一件很困难的事儿,身边的朋友也对此感觉难度很大.但是,现在我可以告诉你,手机游戏 ...

  5. 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?

    如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...

  6. 斗牛app上架应用宝、牛牛手机游戏推广、百人牛牛app应用开发、棋牌游戏上传、手游APP优化

    联系QQ:305-710439斗牛app上架应用宝.牛牛手机游戏推广.百人牛牛app应用开发.棋牌游戏上传.手游APP优化 iOS开发iPhone/iPad平台安卓手机软件开发机型覆盖范围 超过113 ...

  7. Android安卓手机游戏开发

    成都传智播客Java培训,免费学Android安卓手机游戏开发,安卓android开发课程包括Android安卓应用开发和Android安卓游戏开发两个方向,可是偏向游戏开发. 依据"199 ...

  8. 手机游戏运营主要的指标是什么? 7天活跃, 14天活跃 ARPU ?如何提升游戏 app 的虚拟道具的收入?

    数据采集越细,手段越丰富,所获得的数据也就更加详实,虽然手机游戏没有网游那么复杂,但也需要数据化运营,而且是必要的,是优化游戏收入的关键,大家最主要关心的是下面三类数据的指标 1. 用户数量首先,在移 ...

  9. Unity3D手机游戏开发

    <Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...

随机推荐

  1. 08 Oracle表碎片查询以及整理(高水位线)

    Oracle表碎片查询以及整理(高水位线) 1.表碎片的来源 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用. 2.怎样确定是否有表碎片 ...

  2. ios之runtime

    简介 OC是从C语言发展过来的, 之所以能变为动态语言是因为runtime机制, runtime就是OC在运行时的一些机制: OC的runtime最重要的是消息机制. 在编译阶段,OC可以调用任意函数 ...

  3. Django的MVT的思路

    1.先上两张图片 2.我的理解 view在MVT框架里面,起到的是中间调度的作用. a.在diango里面有个关键性路径的配置 就是在django2.0前的url和在2.0后的path. 为避免一个项 ...

  4. laravel4.2 Redis 使用

    laravel4.2 Redis 使用 配置文件,app/config/database.php 'redis' => array( 'cluster' => false, 'defaul ...

  5. Hive(3)-meta store和hdfs详解,以及JDBC连接Hive

    一. Meta Store 使用mysql客户端登录hadoop100的mysql,可以看到库中多了一个metastore 现在尤其要关注这三个表 DBS表,存储的是Hive的数据库 TBLS表,存储 ...

  6. 【Hbase三】Java,python操作Hbase

    Java,python操作Hbase 操作Hbase python操作Hbase 安装Thrift之前所需准备 安装Thrift 产生针对Python的Hbase的API 启动Thrift服务 执行p ...

  7. scala 实现日期运算

    在scala程序中,有时我们需要对日期进行运算,比如一天之前,两天之前,一个月之前等等,本博文给出了简单的实现方式 val cal = Calendar.getInstance cal.add(Cal ...

  8. STM32(1)——使用Keil MDK以及标准外设库创建STM32工程

    转载来自:http://emouse.cnblogs.com 1.1 开发工具与开发环境 1. 软件版本 本节所使用Keil MDK 为目前的最新版V4.21.其他版本差别不大,读者可以根据自己使用的 ...

  9. Altium Designer常用快捷键

    一:Altium原理图快捷键:    Shift+左键选择    :实现多个目标选择    Ctrl+左键拖动    :保持连线拖动目标        Shift+c       :清除当前过滤(?? ...

  10. NUCLEO-L053R8 RCC时钟树 MCO输出

    RCC时钟配置实验 最近玩了一下Nucleo-L053R8板子,即STM32L053R8T6.浏览了RCC章节后,顺便做了个小实验,现在给大伙分享一下. 实验非常简单,配置一下系统时钟,可以通过肉眼观 ...