固定链接

苹果支付最佳实践

iap

游戏主体开发完成后,登录和支付成为后期的工作重点,眼花缭乱的渠道,和多如牛毛的设备,不同的网络环境,始终是一个挑战。这里主要讲讲苹果游戏内支付中的一些问题和实现的一些细节。

游戏订单

游戏的订单管理方面,都会设计一个订单系统,用来管理和实现所有的支付过程,订单号是唯一的识别码。国内大部分的渠道,都允许在支付请求的时候,发送游戏自己的订单号过去,支付回调时,渠道会把这个订单号传回给游戏自己,这是最简单和有效的对应处理关系,因为先下的订单,并不总是先回来的。

游戏订单和支付凭证的对应

苹果支付api并不提供额外的字段,可以允许第三方在请求支付时传递游戏自己的订单号过去。感觉就是设计上的不人道,也可能带来潜在的订单错乱的情况。在支付之前,需要把游戏自己的订单号保存起来,这样在支付继续的过程中,才能够对应起来。不过这实际上也只能处理最新的那个。
需要处理如下情况: 玩家点击支付,这时候游戏被关闭(比如接电话,比如主动关闭)等情况发生,但是支付的过程依然进行(因为支付是全局的),苹果询问玩家是否需要完成支付,玩家完成了支付的过程。玩家再次打开游戏,如果之前的游戏的订单号没有保存,你就是去了这个对应关系,导致丢单。
这个情况的有效处理是:
  1. 发起订单,必须完成这个订单后,才能进行下一个订单的处理
  2. 在发起支付前,保存当前的订单号(persist的方式有很多种,这里不做讨论), 支付完成后,用这个订单号和支付凭证提交给游戏服务器完成道具的发放等。

支付凭证获取

按照苹果文档的提示,SKPaymentTransaction#transactionReceipt 在 iOS7 之后就不推荐使用了。不过直到今天,iOS9正式版本了一个礼拜,这个字段还可以继续使用。cocos2dx-lua 在3.3的版本前,基本都还在使用这个字段。苹果出于更安全的考虑,使用了新的方式。

 

 

完成支付后,苹果会把支付凭证写到这个方法对应的文件上去,可能会有延迟,需要自己去做刷新。这个凭证和 SKPaymentTransaction#transactionReceipt 得到的是不一样的内容。大家可以参考 objc.io 的一期文章来了解其中的细节。

游戏起来时,检查没有完成的订单

按照 苹果支付最佳实现,游戏在启动时,应该去处理没有完成的订单。这样,在游戏的其他地方,就不要再去添加TransactionObserver了。

 

 失败重试

重试可以大大减少因为网络不稳定或者服务器暂时不可访问时导致的丢单。失败重试并不是 AFNetwork 自带的特性,但是自已实现并不复杂。


在上述的代码中,我们将支付的验证放到了服务端,等服务端验证完成后,游戏服务器会完成订单,发放订单的道具到游戏账户。

更好的错误提醒

windows-10-something-happened-error游戏需要更好的处理错误情况,用最有效的提醒告知玩家当前的问题,不管玩家是否是在作弊。并且需要给出玩家可以采取的处理方法。有意义的消息也可以帮助客服有效的定位问题,高效的处理游戏运营中的各种问题。

下面是个简单的例子。


 

固定链接

360 登录验证失败抓虫记

broken-https

第一款游戏上线之后,陆续发现了一些诡异的问题。其中一个是通过 360 SDK 登录的用户在进行服务端验证的时候,游戏服务器发往 360 服务器的 HTTP 请求偶尔会出现没有收到任何回应就返回,也不报错的情况。更怪异的是当尝试手动发送请求的时候,却无法重现,即使是用脚本模拟不停的发送请求。后来陆续发现其它一些渠道,像豌豆荚也出现类似情况。

经过差不多一天的研究和分析,最终发现是这些登录验证服务提供的是 HTTPS 接口,但是可能服务器版本比较老,并没有正确实现 HTTPS 协议中的一些标准。而我们使用的客户端 typhoeus 做了非常多的性能优化,其中对 HTTPS 的一项优化最终导致了 TLS 握手失败,客户端没有收到任何回应就返回了。

继续阅读 →

固定链接

序列帧动画的优化

6597894400379052940

序列帧动画是2D游戏中常用的动画方案,原理就是交替呈现不同的图像,利用人眼的视觉残留天赋形成动画的感觉。如图

序列帧动画

这是一个简单的跑步动作,共有四帧,来回循环按一定帧率依次替换播放,就可以呈现奔跑的动作,如果程序再给图片加上位移,那就是一个完美的跑动了。

序列帧的好处有很多,制作简单,控制简单,效果比较直观,观看也比较方便,运行时不怎么占CPU。

它的坏处也有不少,要做的精细的话,图量必然很多,对于包体容量有负担,加载的时候也会大大增加内存的使用,让系统不堪重负。典型的拿空间换时间的做法。

比如固定128*128大小的人物动作,想要表现的完美,必须制作时就达到一定的帧率,30fps不算高,如果是一秒的动画,那就有30张图!先不算硬盘占用,图片加载后不管是什么格式,都是以一个像素32位即4个字节展开在内存中的,所以可以算一算占用内存,哦天哪,一个动作就有128*128*30*4 = 1.92MB 这么大!一个人物至少有五六个动作,如果是2.5D的那就有八方向,就算其中两个方向用其它方向水平镜像替换,也有5个动作,那内存占用就是1.92*5*5!一个人物要耗费将近50MB内存!假设我们做的是一个5V5的MOBA游戏,那光人物动作就要耗去500MB内存!还没算上特效场景!

