看了知乎上的一个话题“如何设计一个易扩展的游戏技能系统”,在浏览了各路大神的回复后不禁有些共(shou)鸣(yang)。客观的说这不是一门高深的技术,只是踩的坑多了,自然就填成了路。
全文根据经验整理自己在服务器端技能设计、功能拆分上的一些思路。
Read More →
看了知乎上的一个话题“如何设计一个易扩展的游戏技能系统”,在浏览了各路大神的回复后不禁有些共(shou)鸣(yang)。客观的说这不是一门高深的技术,只是踩的坑多了,自然就填成了路。
全文根据经验整理自己在服务器端技能设计、功能拆分上的一些思路。
Read More →
前些天在琢磨微信协程库(libco),对库里Hook Library Function相关内容比较感兴趣,自己寻找相关的资料手动实践了一遍,确实很有意思。
核心参考文档 – 点击这里
一般来说我们调用系统API过程是这样:
Program -> Library Function -> System Call
举个例子,如果我们遇见这样的需求:把项目中调用malloc和free的地方打印日志,用作系统调优或者其他。
会遇见2个难题:1、从libc中malloc、free实现处做修改,这样需要重新编译整个libc和项目;2、日志应该是程序级的,若实现了1,那么在该机器上其实使用libc的项目不是也被“修改”了。
所幸Hook技术一直存在,形如:
Program -> Hook -> Library Function -> System Call
这样我们可以在不修改libc源码的情况下满足需求,并且做到程序级的修改。或者比如像Libco一样,hook住socket相关的系统调用添加自己超时相关逻辑。
盛夏的七月,一款名为Pokemon-Go的游戏火了。基于LBS+AR玩法,使用的宠物小精灵的IP,让千万玩家穿梭于城市之间收集自己心爱的精灵,其核心功能之一便是模拟真实地图,让玩家“身临其境”的奔跑在地球上,那么地图功能是如何实现?
接着上文 – 让我们谈谈游戏服务器开发(上),我们继续谈。
从毕业至今,大约从事了4年的游戏服务器开发工作。其中页游2年,手游2年,端游虽然没有接触过实质的开发,但是同从事端游服务器开发朋友闲聊中也或多或少了解一些。想整理一些思路,沉淀成文字,以讨论页/手游服务器开发为主,端游为辅助。首先谈谈很有争议的开发语言选择吧。
一般来说,一款网页\手机游戏纯靠客户端来解决反作弊(Anti-Cheat)几乎是不可能的。在这种情形下,页游\手游客户端(后文均称游戏客户端)可以利用一些手段来增加作弊\破解人员的成本,包括但不限于:代码加密,代码混淆,隐藏明文,内存混淆(加密)……
这个方法主要是避免\检测出类似CE工具对客户端内存进行恶劣修改达到关键数据变更的行为,属于上面提到的内存混淆(加密)类。
本文建立在所有源码未被对方知晓的情况下进行操作……
AliasMethod是一个初始化复杂度为O(n),占用内存O(n),运行时复杂度为O(1)的算法。
核心文献:http://www.keithschwarz.com/darts-dice-coins/
本文部分文字来自上文翻译。
主要适用于伪随机环境下的同步计算:
场景一:服务端要校验客户端数据,服务端和客户端公用一个随机数种子,使每一步产生相同的随机数,服务端校验客户端产生的结果;
场景二:不同服务器环境下对于相同种子的伪随机同步;
场景三:…… Read More →
游戏服务器一般都会需要这样一种功能 – 在某个确定的时间点干某件特定的事情,例如:某个排行需要在每月第一天进行结算,某个比赛需要在下周六中午12:00准时通知服务器所有玩家比赛开始……当然,这种功能不局限于游戏服务器,其他类型服务器或多或少也有包含。我们称之这个功能为定时器功能或者定时器组件。
这里实现了一种用C++模板机制实现的秒级(比较容易改写成毫秒级)定时器,核心算法使用的是时间轮(Timing-Wheel),辅助数据结构使用的是侵入式链表(Intrusive-List)。首先简单介绍一些基本概念。