November 17, 2019

易于修改原则

这个月来,我已经在从事《程序员修炼之道》第二版的翻译。到现在已经超过十万字,几乎是全书的一半了。

很难很累。翻译和阅读是两码事,就算自己理解了,想说清楚也是很难的。何况有些句子理解起来摸棱两可,想理解透彻也不是那么容易的事。毕竟是别人的思想,凡思想都非真理,没有太多对错可言,翻译者只求能准确表达。

不过越是深入,越是觉得自己在做一件伟大的事。这本书一如二十年前的那一版一样,字字珠玑。能给无数程序员引路。有些道理过去讲得不甚透彻的,经过数十年的历练,作者看得更通透了。

比如,有一条过去没有提及的原则,在这一版中放在了重中之重的位置。那就是:ETC 原则,Easier To Change ,易于修改。

阅读全文 "易于修改原则" »

November 07, 2019

skynet 网络层的一点小优化

在 2017 年的时候,我对 skynet 网络层的写操作做了一些优化 ,优化点是:如果 socket 并不繁忙,就不必把数据转达到网络线程写,而是直接写入 socket 。这可以减轻单线程网络层的负担,对于写操作频繁的场景会有极大的提升。

最近两天我想起来,如果大部分场合都可以通过直接写入 socket 而不必转发到网络线程发送数据的话,其实我们可以进一步的减少一次内存拷贝。

阅读全文 "skynet 网络层的一点小优化" »

October 20, 2019

程序员修炼之道第二版开始翻译了

The Pragmatic Programmer 这本书居然在上个月出了第二版,离第一版过去已经 20 年了。

十多年前,在我第一次看到这本书时,就相当的喜欢。后来在中文版再刷的时候,应邀写了一篇书评 。一晃又是十年过去,没想到这次因为这本书找上我的是第二版的翻译工作。

我只花了 10 分钟,把 Amazon 上第二版的页面稍微浏览了一遍,就答应了这项工作。如果只是为了赚点外快,我是肯定不会接翻译书的活的。比起《代码大全》那种大部头,这本书可谓短小精悍。不过 300 来页,但我现在业余时间大多交给了家庭,就算只有 30 万字的量,起码也需要几百小时来做。

但这次,我真的希望借翻译的机会,重新精读一遍。而且看目录,第二版修订了许多内容,可以先睹为快了。这些年拒绝了很多出版社写书的邀约,除了时间不太够外,主要还是觉得自己沉淀不够,很难系统总结好自己的思想。孔子也说述而不作,信而好古。其实前人总结的实在是太好了,我想我的能力可以发挥在此也不错:尽自己的理解,把这本经典翻译好。高质量的译本对中文开发社区的贡献会远超过自己写一本不成熟的书。

阅读全文 "程序员修炼之道第二版开始翻译了" »

October 10, 2019

三国志战略版服务器卡顿问题

我们的新作品 三国志战略版 上线有一小段时间了。市场反应不错,获得了许多玩家。随着玩家数量增加,服务器也产生了严重的卡顿问题,在每天高峰期尤其严重。

这个产品的服务器开发团队在立项之初并没有接触过 skynet ,可以说是从头学习起,在很短的时间内就完成了项目,还是很不错的。我没有参加过这个项目的开发,在问题显露的那几天正巧国庆假期在国外度假,远程参与了一些讨论。帮助分析了问题,等休假完毕后,昨天又开了一整天的会,大致了解了游戏的玩法(需求),结合前两天的思考,给了几套不同的改进方案。

阅读全文 "三国志战略版服务器卡顿问题" »

September 23, 2019

群星的经济系统

群星是个非常复杂的战略游戏。我玩了 3 年多,600 多小时。这三年一直在跟进中文化工作,校对及翻译了几十万字的文本,可以说是非常喜爱了。

如果有机会,我希望日后可以制作一款类似的战略游戏。我认为我应该把群星的系统好好整理成文字,这样帮助自己看出它的设计思路。群星采用了一种独特的商业模式,就是不断地积累忠实玩家,然后按周期推出收费的新玩法,让玩家持续付费。不用于常规的售卖游戏内容,它是在售卖游戏玩法。现在的版本和 3 年前推出的版本,可以说是在玩法上有天翻地覆的变化。

