January 19, 2020

不适合采用 System 的一种情况

ECS 框架中,System 通常是对某种 Component 的集中处理。大部分情况下,一次性对大量对象中的简单的数据结构做简单的处理,比每次对一个对象的复杂数据结构(通常是简单数据结构的组合)做复杂处理,依次处理所有的对象要更好。

凡事总有例外。我们最近就发现有一类情况不适合这样做。那就是骨骼动画的骨骼计算。

骨骼计算会分为若干步骤,有骨骼数据的展开,骨骼姿态的混合,IK 计算等等。一开始,我们遵循着 ECS 的设计原则,把这些步骤分到不同 System 种。例如并非所有的对象都需要做 IK 计算,这样 IK System 就只用遍历一个子集;同样,也并非所有的动画都需要做多个姿态的混合,等等。

阅读全文 "不适合采用 System 的一种情况" »

January 13, 2020

ECS 中的概念缺失

经过长时间的思考和实践,最近一个多月,我们的 ECS 框架做了较大的调整。其中一部分工作已经在前一篇消息发布订阅机制中介绍,另一部分工作其实开展的更早,但因为我想多沉淀一段时间再写。到本周基本基本改动完毕,可以总结一下了。

ECS 框架几乎只在游戏开发领域提出,我认为这主要是因为目前只有在游戏领域,周期性的大量对象的状态变换才是主流行为。而在其它人机交互领域,响应外部事件才是主流。这是为何 System 在游戏领域如此重要的原因。

但另一方面,ECS 框架对过去流行的面向对象框架的反思,主要集中在面向数据/数据驱动。这是 Component 概念被如此看重的原因。Component 是行为被拆分出来的对象,重要的是数据本身。对于框架来说,要解决的是更方便的组合、有完善的自省机制,这才能针对数据集本身来编程。因为游戏开发,程序员的工作仅占很少的部分,大部分的工作是策划和美术围绕开发工具给数据添砖加瓦的。

阅读全文 "ECS 中的概念缺失" »

December 24, 2019

ECS 中的消息发布订阅机制

我们在实践 ECS 框架时发现,之所以 ECS 的概念诞生于游戏领域,是因为游戏程序往往都在周期性的处理一批对象,进行运算,根据上个周期的状态得到下个周期的状态。而传统人机交互的应用则是响应型的:即一个外部请求触发一系列的业务运作。

如果你把游戏业务塞到响应型框架中,就会发现,不得不用时间去触发,业务响应的是 timer 。但这种情况下,timer 几乎没有携带任何状态,对单个 timer 的响应,是不可能做成无状态的:它本身就是整个游戏世界对上个状态的迭代。

这种情况下,响应式框架就很低效。

阅读全文 "ECS 中的消息发布订阅机制" »

December 21, 2019

程序员修炼之道第二版译者跋

文本在阐释中烟消云散 —— 尼采《善恶的彼岸》

2019 年 12 月 20 日,我终于用笨拙的中文把《程序员修炼之道》的第二版初步译完。距编辑侠少把英文电子版发送给我已经过去了 70 天。这两个多月里,翻译工作几乎占据了我所有的业余时间,真的很累,但却心甘情愿,并乐得其中。

阅读全文 "程序员修炼之道第二版译者跋" »

December 03, 2019

5 岁小朋友的游戏历程

云豆 5 岁半了,早在他三岁的时候,我就刻意培养他玩游戏的能力。我觉得这是促进智力发展的最佳途径。

一开始是给他玩一些非常简单手机游戏,当时他还不到三岁,即使是那种给猫玩的简单游戏,似乎他也无法明白其中的逻辑。我感觉我儿子的大脑发育较慢,谈不上聪明,至少不比同龄小朋友聪明。我在三岁时未经刻意学习已经可以认不少字,并能记事了;而云豆这个时候还不能用语言流利的表达。但我想我有耐心慢慢陪伴他长大,观察人类习得基本技能的过程,面临的挑战(成人已经忘记,觉得理所当然的东西),也是件极为有趣的事。

云豆第一个感受到乐趣,乐此不疲的游戏,是 ios 上一款叫做有趣的食物的 app 。它为幼龄儿童考虑的相当周到,大多只需要点点点就能继续下去,需要非常有限的逻辑。在三岁左右的年龄段,我尝试了很多游戏 app ,以点击为主,大多都达不到让小孩理解并独立玩下去的程度。

阅读全文 "5 岁小朋友的游戏历程" »

November 17, 2019

易于修改原则

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

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

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

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

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

November 07, 2019

skynet 网络层的一点小优化

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

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

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

Misc

Categories

Archives

Recent Comments