最新 | 最热门 | 最高评价

+0  浅谈《守望先锋》中的 ECS 构架

Tag: 游戏开发 | 语言与设计
云风 发于 2017年06月27日 09:47 | 点击: 629 | 展开摘要
今天读了一篇 《守望先锋》架构设计与网络同步 。这是根据 GDC 2017 上的演讲 Overwatch Gameplay Architecture and Netcode 视频翻译而来的,所以并没有原文。由于是个一小时的演讲,不可能讲得面面俱到,所以理解起来有些困难,我反复读了三遍,然后把英文视频找来(订阅 GDC Vault 可以看,有版权)看了一遍,大致理解了 ECS 这个框架。写这篇 Blog 记录一下我对 ECS 的理解,结合我自己这些年做游戏开发的经验,可能并非等

查看全文: http://www.udpwork.com/item/16328.html

+0  epoll 的一个设计问题

Tag: skynet | 调试 | 语言与设计
云风 发于 2017年05月28日 11:17 | 点击: 697 | 展开摘要
问题的起因是 skynet 上的一个 issue ,大概是说 socket 线程陷入了无限循环,有个 fd 不断的产生新的消息,由于这条消息既不是 EPOLLIN 也不是 EPOLLOUT ,导致了 socket 线程不断地调用 epoll_wait 占满了 cpu 。

我在自己的机器上暂时无法重现问题,从分析上看,这个制造问题的 fd 是 0 ,也就是 stdin ,猜想和重定向有关系。

