- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PHP游戏开发实践
DEVLINK⼤会
PHP游戏开发
1、傲慢与偏见
▸ 偏见的产生
历史 端游 - 页游 -手游
印象 运营后台、官网等边缘业务
▸ 实际的案例
社交类 开心农场、超级店长 页游类 猛将无双、女神联盟 手游类 大掌门、城市精灵
▸ 性价比
招人 相对容易
优点 快速迭代,热更新 对比 1php vs 3~4客户端
PHP游戏开发
适合什么类型的游戏?
▸ 页游到手游
大部分页游和手游都适合
▸ 游戏类型
社交、卡牌、slg、rpg等
PHP游戏开发
与WEB开发的差异
▸ 单机极致
web的无状态演变出很成熟的横向扩展能力 游戏更考验单机能力的最大化
▸ 缓存不易
web可以做各种数据静态化处理 游戏基本是动态请求处理
▸ 读写比例
web读写比例较大
游戏基本每个请求基本都有数据的读写
PHP游戏开发
百万级DAU游戏的开发经验
▸ 配置极致的缓存 之 三级火箭
进程内的缓存 本机共享内存 分布式共享内存
▸ 配置优化很重要
配置代表数值,游戏的基石之—
PHP游戏开发
▸ 代码片断
public function getByCache($cacheKey) {
▸
▸
▸
//进程内的缓存
if (!empty(self::$readCache[$cacheKey])) { return self::$readCache[$cacheKey];
}
//本地缓存 if(!empty($localCache)) {
self::$readCache[$cacheKey] = $localCache-get($cacheKey);
}
//网络缓存 if(!empty($netCache)) {
self::$readCache[$cacheKey] = $netCache-get($cacheKey);
$localCache-set($cacheKey, self::$readCache[$cacheKey]);
}
PHP游戏开发
⼀些坑
▸ 缓存单条数据,而不是整张表
—个大数组的反序列化的开销非常大
▸ Yac 有概率取到错误数据
不是取不到数据,而是错误数据
▸ 如何更新
flush共享内存
配置文件用redis不同的库 (selectDb)
PHP游戏开发
游戏数据的特点
▸ 数据量小
▸ 快
▸ 数据相对独立
PHP游戏开发
选⽤REDIS
▸ Hash结构非常适合游戏的用户数据结构
—个用户的数据是—个hash,如
userid_111 : {
info: {}, bag:{}, item:{}….
}
▸ 性能彪悍、可持久化
▸ 结构非常多,zsort做排行,key-value做cache等
PHP游戏开发
REDIS的问题
▸ 内存的需求无限增长
▸ 不合适做gm数据查询
⼀些解决⽅案
▸ 改造redis: redis-storage
▸ 后台直接读取leveldb
PHP游戏开发
5MS级别的业务请求处理时间
▸ 天下武功,唯快不破
▸ 不论业务的复杂度如何
▸ —个api请求,只—次读取数据,—次写入数据
PHP游戏开发
▸ 执行流程
PHP游戏开发
好处
▸ 非常快,基本可以达到5ms~10ms的处理时间要求
▸ 不产生脏数据,在业务逻辑任何—步处理失败
都可以很安全的抛出异常,不会写入任何数据到db
▸ 业务逻辑简单,清析,不产生瓶颈
PHP游戏开发
安全很重要
▸ 请求防伪造
数据加密
▸ 请求防并发
把并行请求变成并行请求
1)同—用户
2)每个请求到达之后,第—步先获取—个请求锁,处理完成之 后再释放锁 (可以用redis的setnx机制)
PHP游戏开发
⼀般外挂的处理
▸ 同—ip请求密度监控
不可靠(同—局域网)
▸ 同—用户的请求密度监控
不可靠 (人工的疯狂点击也应该存在)
▸ 同—用户每天的行为阔值监控
可靠 (每天的产出是固定的)
▸ 社会工程学
外挂有—定的规律性
PHP游戏开发
⼀些⼩经验
▸ 和策划的配置的配合
1) 配置的规律化
2)配置的自动化
PHP游戏开发
配置的规律化
▸ ID的规律化
举个例子
技能Id = 技能类别 + 等级
600101 = 600100 + 1
好处 通过id就可以获得很多有用的信息,不需要反查表
▸ 奖励规律化
[[奖励类型,奖励标识, 奖励数量]]
举个例子
[[1, 2, 200]] 表示 获得声望 金币 200个 随机奖励
[[4, [[1,2,200]: 30, “”: 70]]] //表示[1,1,200] 30%的概率获得
▸ 条件规律化
[[条件类型, 条件id, min, max]]
举个例子
[[1,1, 20, 999]] //表示等级达到20级才能操作
PHP游戏开发
配置的⾃动化
文档评论(0)