最新 | 最热门 | 最高评价

+0  数学运算的实时编译及 Lua 中的一点奇技淫巧

Tag: lua与虚拟机 | 算法 | 优化与技巧
云风 发于 2018年07月12日 11:24 | 点击: 431 | 展开摘要
我为 3d engine 项目设计的向量运算库 已经用了一段时间了。在使用过程中也一直在改进 。从一开始,我就考虑过,这个库的设计主要考量是减少 lua 和 C 交互间的开销,提高内聚性。而易用性方面,计划再上面再做封装。这段时间继续在想怎样从更自然的表达形式转换到这个库的逆波兰指令流上。

大致的方向有两个:

其一,实现一个小语言,用字符串输入表达式组。

其二,利用 Lua 已有的语法解析设施,把 lua 的一个函数翻译成对应的数学运算指令流。

两者都可以看成是一种

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

+0  线程安全的 log 回调函数

Tag: 优化与技巧
云风 发于 2018年07月06日 19:46 | 点击: 498 | 展开摘要
最近在做 3d engine 时发现,我们使用的渲染 api 库 bgfx 提供的 log 回调函数是需要自己保证线程安全的。也就是说 bgfx 有可能在不同线程(采用多线程渲染时)调用这个 log 回调函数。

如果回调函数仅仅只是把 log 串写入文件(例如标准输出),那么可以由 crt 本身来保证线程安全。但如果想自己处理 log ,例如把 log 串压回 lua 虚拟机,那么就必须自己负责线程安全的问题。

我们现在的做法是提供一个线程安全的 log buffer ,

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

+0  Ericsson Texture 压缩贴图 EAC 的编码器

Tag: 技术 | 算法 | 优化与技巧
云风 发于 2018年05月22日 15:13 | 点击: 489 | 展开摘要
最近在做新引擎 UI 模块的工作。汉字字体纹理需要占比较大的一张贴图,考虑到这张贴图只需要用一个通道就够了,所以我决定使用压缩贴图。在手机设备上,GL_COMPRESSED_R11_EAC 是一个不错的选择。

EAC 是 Ericsson 提出的对单通道贴图的压缩方案,现已进入 OpenGL 的官方标准。它通常会结合 ETC2 一起使用。ETC2 负责 RGB 部分,EAC 负责 Alpha 通道。偶尔也可以单独使用。它会将每个像素解码为 [0,2047] 的整数,有 11

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

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

Tag: lua与虚拟机 | 优化与技巧 | 语言与设计
云风 发于 2018年02月08日 11:42 | 点击: 1052 | 展开摘要
如果用纯 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 | 点击: 631 | 展开摘要
最近在用 Lua 实现一个 ECS 框架,用到了一些有趣的 Lua 语法技巧。

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

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

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

+0  四元数的压缩存储

Tag: 优化与技巧
云风 发于 2017年11月15日 10:00 | 点击: 1469 | 展开摘要
今天在读 https://github.com/guillaumeblanc/ozz-animation 这个动画库的代码时,发现它使用了一个有趣的四元数压缩技术。

我们用四元数来表示 3D 空间中的旋转,通常需要 4 个浮点数。不过用四元数表示旋转时,四元数通常会先做一次归一化,即 x*x + y *y + z*z + w*w = 1 。所以我们只需要保留 x,y,z 和 w 的符号位就够了。

但三个 float 来表示四元数既然有压缩余地。这是因为用来表示旋转量时,

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

+0  支持部分共享的树结构

Tag: 算法 | 优化与技巧
云风 发于 2017年06月18日 16:23 | 点击: 717 | 展开摘要
因为图形引擎中的对象天然适合用树 (n-ary tree) 表达,所以它在图形引擎中被广泛使用。通常,子节点会继承父节点的一些状态,比如变换矩阵,在渲染或更新的时候,可以通过先序遍历逐级相乘。

