October 27, 2014

文明太空的评测

Sid Meier's Civilization: Beyond Earth ,中文社区翻译成 文明 太空。这个周末全部耗在这个游戏里了,steam 统计有 35 小时的记录时间。

鉴于 steam 上全是差评,而我觉得游戏还不错,值得一玩。所以动手写了篇好评,拉高评价吧。

steam 上评测链接在此 ,觉得有用点个赞 :) 。

阅读全文 "文明太空的评测" »

October 23, 2014

GDC China 2014

上周末去上海参加了 GDC China ,没有演讲,被邀请是因为要给 IGF 颁奖。对会议没有什么期待,所以有所收获也是超出期望的。

在国内做商业化游戏这么多年,身不由己去为许多并不喜欢的游戏元素花心思,对纯粹的游戏制作还是很向往的。希望在公司有稳定的收入之后, 可以能专心考虑为核心向玩家多做一点东西吧,至少不用整天想怎么伺候好大 R 。不用想这个玩法是不是太复杂了,没有多少人会接受,接受后也多花不了几块钱。 多花一点精力在如何让玩家在游戏过程中更多的感受到游戏带给他的乐趣上。

IGF 的颁奖晚会挺让人激动的。在拆开信封之前,我也不知道里面写的是哪款游戏。很遗憾我所喜爱的 Sumoman 没能获奖。据说它获得了许多评委的提名,但由于提名过于分散在不同的奖项上,最终一个奖都没有拿到。 原本我觉得至少得个最佳音乐音效奖的。如果你能观看 youtube 的视频,可以看看这款游戏 的制作花絮。

僵尸别动队 获得最佳移动游戏奖有点小意外,相信对开发团队也是个意外之喜。主创陶文在讲台上都激动的语无伦次了,用中文英文日文各表达了一次自己对游戏的热爱。 我能深深体会他们制作独立游戏的不易,能把项目完成经历了太多磨难。希望这次的奖项能给他们带来点好运气。

阅读全文 "GDC China 2014" »

October 09, 2014

skynet 服务的过载保护

最近我们的新游戏《天天来战》上了腾讯平台,由于瞬间用户量过大,发现了几个 bug。

这几个 bug 都是在最后一周赶进度时编写业务的同学写的太仓促,在一些处理请求的流水线上使用了时间复杂度 O(n) 以上的算法导致的问题。这些时间开销大的操作,虽然并不常见,但操作误放在了和用户登录相关的服务中,导致一旦阻塞,使得用户登录受到影响。

具体 bug 没什么好谈的,把业务拆分开,以及用 O(Log N) 或 O(1) 的算法重新实现后就好了。但发生 bug 后,skynet 的整体表现值得一提。

按原有的设计,skynet 可以视为一个简单的操作系统。每个服务都是这个系统中的进程。不相关的业务应该互不干扰(使用多核的硬件,核心越多,就可以表现的越好)。在这次事件中,的确也做到了受影响的部分(登录)处理能力不足,用户无法正常操作时;另一些做无关操作(副本游戏)的用户没有收到影响。但在服务过载后的恢复环节却做的不够。

由于 bug 的影响,有类消息的处理能力只有 20 次/s 左右。当需要处理的消息频率超过 20 次后(在线玩家超过 8000 人以后出现),该服务过载,导致整个系统处于半瘫痪状态。新用户无法正常进入,直到在线人数下降到 4000 人都没有好转。但已在玩游戏的用户没有受到影响,所以没有做任何处理。大约在 2 个多小时后,系统自己维护正常。这比预期时间要长得多。

这是上周遇到的问题。昨天又在新一轮导量中出现了类似的问题。由于配置问题把大量玩家(十万数量级)引到同一组服务器,导致该服务器几乎无法创建新角色,同时老玩家登录也无法获取自己的角色(因为和创建角色在同一服务内)。如果玩家有足够耐心,等待 10 分钟,还是可以正常进入游戏。这个状态在分流新用户后,得到了缓解。但服务器依然用了小时级的时间才自我恢复。经事后排查,同样是一处 bug 导致的性能问题,但自我恢复时间过长也值得关注。

阅读全文 "skynet 服务的过载保护" »

September 27, 2014

