Category: 技术杂谈

2018年小游戏开发总结

这其实是一篇个人的2018年度总结。

整个2018年我基本都投身到小游戏的开发制作当中,游戏先后上线了微信小游戏QQ空间小游戏,同时预开发了厘米游戏版本。所以这篇总结我会站在开发的角度谈一谈在这三个平台开发的经验,以及趟过的坑。

上述的三个平台分别对应微信平台,QQ空间平台,手Q平台,对于详细介绍这里就不累述了,相信网上的很多文章肯定比我介绍的好。

Read More →

libcurl内存泄漏排查

由于一些第三方平台/服务的API都升级成了Https,导致原来Tars自带的Http库无法直接使用了,于是引进了libcurlgithub地址)。

但是发现在对应模块长时间运行后,其占用内存一直稳定上升,存在内存泄漏。首先排除掉一些不太可能的泄漏点:Tars、std::string、std::map、std::vector常规使用,无显式的new/malloc。

那么只剩下模块引入的动态库libcurl了,而程序实现严格按照libcurl按照官方文档的样例做法:

  1. 在主线程curl_global_init;
  2. 业务线程每次进行业务处理时调用curl_easy_init获得新的CURL,设置好选项后调用curl_easy_perform;
  3. 业务处理完毕后调用curl_easy_cleanup,curl_slist_free_all(如果有用到curl_slist)释放资源;
  4. 如果主线程退出调用curl_global_cleanup释放资源;

开始一度以为是libcurl用法有问题,后来用valgrind跑程序发现是libcurl真有泄漏,github上1W+Star的开源库有泄漏,这是什么操作?

Read More →

[译文]OpenAI Five

原文链接  –  OpenAI Five

我们由五位神经元网络组成的队伍,OpenAI Five,已经开始在DOTA2中击败非职业队伍。虽然现在还有一些约束(译者注:功能不完善,文末有说明),我们的目标是在8月的TI8比赛上使用限定的英雄池击败最顶级的职业队伍。我们可能不会成功:因为DOTA2是现在世界上最流行、最复杂的电子竞技之一,拥有着富有创造力和积极态度的职业选手,他们一整年的进行训练为了在DOTA每年近四千万刀的奖金池里分一杯羹(世界上奖金池最高的电子竞技)。

OpenAI Five每天通过自我对抗的训练数据等值于正常游戏时间180年。训练使用大规模版本的Proximal Policy Optimization,运行在256个GPU和128000个CPU核心上 – 相当于去年TI7上AI Solo比赛使用的大规模版本。他对每个英雄配置非人类玩家数据,通过LSTM学习到了非常明显的游戏策略。这表明了强化学习通过大量且能完成的计算量可以实现长期训练 – 并不需要对训练、学习算法有突破进展,这和我们在开始这个项目时的估计相反。

为了测试我们的进展,我们会在2018年7月28号与顶尖玩家举行一场比赛,你可以在Twitch上在线观看或者申请成为挑战者。

Read More →

12306购票流程全解析

顺利的用自制程序抢到回家的火车票,也不枉费我这两周从一个服务器端程序员伪装成客户端程序员利用Chrome DevTools一段一段的挖12306的协议,同时满足了我今年的一个小心愿 – 自制12306程序并且可以实现简单刷票功能。%e8%bd%a6%e7%a5%a8

代码编写的核心使用了 PHP – Client URL Library(Curl)

未研究验证码自动识别,言外之意就是说在Login时需要手动点击验证码,在购票时也需要手动点击输入;

理论上来说这里没有使用什么黑科技(验证码自动识别之类的),只是简化了购票流程;

文章最后更新与2017-01-04,因为12306协议变动比较频繁,若未来协议流程无法与本文对应,请见谅(会尽力保证更新,同时更新日期)。

Read More →

Pokemon-Go地图技术猜想

pokermon-go盛夏的七月,一款名为Pokemon-Go的游戏火了。基于LBS+AR玩法,使用的宠物小精灵的IP,让千万玩家穿梭于城市之间收集自己心爱的精灵,其核心功能之一便是模拟真实地图,让玩家“身临其境”的奔跑在地球上,那么地图功能是如何实现?

Read More →

Anti-Cheat – 实现一种检查内存被修改的方法

这个Anti-Cheat方法为了解决什么问题?

一般来说,一款网页\手机游戏纯靠客户端来解决反作弊(Anti-Cheat)几乎是不可能的。在这种情形下,页游\手游客户端(后文均称游戏客户端)可以利用一些手段来增加作弊\破解人员的成本,包括但不限于:代码加密,代码混淆,隐藏明文,内存混淆(加密)……

这个方法主要是避免\检测出类似CE工具对客户端内存进行恶劣修改达到关键数据变更的行为,属于上面提到的内存混淆(加密)类。

本文建立在所有源码未被对方知晓的情况下进行操作……

Read More →