最新 | 最热门 | 最高评价

+0  游戏资源仓库及升级发布

Tag: 游戏开发 | 语言与设计
云风 发于 2018年08月15日 11:20 | 点击: 655 | 展开摘要
去年底,我为我们的 3d engine 设计了资源仓库的结构。

随后交给开发组的一个同学实现,这半年来,一直在使用。最近做了引擎一个小版本的内部验收,我感觉这块东西还有比较大的改进余地。因为资源文件系统目前和开发期资源在线更新部分现在掺杂在一起,而网络更新部分似乎还有些 bug ,偶尔会卡住。我觉得定位 bug 成本较高,不如把这块重新实现一遍,顺便把新的改进想法加进去。

这段时间,我重新思考了资源仓库应该怎样设计更合理。越细想越觉得和 git 要解决的问题基本一致。我们

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

+0  提高 lua 处理向量运算性能的一点尝试

Tag: lua与虚拟机 | 优化与技巧 | 语言与设计
云风 发于 2018年02月08日 11:42 | 点击: 1092 | 展开摘要
如果用纯 lua 来做向量/矩阵运算在性能要求很高的场合通常是不可接受的。但即使封装成 C 库,传统的方法也比较重。若把每个 vector 都封装为 userdata ,有效载荷很低。一个 float vector 4 ,本身只有 16 字节,而 userdata 本身需要额外 40 字节来维护;4 阶 float 矩阵也不过 64 字节。更不用说在向量运算过程中大量产生的临时对象所带来的 gc 负担了。

采用 lightuserdata 在内存额外开销方面会好一点点,但是

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

+0  Lua 实现 ECS 框架的一些技巧

Tag: lua与虚拟机 | 优化与技巧 | 语言与设计
云风 发于 2017年12月16日 21:36 | 点击: 676 | 展开摘要
最近在用 Lua 实现一个 ECS 框架,用到了一些有趣的 Lua 语法技巧。

在 ECS 框架中,Component 是没有方法只有数据的,方法全部写在 System 中。Entity 本身仅仅是 Component 的组合,通常用一个 id 表示。

但实际写代码的时候,使用面向对象的语法(用 Lua 的冒号 这个语法糖)却是比较自然的写法。比如我们在操作一个 Component 数据的时候,用 component:foobar() 比用 foobar(componen

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

+0  ECS 的 entity 集合维护

Tag: 语言与设计
云风 发于 2017年12月10日 12:17 | 点击: 736 | 展开摘要
最近在基于 ECS 模型做一些基础工作。实际操作时有一个问题不太明白,那就是涉及对象 (entity) 集合本身的 System 到底应该怎样处理才合适。

仔细阅读了能找到的关于 ECS 的资料,网上能找到的大多是几年前甚至 10 年前的。关于 ECS 的资料都不断地强调一些基本原则:C 里面不可以有方法(纯数据结构),S 里面不可以有状态(纯函数)。从这个角度看,Unity 其实只是一个 EC 系统,而不是 ECS 系统。从 Unity 中寻找关于 System 的设计模

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

+0  Lua 下的 ECS 框架

Tag: 语言与设计
云风 发于 2017年12月03日 23:01 | 点击: 891 | 展开摘要
前段时间,我写了一篇 浅谈《守望先锋》中的 ECS 构架 。最近想试试在 Lua 中实现一个简单的 ECS 框架,又仔细琢磨了一下。

我思考后的结论是:ECS 并不是一个新概念,它的提出其实是和语言相关的。ECS 概念的诞生起于游戏行业,相关框架基本都是基于 C++ 来开发的。它其实是对 C++ 对象模型的一个反思。ECS 针对组件组合对象,而反对 C++ 固有的基于继承的对象模型。对象模型才是 ECS 的设计核心理念。而离开 C++ 的对象模型,ECS 并不是什么新鲜的东

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

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

Tag: 游戏开发 | 语言与设计
云风 发于 2017年06月27日 09:47 | 点击: 1272 | 展开摘要
今天读了一篇 《守望先锋》架构设计与网络同步 。这是根据 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 | 点击: 1012 | 展开摘要
问题的起因是 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 | 点击: 1059 | 展开摘要
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 | 点击: 706 | 展开摘要
这两个月,我的主要工作是跟进公司内一个 MMORPG 项目,做一些代码审查提出改进意见的工作。

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

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

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

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

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

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

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

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

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

+0  ephemeron table 对 property tables 的意义

Tag: lua与虚拟机 | 语言与设计
云风 发于 2016年09月19日 20:56 | 点击: 751 | 展开摘要
今天在公司群里,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 | 点击: 918 | 展开摘要
无论是客户端还是服务器,把 lua 作为嵌入语言使用的时候,都在某种程度上希望把 lua 脚本做多线程使用。也就是你的业务逻辑很可能有多条业务线索,而你希望把它们跑在同一个 lua vm 里。

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

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

查看全文: http://www.udpwork.com/item/15135.html
|<<<12345>>>| 一共5页, 53条记录