随机地形生成

玩过 矮人要塞 Dwarf Fortress 的同学都会惊叹于它的随机地形生成系统。如果你对 ascii art 无感,那么可以 google 一下 stonesense 的图片。

矮人要塞是 3d 的地形系统。在游戏 wiki 上有介绍地形生成系统的参数细节

大体上是这样的: 首先有一张高度图(Elevation),决定了每个坐标的高度。然后给出一张降雨图 (Rainfall),来影响当地的植被和河流。通常降雨图是根据高度图(海岸和季风影响)计算出来的。这里有一篇文章简单描述了这个过程。

温度图(Temperature)一般根据纬度以及当地的海拔计算出来,也会影响当地的动植物。

地质的排水情况(Drainage)可以影响当地能否形成湖泊、湿地和河流。同样影响了当地的土质(进一步影响植被)。

另外还有,火山的分布情况(Volcanism),以及野生物分布图(Savagery) 会改变当地的矿产和动物分布。


阅读全文 "随机地形生成" »

September 21, 2014

ejoy2d shader 模块改进计划

由于有公司很多同事参与 ejoy2d 的开发,所以 ejoy2d 这个项目已经转移到 ejoy 的 github 名下。

有更多项目的参与的情况下,原来 ejoy2d 的简单构架慢慢显出一些局限性。主要是不同的项目会根据项目的需要(通常是针对某些特定需求的优化,以及特别的效果需求)修改底层 shader 的部分。最早设计的时候,因为考虑到只是用于 2d 游戏的开发,所以把 shader 模块实现的比较简单。特别是 attribute layout 是固定的,而 uniform 管理也没有留下太多扩展性。

在现代手机的 GPU 架构下,从渲染层渲染层 API 看,其实 2d 和 3d 其实没有本质上的区别。都是基于三角片渲染的。需要把顶点上传到 GPU 中由 vs 处理,在最后对像素做 fs 渲染出来。

而 2d engine 和 3d engine 的区别通常在于 2d engine 的顶点变换很简单。不需要用 projection matrix 和 view matrix 做变换。2d engine 中的对象多半是四边形,数量很多,常见的优化手法是将大量的四边型合并到同一个渲染批次中;所以 world matrix (以平移变换为主)在 CPU 中和顶点计算再提交更常见一些。

2d engine 从应用上说,就是在处理一张张图片。所以对图片(四边型)的处理的变化要多一些。这使得 fs 要多变一点,需要引擎提供一定的可定制性。但很少去处理 3d engine 常见的光照投影这些东西。更多的是为了优化贴图用量等目的而技巧性的去使用一些图片。

突出 2d engine 的专门面对的业务的特性,而简化 GPU 提供的模型,用简短的代码构建 engine 框架,是 ejoy2d 设计的初衷。而且我也相信,简单可以带来更好的性能。所以一开始设计 ejoy2d 的时候,shader 模块的很多东西都被写死了,以最简单的方式达到目的。仅暴露了很少的外部接口,再在这些有限的接口上设计数据结构,做性能优化。

阅读全文 "ejoy2d shader 模块改进计划" »

September 08, 2014

2014 IGF 评选

前两天受邀去上海参加今年的独立游戏节评选,准确说是亚洲及太平洋地区的 IGF 。

居然有接近 400 个参选游戏是让我事前没有想到的,尤其是在学生组还发现了不少好作品是个惊喜。

评审用了整整两天时间,从一大早到半夜,中间全部是叫的外卖。基本流程就是看介绍视频,(有兴趣)就试玩,讨论,反复这个过程。但明显还是时间不够用的(想想 20 多个小时看 400 个游戏是啥感觉?平均一小时 10+ 个)。

客观的说,大陆地区的整体水平还排不到前列,但也有几个亮眼的好游戏。有点不可理解的是,有些明显是 100 人以上的公司做出来的商业作品也来凑热闹。所以一般看介绍视频里有 “扫荡” 的基本都没试玩。我个人认为,IGF 还是要强调独立游戏精神的,对于可能获奖的游戏也主要是要设计出彩,好玩,而不太多考虑挖坑赚钱的因素。

出于保密的要求,就不写那些具体的很有意思的游戏了。不过可以泛泛的谈谈评审感受。

