• 1. Erlang游戏开发分享Litaocheng 2012.03.06
  • 2. 简单 让整个产品变得简单 界面简单 接口简单 实现简单
  • 3. 心中的好代码 架构简单清晰,满足需求 大部分代码平铺直叙,但拒绝 拷贝-粘贴 小部分代码略微精妙,主要是为了性能 一个运营的ARPG游戏包含10万行Erlang代码
  • 4. 通用 配置:xml, json, 自定义 数据库:mysql, mongodb, mnesia, redis 服务接口:HTTP API,基于TCP自定义API 静态资源:nginx,apache 操作系统:centos, ubuntu, windows 不通用 = 孤独无助
  • 5. OTP application supervisor gen_server gen_fsm sasl 不使用OTP的人: 重复造轮子的人 会被不稳定的代码困扰的人
  • 6. 模块(module)模块是封装代码的基本方法 模块名带有前缀: map_xxx, world_xxx, gateway_xxx 自己的秘密不要让别人知道: stdlib/src/sets.erl: sets:new() -> Empty = mk_seg(?seg_size), #set{empty = Empty, segs = {Empty}}. player_internal.erl: inc_hp(#player{hp = Cur, hp_full = Full} = Player, N) -> Player#player{hp = erlang:min(Cur + N, Full)}.
  • 7. 模块(module) – 继续不要让消息满天飞: DO NOT (a.erl) PidB ! {stop, Reason} (b.erl) handle_info({stop, Reason}, State) -> … DO (a.erl) b:notify_stop(Reason) (b.erl) notify_stop(Reason) -> gen_server:cast(?SERVER, {stop, Reason}). handle_info({stop, Reason}, State) -> …
  • 8. 宏(Macro)宏也可以让代码更清晰,更容易发现错误 DO NOT case Color of l -> …; 2 -> …. end DO -define(COLOR_WHITE, 1). // 白 -define(COLOR_GREEN, 2). // 绿 case Color of ?COLOR_WHTIE -> …; ?COLOR_GREEN -> … end
  • 9. 数据的存储进程字典gen_server, gen_fsm状态etsmnesiamysql应用范围速度便利性
  • 10. 数据结构lists 最常用,100左右元素增删改效率很好 tuple 固定数目元素集合 sets 不重复的数据集合 dict key-value数据结构 ets 支持set, ordered_set, bag, duplicate_bag等类型
  • 11. 广播优化 数据包合并,减少系统调用 广播的消息首先编码,随后发送给广播进程广播 减少广播量,如精简字段,防止重复广播
  • 12. 数据库 备份!每隔N小时本机备份,每天远程备份 游戏逻辑大部分内存操作(充值,极品武器除外) 数据库操作逻辑合并 add + delete = nothing 是否需要统一的数据层? 极端的做法:上线加载数据,离线保存数据
  • 13. 编译加快编译速度,禁止任何警告 make clean && time make 单文件编译脚本
  • 14. 自动化 协议自动生成 配置自动生成 编译,发布脚本
  • 15. 热更新代码热更新 每个moudule有new,old两个版本 只有Module:Fun(…)才会调用新版本代码 不要强制code:purge,防止某些进程被kill (code_server.erl do_purge函数) 数据热更新 系统数据放置于ets中:清空数据,重新导入 (可能出现访问不到系统数据,可能出错) 系统数据编译成beam中:重新编译,重新加载代码(两个版本代码,比较稳妥)
  • 16. 除错 SASL 导出更多的i接口,如player_server:i/1, map_mon:i/0 动态调整日志等级 玩家网络包追踪(抓包或者代码实现)
  • 17. 优化 根据数据来优化 有优化基准,能够衡量优化的结果 使用fprof, eprof 开发压测机器人 使用wireshark统计网络通信量 CPU, 内存还是IO? 尝试inline, HIPE, smp
  • 18. 稳定 简单才会稳定 OTP是经验的积累 cpu,内存,disk监控 os_mon sasl alarm_handler 节点监控erlang:monitor_node 内部运行状态监控erlang:system_monitor
  • 19. 其它一些东西 user_default,自动导入record 限制性shell保证不会误q() 强大的escript
  • 20. 更多的要求 熟悉TCP,HTTP 熟悉linux 掌握一个好的编辑器 会写一些Bash脚本
  • 21. 谢谢各位!