当然现实中其实也没这么可怕,序列帧动画的优化空间还是挺大的,不然大家都不要做游戏了,接下来根据我的经验粗浅的谈一些经验。磁盘空间的优化没什么好讲的,除了无损压缩就是有损压缩,我主要讲讲内存上的优化技巧。 继续阅读 →

固定链接

近期开放职位 – 美术类 – 主美

工作职责:

  1. 负责游戏整体美术风格设定把控,对游戏的视觉表现负责;
  2. 配合策划完成美术设定,安排美术工作的进度、把控质量;
  3. 协调项目组美术、程序与策划部门之间的沟通,实现项目开发的目标;
  4. 负责项目组的美术人力资源调配和培养;
  5. 参与部门美术规范和标准的制定;

任职资格:

  1. 从业经历要求:5年及以上资深游戏美术经验,2年以上手机游戏主美工作经验,参与过多款完整的游戏项目开发,
  2. 有丰富的创作实践经验和深厚的游戏美术功底,能把握项目重点,提升视觉效果表现力;
  3. 具有良好的游戏设计素养,熟悉游戏美术开发的各个环节及流程;
  4. 具有丰富的原画与UI设计能力,熟悉GUI设计原则与技巧;
  5. 熟练掌握动画运动规律,有逐帧动画、骨骼动画、切片动画经验;
  6. 对游戏特效独特的理解力和想象力;
  7. 一定的管理能力和培训能力;

素质要求:

  1. 热爱游戏及相关艺术形式;
  2. 优秀的美术欣赏水平及对美术的鉴赏能力;
  3. 丰富的想象力,涉猎广泛;
  4. 能够承受压力、承担责任、良好的合作能力和领导能力;
发送简历请附上作品集。投至 hr@3pjgames.com. 待遇从优 15-30k 一个月。
固定链接

Unity git hooks

Unity 项目可以使用 Git 管理,但是 Assets 下自动产生的 meta 文件会经常造成合并冲突。

常用的场景是 A 提交了某个文件,但忘了在 Unity 里刷新资源并提交相应的 meta 文件。B 拉下最新的代码,打开 Unity 发现 meta 没提交就顺手一起提交了。这个时候 A 也发现 meta 文件没提交,当 A 提交的时候就会产生冲突了。

另外 Unity 会为文件夹产生 meta,而 Git 是不跟踪文件夹,也会经常导致冲突。

好在 Git 支持 hooks,可以自动进行检查。我们使用的 hooks 已经分享在 Github 3pjgames/unity-git-hooks。只需要将其中的 scripts 文件夹放到 Unity 项目的 git 顶层目录中运行

不过如果项目中已经用到了 hooks, 请备份已有的 hooks,然后手动合并 scripts 文件夹下的  post-checkout, post-merge, pre-commit

这些 hooks 会在切换 branch 后,合并(包括 pull)之后进行 Assets 目录下的空文件夹的清理,以免 Unity 产生 meta 文件显示在 Git 中。

在提交之前进行 meta 文件的检查,如果发现不同步,会显示错误消息,并阻止提交:

  • 如果 Assets 下新加了的一个文件,它的 meta 文件,包括包含这个文件的各级文件夹对应的 meta 文件都必须在 Git 中。
  • 如果 Assets 删除了一个文件,它的 meta 文件,包括因为删除该文件后在目录树下不包含任何文件的空目录的 meta 文件也必须删除。
固定链接

招聘 – 游戏运维工程师

 工作内容

  • 游戏后台运维,包括配置,部署,监控等。
  • 分布式系统管理
  • 后台数据管理工具开发,导入,导出,备份等。
  • 游戏更新资源管理

职位要求

  • 了解基本网络协议 TCP/IP, DNS 等
  • Linux 系统管理,精通 shell
  • 至少会一种高级脚本语言:ruby, perl, python 等
  • 熟悉后台服务的基本的性能指标
  • 积极,乐观,细心,协调沟通能力强

加分项

  • 使用过 ​ansible 等自动配置工具
  • 研究过 docker
  • 使用或者开发过自动部署工具
  • 使用或者开发过监控工具
  • 配置过开视化监控

公司福利

  • 交通餐饮补贴:
  • 有竞争力的薪水
  • 充足的硬件设备 游戏设备
  • 项目奖金,接近于6-10个月工资
  • 空气净化器
  • 五险一金
  • 免费水果 下午茶
  • 免费体检
  • 各种红包
  • 团队活动等等

各位英雄,简历请投至hr@3pjgames.com。

固定链接

使用 Git 管理 Unity 项目

Unity 官方提供的版本管理的方案是 Unity Server。优点是和 IDE 集成好,缺点是需要收费并自己架设服务器。好在 Unity 新版本中可以把所有资源和元数据 (meta data) 保存成纯文本,如果企业内部已经在使用 Git 或者类似的源代码版本控制工具,可以很方便的集成。唯一麻烦的是需要在 Unity 里保存后,再用 Git 进行提交。有新的更改后也需要刷新 Unity 项目。

下面是手动设置的步骤,也可以直接 clone Github 上的模板项目

继续阅读 →