skynet 当初并没有处理 EPOLLERR 的情况(在 kqueue 中似乎没

查看全文: http://www.udpwork.com/item/16280.html

+0  sproto 的一些更新

Tag: skynet | 语言与设计
云风 发于 2017年03月14日 22:05 | 点击: 567 | 展开摘要
sproto 是我设计的一个类 google protocol buffers 的东西。

在很多年前,我在我经手的一些项目中使用 google protocol buffers 。用了好几年,经历了几个项目后,我感觉到它其实是为静态编译型语言设计的协议,其实并没有脱离语言的普适性。在动态语言中,大家都不太愿意使用它(json 更为流行)。一个很大的原因是,protobuffers 是基于代码生成工作的,如果你不使用代码生成,那么它自身的 bootstrap 就非常难实现。

查看全文: http://www.udpwork.com/item/16176.html

+0  跟踪数据结构的变更

Tag: lua与虚拟机 | 语言与设计
云风 发于 2017年02月14日 18:01 | 点击: 509 | 展开摘要
这两个月,我的主要工作是跟进公司内一个 MMORPG 项目,做一些代码审查提出改进意见的工作。

在数月前,项目经理反应程序不太稳定,经常出一些错误,虽然马上就可以改好,但是随着开发工作推进,不断有新的 bug 产生。我在浏览了客户端的代码后,希望修改一下客户端的 UI 框架以及消息分发机制等,期望可以减少以后的 bug 出生概率。由于开发工作不可能停下来重构,所以这相当于给飞行中的飞机换引擎,做起来需要非常小心,逐步迭代。

工作做了不少,其中一个小东西我觉得值得拿出来写写

查看全文: http://www.udpwork.com/item/16103.html

+0  一个简单的 lua 对象回收再利用方案

Tag: lua与虚拟机 | 语言与设计
云风 发于 2017年01月24日 10:36 | 点击: 678 | 展开摘要
昨天在 review 我公司一个正在开发的项目客户端代码时,发现了一些坏味道。

客户端框架创建了一个简单的对象系统,用来组织客户端用到的对象。这些对象通常是有层级关系的,顶层对象放在一个全局集里,方便遍历。通常,每帧需要更新这些对象,处理事件等等。

顶层每个对象下,还拥有一些不同类别的子对象,最终成为一个森林结构,森林里每个根对象都是一颗树。对象间有时有一些引用关系,比如,一个对象可以跟随另一个对象移动,这个跟随就不是拥有关系。

这种设计方法或模式,是非常常见的。但是在

查看全文: http://www.udpwork.com/item/16074.html

+0  ephemeron table 对 property tables 的意义

Tag: lua与虚拟机 | 语言与设计
云风 发于 2016年09月19日 20:56 | 点击: 517 | 展开摘要
今天在公司群里,Net bug 同学提出了一个问题,围绕这个问题大家展开了一系列讨论。讨论中谈及了 lua 中的一个常见的模式:property table ,我觉得挺有意思,记录一下。

最初的问题是:当一个对象的某些属性并不常用,希望做惰性初始化的话,应该怎么实现。

我认为,property table 是一个很符合这个案例的常见模式。

比如,对象 f 有三个可能的成员 a b c ,我们可以不把 f.a f.b f.c 记录在 f 这个 table 里,而是额外有三

查看全文: http://www.udpwork.com/item/15835.html

+0  嵌入式 lua 中的线程库

Tag: lua与虚拟机 | 语言与设计
云风 发于 2016年01月17日 22:13 | 点击: 734 | 展开摘要
无论是客户端还是服务器,把 lua 作为嵌入语言使用的时候,都在某种程度上希望把 lua 脚本做多线程使用。也就是你的业务逻辑很可能有多条业务线索,而你希望把它们跑在同一个 lua vm 里。

lua 的 coroutine 可以很好的模拟出线程。事实上,lua 自己也把 coroutine 对象叫做 thread 类型。

最近我在反思 skynet 的 lua 封装时,想到我们的主线程是不可以调用阻塞 api 的限制。即在主干代码中,不可以直接 yield 。我认为可以

查看全文: http://www.udpwork.com/item/15135.html

+0  基于引用计数的对象生命期管理

Tag: skynet | 语言与设计
云风 发于 2016年01月06日 16:32 | 点击: 670 | 展开摘要
最近在尝试重新写 skynet 2.0 时,把过去偶尔用到的一个对象生命期管理的手法归纳成一个固定模式。

先来看看目前的做法:旧文 对象到数字 ID 的映射

其中,对象在获取其引用传入处理函数中处理时,将对象的引用加一,处理完毕再减一。这就是常见的基于引用计数的对象生命期管理。

常规的做法(包括 C++ 的智能指针)是这样的:对象创建时,引用为 1 (或 0)。每次要传给另一个处地方处理,或保留待以后处理时,就将其引用增加;不再使用时,引用递减。当引用减为 0 (或负

查看全文: http://www.udpwork.com/item/15106.html

+0  RPC 之恶

Tag: skynet | 语言与设计
云风 发于 2015年12月05日 00:07 | 点击: 667 | 展开摘要
起因是最近有人在 skynet 邮件列表里贴了段错误 log ,从 log 显示,他在 table.sort 的比较函数里调用了 skynet 的 snax rpc 去获取远程数据。然后被 lua 无情的报了 attempt to yield across a C-call boundary 。

就 table.sort 不能 yieldable 的问题,其实在 lua 邮件列表里讨论过 。老大的说法是,这个 C 实现是递归的,想要在 C 层面保留上下文非常困难,如果勉强实

查看全文: http://www.udpwork.com/item/14826.html

+0  RPC 之恶

Tag: skynet | 语言与设计
云风 发于 2015年11月30日 15:29 | 点击: 628 | 展开摘要
起因是最近有人在 skynet 邮件列表里贴了段错误 log ,从 log 显示,他在 table.sort 的比较函数里调用了 skynet 的 snax rpc 去获取远程数据。然后被 lua 无情的报了 attempt to yield across a C-call boundary 。

就 table.sort 不能 yieldable 的问题,其实在 lua 邮件列表里讨论过 。老大的说法是,这个 C 实现是递归的,想要在 C 层面保留上下文非常困难,如果勉强实

查看全文: http://www.udpwork.com/item/14808.html

+0  sproto rpc 的用法

Tag: 语言与设计
云风 发于 2015年04月27日 11:46 | 点击: 1138 | 展开摘要
sproto 是我自己设计, 用在我们新项目中取代过去用到的 google protocol buffers 的东西。

为什么不用 protobuf ? 这个问题我有足够的发言权。在 lua 语言为主的项目中,sproto 更合适。google 官方并没有给 protobuf 加入 lua 支持。现在在网上流传的 protobuf lua 方案,被人用的最多的两种,一个是 pbc 的 lua binding ,另一个是 protoc-gen-lua 。前者是我在开发维护,

查看全文: http://www.udpwork.com/item/14147.html

+0  给 sproto 增加 unordered map 的支持

Tag: 语言与设计
云风 发于 2015年04月20日 19:57 | 点击: 1001 | 展开摘要
花了两天给 sproto 增加了 unordered map 的支持。

问题是这样的:

sproto 支持数组,但很多情况下,业务处理中,我们并不用数组来保存大量的相同类型的结构数据。因为那样不方便检索。

比如你要配置若干地图表、NPC 表等等的信息,固然可以用 sproto 的 array 来保存。但是在运行时,你更希望用定义好的 id 来检索它们。如果 sproto 不支持 unordered map 的话,你就需要在 decode 之后,对 array tabl

查看全文: http://www.udpwork.com/item/13985.html
|<<<1234>>>| 一共4页, 48条记录