据说以往老外比较喜欢做 soul game ,可这次明显感觉反了过来。大陆地区无论是学生组还是职业组都有许多 soul game 。可惜试玩了一下,大多不明白在玩什么,甚至怎么玩都不知道。我想游戏毕竟还是以提供乐趣为住,即使是以往获奖的 soul game ,都还是很好玩的。

有些游戏拼了命的往复杂里做,各种定制元素,连我这个一向以玩复杂游戏为主的玩家都受不了。试玩 15 分钟完全开始不了游戏主线,也想像不到后面的乐趣。

抄袭现象也有许多。如果是商业游戏为了赚钱,复刻一个游戏倒没什么;但对于独立游戏,抄一个热门游戏也可以获奖?这次有 7 个评委,似乎很难瞒过这么多玩家的眼睛。当然,制作精良的疑似抄袭作品我们都仔细玩了一下,试图发现不一样的亮点,可惜很难找到。

这次也发现几款图像向 3A 游戏靠近的独立大作,可是…… 不好玩啊。整个就是炫引擎(以 Unreal 居多)和美术的,就一个人物在绚丽的场景里跑来跑去。只要想想,如果把这些游戏放到大厂家的 3A 游戏中对比,完全不会有因为画面而购买游戏的冲动。而游戏可玩性部分又接近 0 ,最终真是可惜了制作这些人物和场景的人工。

阅读全文 "2014 IGF 评选" »

August 29, 2014

近日工作记录

sproto 基本算完成了, 等 lua 5.3 正式发布后, 还需要把 64bit 整数支持一下。我给 sproto 加了 lua 封装,以方便更好的支持 rpc 。

子熏同学完成了 sproto 的 jit 版本。但似乎性能提升不是很明显。

我希望可以在 skynet 的下个大版本,把 sproto 作为推荐 C/S 通讯协议加进去。


目前正在开发的 skynet 新特性是可以把单个服务的外来消息全部 log 在一个文件中。目前支持了 skynet 的普通消息以及 socket 消息。如果有必要,还可以把组播消息加上。

目前这个特性主要用来调试。其实可以为之开发配套的工具,比如另外做一个调试工具,能够把所以记录的消息重放给一个特定的服务脚本,便可重现一个服务的工作历史。目前 log 文件中记录的消息时间和消息内容足以重现。只要消息中不包含内存地址,这种录像重播的测试方法应该是有效的。

不过暂时还没碰到需要这种调试(比如一个服务出现异常,可以利用录像回溯之前发生的事情,以及当时的现场),等需要时再根据需要制作这样的工具。


等 lua 5.3 正式发布后,打算把 pbc 跟进一下。skynet 里的 int64 支持也可以用 lua 5.3 官方特性取代。我相信到那个时候就可以发布 skynet 的 1.0 版了。


ejoy2d 这个项目,公司有许多同事有兴趣做进一步贡献。所以我把主仓库迁移到 ejoy 名下。

由于正在用 ejoy2d 开发的两个新项目比较紧,最近 ejoy2d 里增加了不少临时项目用的接口。暂时还没有精力去规整。许多新特性(比如粒子绑定,对资源异步加载的支持)都没能及时加上文档。

目前实测在 iphone4 上 ejoy2d 可能会有性能问题。为此,增加了一个 renderbuffer 的特性,可以把一批渲染的定点输出到固定的顶点 buffer 中,这对用复杂图素拼装起来的静态背景会有一些效果。不过关键还在于 iphone4 的 GPU 性能太差,稍微复杂一点的 fragment shader 就会很勉强,为次可能需要给 ejoy2d 加入更灵活的 shader 定制特性。

经过几天的努力,终于把我们新项目在 iphone4 上的 fps 从 12 提升到了 18 ,勉强可以接受了吧。离目标 30fps 还有一些距离,如果进一步的细调还是可以达到的,但会增加很多制作上的难度。不知道到明年,还是否需要考虑 iphone4 这个档次的硬件。


btw, 乘 steam 打折,周末玩了一天文明 V 的第二扩展,还是很不错的。非常期待年底的 beyond earth 。

Misc

Categories

Archives

Recent Comments