创新手机游戏《3L》开发点滴(3)——道具、物品、装备表设计 V2(最终版)
我们正在开发一款新手游,里面有道具,之前也写了一篇博文记录了下我们的设计思路,但是国庆到了,于是我有了时间继续纠结这个问题。
其实我主要是在到底是用mysql还是mongodb上纠结。这个复杂、痛苦、找虐的挣扎过程就不说了,最终我选择了mysql(可能我还是比较保守吧, ^-^)。
现在将我们最终方案记录下来备忘。
一、道具buff存储、使用
所有buff都以如下类似键值对的方式拼接成字符串后存于mysql数据库:
atk+30;def-20;hp+30- 某条原始道具数据会在redis里缓存(具体见下文)
- 属性分拆缓存:将buff数据解析成为map后在redis里以hashmap 形式再存一份,键名为itemid-buff
- 最终buff消费者都是从redis里读取:
- 后台需要buff进行计算的,如战斗、装备升级等,直接读取 属性分拆缓存
- 不需要对具体属性值进行处理的,如直接发送到前端的,如存入数据库,读取原始属性(buff字符串)
在运营中可能需要对属性进行一些分析、查询,而现有的方案buff都是以字符串形式存储,用 like '%***%' 查询,从性能上显然是不允许的。于是我们想到了一个“空间换时间”的方法——对常用的buff值进行单独建表索引,如:
atk+30;def-20;hp+30create table index-goods-buff-atk (good-id bigint,val int , primary key (good-id,val), index (val))
create table index-goods-buff-def (good-id bigint,val int , primary key (good-id,val), index (val))
create table index-goods-buff-hp (good-id bigint,val int , primary key (good-id,val), index (val))
*在增加、修改相关属性时,增加、修改属性索引表数据
二、道具数据处理流程
所有数据访问都封装在model层。
- 在程序的model层里定义公共函数GetDb(playerid,areaid),用于物品数据及其它需要进行按用户水平分割的数据获取数据库(连接)
- 每一个物品的主键id 由 函数根据自定义规则(这个修改了v1.0里的方式) 生成,确保表内唯一
- 将装备buff及某道具特有属性统一以键值对字符串形式保存在一个varchar字段里
- 道具表定义 失效时间 字段,这个字段同时表示道具有效期的三种情况:
- =0 ,表示是不限时的永久性道具
- 小于等于600000,表示有效时间段,如双倍经验卡有效时长3小时,那么着个字段值为 180 (分钟),使用此道具时,用当前时间加上这个字段值得到失效时间戳修改此字段或做其他处理
- 大于600000,表示该道具的失效时间戳(unix时间戳格式)
玩家道具数据查询流程:
- 首先检查redis里有没有
- 如果有,返回
- 如果没有从数据库里查询
- 调用 属性分拆缓存 , 并存到redis
- 返回
修改/或增加道具数据流程:
- 首先检查redis里有没有
- 如果没有,从数据库里查询并存到redis
- 如果有,继续
- 修改/增加redis数据,如果buff字段有修改,则调用 属性分拆缓存 处理
- 同时在key为“item-update-list”的redis list 数据里记录下该道具的主键
- 定时根据“item-update-List”数据写回mysql,并清除“item-update-list”
删除一个道具数据流程:
- 在redis 里key为“item-delete-list” 的redis list 数据里记录下该道具的主键
- 删除redis里记录
- 删除 属性分拆缓存
- 定时根据item-delete-list”数据删除mysql里记录,并清除“item-delete-list”
注意:
- 配置redis 为 在每次更新操作后进行日志记录
- 缓存定时同步mysql处理程序可以作为一个独立的进程运行
- 这个解决方案可以针对其它用户私有数据,如技能、buff。
//
//每次开发一款新的游戏都是一个新的开始、新的征程、新的挑战,我们一直在路上!
//创新手机游戏《3L》开发点滴
//
创新手机游戏《3L》开发点滴(3)——道具、物品、装备表设计 V2(最终版)的更多相关文章
- 创新手机游戏《3L》开发点滴(1)——道具、物品、装备表设计
一.游戏物品/道具系统数据模型设计特点 为了让游戏更加的丰富,我们1201团队的新手机游戏设计了道具系统.于是丰富了游戏.取悦了玩家,哭了开发——道具/物品数据子系统是简单的.复杂的.不确定的: 简单 ...
- HBase概念学习(八)开发一个类twitter系统之表设计
这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...
- Android——Cocosd2d-x手机游戏开发学习思路
手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...
- android手机游戏开发Cocos2d-x开发分享
我想现在应该没有人没有玩过手机游戏了吧,当然所有人都玩过,但不是所有人都知道怎么去开发手机游戏,因为许多人都感觉做开发是一件很困难的事儿,身边的朋友也对此感觉难度很大.但是,现在我可以告诉你,手机游戏 ...
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?
如题! 首先说一说学习手机游戏(移动游戏)这件事. 眼下移动互联网行业的在以井喷状态发展.全球几十亿人都持有智能终端设备(ios android),造就了非常多移动互联网创业机会: 一.移动社交 微信 ...
- 斗牛app上架应用宝、牛牛手机游戏推广、百人牛牛app应用开发、棋牌游戏上传、手游APP优化
联系QQ:305-710439斗牛app上架应用宝.牛牛手机游戏推广.百人牛牛app应用开发.棋牌游戏上传.手游APP优化 iOS开发iPhone/iPad平台安卓手机软件开发机型覆盖范围 超过113 ...
- Android安卓手机游戏开发
成都传智播客Java培训,免费学Android安卓手机游戏开发,安卓android开发课程包括Android安卓应用开发和Android安卓游戏开发两个方向,可是偏向游戏开发. 依据"199 ...
- 手机游戏运营主要的指标是什么? 7天活跃, 14天活跃 ARPU ?如何提升游戏 app 的虚拟道具的收入?
数据采集越细,手段越丰富,所获得的数据也就更加详实,虽然手机游戏没有网游那么复杂,但也需要数据化运营,而且是必要的,是优化游戏收入的关键,大家最主要关心的是下面三类数据的指标 1. 用户数量首先,在移 ...
- Unity3D手机游戏开发
<Unity3D手机游戏开发> 基本信息 作者: 金玺曾 出版社:清华大学出版社 ISBN:9787302325550 上架时间:2013-8-7 出版日期:2013 年8月 开本:16开 ...
随机推荐
- MyBatis-Plus工具快速入门使用
MyBatis-plus有什么特色 1.代码生成 2.条件构造器 对我而言,主要的目的是使用它强大的条件构建器. 快速使用步骤: 1.添加pom文件依赖 <dependency> < ...
- iOS之利用runtime,避免可变数组和可变字典为nil或者数组越界导致的崩溃
NSArray.NSMutableArray.NSDictionary.NSMutableDictionary.是我们的在iOS开发中非常常用的类.当然,在享受这些类的便利的同时,它们也给我们带来一些 ...
- (Nagios)-check_openmanage[Dell]
Nagios->check_openmanage[Dell R7*] 2014年11月13日 下午 07:44 需求介绍: 透过Nagios监控Dell R7系列服务器硬件状态 环境信息: ...
- 爬虫——Scrapy框架案例二:阳光问政平台
阳光热线问政平台 URL地址:http://wz.sun0769.com/index.php/question/questionType?type=4&page= 爬取字段:帖子的编号.投诉类 ...
- CAT 安装运行配置教程
CAT安装教程 首先安装mysql数据库,具体步骤参阅<mysql免安装教程>--http://www.cnblogs.com/halberts/p/8723938.html 下载CAT代 ...
- python学习第一天 -----2019年4月15日
第一周-第06章节-Python3.5-第一个python程序 #!/usr/bin/env python #-*- coding:utf-8 _*- """ @auth ...
- go字符串操作
在Go语言标准库中的strings和strconv两个包可以对字符串做快速处理 string包 func Contains(s, substr string) bool 字符串s中是否包含substr ...
- git改密码出现授权问题
git修改密码后显示Authentication failed for …… ,意思就是电脑修改密码后导致和git账户密码不匹配 解决方法:
- Java设计模式(21)——行为模式之备忘录模式(Memento)
一.概述 概念 UML简图 角色 根据下图得到角色 备忘录角色(Memento).发起人角色(Originator).负责人角色(Caretaker) 二.实践 使用白箱实现,给出角色的代码: 发起人 ...
- Java设计模式(12)——结构型模式之门面模式(Facade)
一.概述 概念 简要示意图(没有一个统一的UML图) 角色 门面角色:门面模式核心,它被客户端调用,并且熟悉子系统 子系统角色:子系统,子系统并不知道门面的存在,门面对它来说只不过是另外一个客户端 ...