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

为了让游戏更加的丰富,我们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. L2-001 紧急救援(dijkstra算法)

    题目: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市 ...

  2. PHP运行原理之Opcodes

    在我之前的博客<Laravel5框架性能优化技巧>中提到开启OPcache可以提升php性能.那么为什么开启OPcache就可以提升php运行性能呢?这里就要提到php的运行原理了--Op ...

  3. 引入类型struct(结构),提高代码的逻辑性和可读性

    创建一个新类型(struct, 即 结构)SComplex 来表示复数,提高了代码的逻辑性和可读性,代码更加的简洁. #include "stdafx.h" #include &q ...

  4. 帝国CMS如何禁止内容关键字替换ALT和title中的关键词为链接

    很多帝国cms用户喜欢使用关键字替换来实现文章自动内链的方法. 为什么要用关键词替换功能呢?这关系到站内优化,下面直接进入正题. 解决办法:打开e/class/functions.php 查找 '/' ...

  5. day 18 类与类之间的关系

    类与类之间的关系     在我们的世界中事物和事物之间总会有一些联系.    在面向对象中,类和类之间也可以产生相关的关系 1.依赖关系     执行某个动作的时候. 需要xxx来帮助你完成这个操作, ...

  6. 定义一个大数组时,出现错误,程序进入HardFault_Handler中断

    在原子的串口程序前加了几个数组定义,加了个对数组处理的函数,出现了HardFault_Handler的错误,不知道怎么解决!!! 因为局部变量是存放在栈区的,而全局变量在全局区(静态区),如果栈区较小 ...

  7. python--模块之基本

    模块的概念: 在计算机程序开发过程中,随着程序代码越来越多,在一个文件里代码就会越来越长,不利于维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样每个文件包含的代码就相对较少. ...

  8. elk6.3.2在线安装中文分词工具IK

    1.进入ES目录并执行安装(注意版本号改成你需要的版本) cd /usr/share/elasticsearch ./bin/elasticsearch-plugin install https:// ...

  9. JavaScript’s “this”: how it works, where it can trip you up

    JavaScript’s “this”: how it works, where it can trip you up http://speakingjs.com/es5/ch23.html#_ind ...

  10. 理解C指针: 一个内存地址对应着一个值

    一个内存地址存着一个对应的值,这是比较容易理解的. 如果程序员必须清楚地知道某块内存存着什么内容和某个内容存在哪个内存地址里了,那他们的负担可想而知.    汇编语法对“一个内存地址存着一个对应的数” ...