在 PC 内存充裕的条件下,我们通常不必考虑树结构储存的开销,所以大多数图形引擎通常会为每个渲染对象独立生成一个树结构,比如 Unity 中的 GameObject 就是这么一个东西。在 Ejoy2D 中,从节约内存的角度考虑,把树节点上的一部分可共享的状态信息(不变的矩阵、纹理坐标

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

+0  Lua 表的差异同步

Tag: lua与虚拟机 | skynet | 优化与技巧
云风 发于 2017年05月18日 20:10 | 点击: 737 | 展开摘要
最近同事碰到的一个需求:需要频繁把一组数据在 skynet 中跨网络传递,而这组数据实际变化并不频繁,所以做了大量重复的序列化和传输工作。

更具体一点说,他在 skynet 中设计了一个网关节点,这个网关服务可以负责把一条消息广播给一组客户端,每个客户端由内部的一个 uuid 串识别,而每条消息都附带有客户端 uuid 列表。而实际上这些 uuid 列表组有大量的重复。每条广播消息都重复打包了列表组,且列表组有大量重复信息。

一开始我想的方法是专门针对这个需求设计一组协议

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

+0  Unity3D 的大场景内存优化

Tag: 优化与技巧 | 游戏开发
云风 发于 2017年04月06日 11:34 | 点击: 758 | 展开摘要
我们公司的一个 MMORPG 项目最近在内存方面碰到了红线,昨天开会讨论了一下。我提出了一个改进方案,写篇 blog 记录一下。

问题是这样的。在当下的手机及平板硬件设备条件下,操作系统留给应用的可用内存并不多,大约只有 500M 左右。

和 PC 环境不同,手机上是交换分区的机制来对应一些临时突发性内存需求的。而手机必须保证一些系统服务(某些高优先级后台业务)的运行,所以在接电话、收取推送等等意外任务发生时,有可能多占用一些内存,导致操作系统杀掉前台任务让出资源。



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

+0  ejoy2d sprite pack 的空间优化

Tag: 优化与技巧
云风 发于 2016年02月15日 13:27 | 点击: 649 | 展开摘要
在 ejoy2d 里,我将 sprite 的结构信息储存在一组叫 sprite pack 的结构中。其中包括动画的 frame 数据,sprite 由若干部分组成,每个部分的变换矩阵,对应贴图的编码和坐标等等。

通常这些数据不会太大,所以我建议一次加载到内存就不再删除。而动态生成的 sprite 对象则直接引用这些数据,不必做引用计数。这些数据之间的交叉引用(可以像搭积木一样用很多部件构成复杂的 sprite )也不需要额外记录。但如果保存了大量的动画信息,或 sprite

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

+0  ejoy2d sprite pack 的空间优化

Tag: 优化与技巧
云风 发于 2016年02月03日 18:57 | 点击: 855 | 展开摘要
在 ejoy2d 里,我将 sprite 的结构信息储存在一组叫 sprite pack 的结构中。其中包括动画的 frame 数据,sprite 由若干部分组成,每个部分的变换矩阵,对应贴图的编码和坐标等等。

通常这些数据不会太大,所以我建议一次加载到内存就不再删除。而动态生成的 sprite 对象则直接引用这些数据,不必做引用计数。这些数据之间的交叉引用(可以像搭积木一样用很多部件构成复杂的 sprite )也不需要额外记录。但如果保存了大量的动画信息,或 sprite

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

+0  如何拼接 PVR 压缩贴图

Tag: 算法 | 优化与技巧
云风 发于 2015年01月08日 18:41 | 点击: 1264 | 展开摘要
2d 游戏通常都用到很多图素,由于显卡硬件特性,我们又不会把单个图素放在独立贴图中。这样会导致渲染批次过多。在移动设备上,非常影响渲染效率。

所以,游戏运行时,这些图素一般都会合并在很少几张贴图上。要么采用离线合并的方式(利用 texture packer 这样的工具),或者在运行时使用装箱算法。

最近,朱光同学一直在为 ejoy2d 编写运行时合并图素的模块。今天我们讨论了一下他做的诸多尝试。

为了提高贴图利用率,我们可以把大的不规则图素先拆分成小块,然后再组合起来。

查看全文: http://www.udpwork.com/item/13756.html
|<<<12>>>| 一共2页, 22条记录