ECS & Hierarchies

本文总结自 [ECS back and forth: Part 4](ECS back and forth (skypjack.github.io)),使用生物通用神经网络翻译成简体中文,并伴有添油加醋之嫌。
文中会使用 entt 作为 ECS 库用于代码示例。

层级结构(Hierarchies)通常的做法是用一个指针来储存父子关系。在各大游戏引擎都可以见到它,或它的变种。

用 ECS 这种面向数据的编程模式来实现这种随机储存的结构,注定没有一个完美的解决方案,我们需按照实际场景来决定数据组织方式。要么使用灵活,要么性能友好,二者不可兼得。

遵循“过早的优化是万恶之源”原则,我会设立几个场景或目标,从需求出发,使用 ECS 思路来进行实现。

Read More

Share

ECS 储存数据的方式

ECS 最终目的是在冯诺依曼存算分离的架构上,降低缓存命中失效,以实现高效的运算。

Read More

Share

能做和会做

“能是能,会是会。能做是一回事,会做是另一回事。能做不代表一定会,能却不会,那也白搭。”、“现在所有的东西都是要公示的啊。”

网上冲浪时偶然看到的这一句话,上下文似乎是考公咨询。弹幕里刷的各种“秒懂”、“已经工作的人 应该都懂这句话”、“已经工作的人是能懂这句,如果不懂那就很捉急了”云云。

我乍一听,还真没看懂。能做与会做分别指代什么呢?

Read More

Share

Constly Const Pointer

受不了了啊!指针与常量!别搁那“就近原则”了!来点从编译器视角的解析吧!

Read More

Share

Rust规则书

看过一遍 Rust 的语法,如果其他语言也能按照这种思路去写,其实也可以很安全。

本文会简单梳理一下所有权、Trait、生命周期,以重新构建脑内代码思维模式。

Read More

Share

entt.1 组合遍历

过了好一阵子,私以为对 ECS 有了些许了解,在我看来 ECS 是一种 DOD(面向数据设计)的实现方法。而跟诸多数据库一样,entt 提供的是一种紧凑组织、高效遍历的数据框架,并加上各种模板元使代码组织简洁美观。

本文会讨论内存组织方式与遍历的方法。

Read More

Share

Lua Coroutine

C++20 更新了 coroutine 无栈协程的接口,westquote/SquidTasks 就已经使用它在商业产品中作为逻辑框架。它提供了一个近似 javascript 异步操作的写法来构建系统:

1
2
3
4
5
6
Task<int> LoadGame() {
co_await LoadMap("rc.umap");
auto net_handle = co_await CreateNetSession(conf.server);
co_await CreateInstance(net_handle, conf.user);
return 0;
}

这种写法的好处就在于,加载过程不阻塞启动流程,且大幅减少异步回调的函数链。本文会尝试利用 Lua 原生的 Coroutine 系统,来搭建优雅的异步框架。

Read More

Share

【dod】面向数据指南

开新坑了,这回要读一读 Richard Fabian 的 DodBook。这本书主要介绍了一些程式模式于面向数据的实现方式,但也仅仅是介绍,正文几乎没有给到任何代码范例,故我也仅仅提炼一些关键的理念,以备不时之需。

Read More

Share

【和弦分解】Low Roar《Bones》

出自 Death Stranding Orignial Sound Track

1=D, Capo=2

First of march, it’s clear to me

It’s something that’s uncomforting

Your body has a way with me

But I’m exactly where I wanna be

But I’m a long way from home

Read More

Share

看山不是山,看云不是云

回看上一篇日志,已经是一年之前的事情了,结束了百无聊赖的大学生活,开始买车买房、求职相亲……当然不是。如果生活能如此一帆风顺该多好,然而这种看似“平庸”的生活竟成了奢望。

Read More

Share