这样,玩家其实在花钱购买新的体验,而创作者则一步步的完善游戏系统,不用太担心一下次引入过多的系统导致玩家学习曲线过高,也不用担心有设计失误:总可以在下个版本修改。而玩家也比较放心,只要持续付费,跟着设计者的脚步走,总有新奇的享受,还免去了玩新游戏从头学习的成本。

群星的整个系统太复杂了,远非一两篇 blog 所能写清楚的。我想先记录一下 2.3 版本的经济系统,是俗称“种田”玩法中的重要部分。其实,群星有个官方的 wiki ,讲解的非常清楚 。我只是根据自己玩游戏过程的理解,重新整理一下而已。

我玩过的最早的战略游戏当属三国志系列,一开始就有所谓的内政系统。但是它仅仅只是简单的用武将提升一下城市的繁荣度的数字而已。虽然已经有人口、金钱、粮草的不同维度,但相互影响非常简单。数值发展的空间也只跟招募到的将领能力和原本设定好的城市基础值有关系。内政系统不太可能成为独立的游戏乐趣来源。

而从文明系列开始,经济发展就变得错综复杂,过于简单的经济设定已经无法满足战略游戏的设计需求了。这类战略游戏的玩家不满足于一个指令下去,某个维度的数值就提升起来,这种简单直白的系统。不同维度的数值间相互制约,玩家根据每局游戏随机出来的环境、对手,动态的调整策略,在多种制约下找到最高效率的发展路径,成了游戏重要的乐趣来源。

群星和文明不同,它没有采用分时回合制,而采用了即时带暂停的模式。但本质上还是一种同步回合制。所有玩家/非玩家都是同时进行行动的,主动指挥的单位行动以天(游戏中最小的时间单位)为回合推演,而行动对经济系统的影响则以月为周期结算。我认为两种模式各有优劣,但我更喜欢即时带暂停的模式,它也更适合在网络上对战。

阅读全文 "群星的经济系统" »

September 16, 2019

场景层次结构的管理

今年上半年的时候,就想把我们游戏引擎中场景层次结构管理模块的设计记录一下。每次想写的时候都在做小调整。直到最近,算法和数据结构才稳定下来。今天做一个记录。

游戏里的场景对象,通常以树结构保存。这是因为,每个对象的空间状态,通常都受上一级的某个对象影响。

从管理角度讲,每个对象最好都能知道它可以影响其它哪些对象;且必须知道它被哪个对象影响。所以,这会用到一个典型的树结构。尤其在做编辑器时,树结构还会直接呈现在编辑界面上。不过,我认为在运行时,从父对象遍历到子对象的需求并不是必要的,需要时可以额外记录。从数据上考虑,父亲记住孩子和孩子记住父亲,是重复了同一种关系信息。如果不需要记住孩子的兄弟次序,那么在核心数据结构中,我们只需要让孩子记住父亲就足够了。

去掉冗余信息可以简化数据结构、减少维护成本、避免犯错误。尤其对于 ECS 架构,我希望所有对象都是平坦的,在场景对象组件上,一个 parent id 可以最少的构造出场景的层次结构出来。

阅读全文 "场景层次结构的管理" »

August 23, 2019

让 lua 运行时动态切换操作系统线程

最近我们在开发引擎时遇到一个和操作系统有关的问题,想了个巧妙地方法解决。我感觉挺有意思,值得记录一下。

在 ios 上,如果你的程序没能及时处理系统发过来的消息(比如触摸消息等),系统有机会判定你的程序出了问题,可能主动把进程杀掉。

完全自己编写的应用程序,固然可以把处理消息循环放在最高优先级。即使有大量耗时操作,也可以通过合理的安排代码,不让消息处理延后。但作为引擎,很难阻止使用者阻塞住主线程做一些耗时的操作。所以,通常我们会把窗口消息循环和业务逻辑分离,放到两个不同的线程中。这样,消息处理线程总能及时的处理系统消息。

在 windows 上,允许程序在任何一个线程做窗口消息循环。但在 ios (以及 Mac)上似乎不行。窗口消息循环必须在主线程中运行。

阅读全文 "让 lua 运行时动态切换操作系统线程" »

Misc

Categories

Archives

Recent Comments