August 25, 2015

我们的新游戏《心动庄园》上线啦

《心动庄园》已经开发超过了一年半,其实去年这个时候我们已经在内测了,折腾了很久,改来改去的。

之所以项目折腾超过了预期时间这么久都没有被公司砍掉,纯粹是因为开发者对这款游戏是真爱。所有开发人员,甚至包括程序,都花了大量时间玩它,并喜欢它。你可以想想,反复改了一年多还留有爱,那不是真爱是什么?所以即使开发预算超标,公司的管理层也不舍得砍掉它。

这是款农场经营游戏,一开始立项是因为我们公司有很多人喜欢玩 hayday 。头三个月,我们也真的是在认真的复制 hayday 。之后,就开始了漫长的修改期。如果你对一款游戏有了深入的了解,你就会去想游戏背后的内在逻辑,是什么导致游戏粘住用户的。当把这些剥离出来,你就可以设计属于自己的东西了。

改着改着,这就成了一款我们自己的游戏,虽然新手阶段依然有 hayday 的影子。但不用刻意回避它,毕竟很多基础玩法是被无数用户证明过有趣的,而整个游戏的骨干是经过设计人员思考的,并不是简单的复制。我们在长期的测试过程中,不可避免的一些原创的玩法也陆续被国内一些已经上线的同类游戏借鉴过去,但我们并不在意。抄个表象容易,那些系统的结构却很难复制。

另一方面,没玩过 hayday 的玩家依然很多,只要给喜欢这类游戏的玩家带来一个逻辑完整的游戏就好了,不必太在意表层的相似。

说了这么多,如果有兴趣试一下的同学,可以在这里下载。

游戏官网 http://xd.ejoy.com/

这款游戏继续和陌陌合作,但这次,不必安装陌陌客户端,也不用注册陌陌号就可以游戏了。所以只是想看一下的同学不必有心理负担。Andriod 版和 iOS 版均有,下载安装后直接可进入游戏,没有什么多余的注册环节。

这是我们使用 ejoy2d 制作客户端的第三款产品,使用 skynet 做服务器的第五款产品。如果仅仅想看看 ejoy2d 的表现力,也可以下载看看。


btw, 到现在,是在陌陌游戏上线的第一个 24 小时,同时在线的人数全天一直保持在注册总用户数的 1/8 稳定上升。玩家对我们的游戏的认可可以说是预料之外,而在情理之中。毕竟用心去做,总能被玩家体会到。

August 20, 2015

共享 lua vm 间的小字符串

lua 中 40 字节以下的字符串会被内部化到一张表中,这张表挂在 global state 结构下。对于短字符串,相同的串在同一虚拟机上只会存在一份。

在 skynet 中,有大量的 lua vm ,它们很可能加载同一份 lua 代码。所以我之前改造过一次 lua 虚拟机,[让它们可以共享 Proto] 。这样可以加快多个虚拟机初始化的速度,并减少一些内存占用。

但是,共享 Proto 仅仅只完成了一半的工作。因为一段 lua 代码有一很大一部分包含了很多字符串常量。而这些常量是无法通过共享 Proto 完成的。之前的方案是在 clone function 的时候复制一份字符串常量。

或许,我们还可以做的更进一步。只需要让所有的 lua vm 共享一张短字符串表。

阅读全文 "共享 lua vm 间的小字符串" »

August 19, 2015

希望 Lua 可以增加一个新特性 userdata slice

Lua 是一门嵌入式语言,和 host 的联动非常重要。Lua 使用 userdata 来保存 host 里的数据,userdata 非常强大,可以有 metatable 还可以关联一个 uservalue ,可以封装一切 C/C++ 对象,非常强大。但有的时候却稍显不足,似乎缺了点什么,导致一些简单的需求要用很繁琐的方式解决。

有个想法想过很久,今天动了念头用英文写了一遍投递到 lua 邮件列表里去了。

那就是,如果我们可以给 userdata 的值关联一个整数,而不是把 uservalue 关联到 userdata 的对象里那样,可以简化很多事情。

阅读全文 "希望 Lua 可以增加一个新特性 userdata slice" »

August 12, 2015

一个内存泄露 bug

起因是 skynet 的一个 Issue ,同时,这两天我们正在开发的一个项目也反应貌似有内存泄露。

我觉得两件事同时发生不太正常,就决定好好查一下。

其实在 skynet 里查内存泄露要比一般的项目容易的多。因为 skynet 天生就分成了很多小模块,叫作服务。模块申请的内存是独立的,内聚性很高。模块的生命期比整个进程短的多,模块的规模也不会太大,可以独立分析。一般说来,如果有内存申请没有归还,应该是 C 模块里的 bug 。而 skynet 会用到的 C 模块也很少,一旦有这样的问题,很快就能定位。

阅读全文 "一个内存泄露 bug" »

August 05, 2015

去掉 skynet 中 cluster rpc 的消息长度限制

之前写过一篇 为什么 skynet 提供的包协议只用 2 个字节表示包长度 里面提到, 如果有体积很大的消息传递需求,那么应该在上一层去处理。

从另一方面来说,我们应该正视长消息的处理,而不应该将其和普通(较短)消息的处理混为一谈,在底层抹平之间的区别。

最近,需求就来了。

我们的一个新项目希望在 cluster 间通讯的时候,可以支持较大的消息。原本提出需求的同学想自己修改 skynet 的 cluster 模块,修改底层协议的包头长度的。我即使阻止了他,并自己动手做了修改。

阅读全文 "去掉 skynet 中 cluster rpc 的消息长度限制" »

July 29, 2015

第一次提交绿光

这两天都在忙一个事情, 把我们的一个新游戏提交到 steam 绿光计划上。

去年底开始,公司里就有两个人开始在忙一个小项目。最初的一个月,他们只是做了一个原型,本来打算演化成一个手机游戏,作为 2015 年公司的新项目去推广的。这个原型只有一个简单的战斗动画,提出想法的同学是一个格斗游戏迷,他只是想简化格斗游戏里的操作,提取出一些核心乐趣带给大众玩家。

当然,他同时也是一名优秀的美术设计人员,所以原型做的非常绚丽,一下子就吸引了公司里很多人。

对于这款游戏做出来后如何盈利,最初的两个开发人员(一个美术和一个程序)一点想法都没有。他们没有沉浸过任何网络性质的手游,不懂怎么挖坑赚大 R 的钱。只知道打磨那些 demo 中自己认为有趣的地方。所以对于这个项目是否立项,作为公司的决策人是很为难的。

阅读全文 "第一次提交绿光" »

July 28, 2015

lua 分配器的一些想法及实践

从周末开始, 我一直在忙一个想法。我希望给 skynet 中的 lua 服务定制一个内存分配器。

倒不是为了提升性能。如果可以单独为每个 lua vm 配置一个内存分配器,自己调用 mmap 映射虚拟内存,就可以为独立的服务制作快照了。这样可以随时 fork 出子进程,只保留关心的 vm 的内存快照。主要可以有三个用途:

  1. 可以在快照上做序列化,并把结果返还父进程。通常做序列化有一定的时间代价,如果想定期保存的话,这个代码很可能导致服务暂停。

  2. 可以利用快照监控检查泄露。定期做快照相比较,就能找到累积的对象。我曾经做过这样的工具

  3. 可以在镜像上对快照做一些调试工作而不会影响主进程。

阅读全文 "lua 分配器的一些想法及实践" »

Misc

Categories

Archives

Recent Comments