TheWisp Signals 项目教程

TheWisp Signals 项目教程

signals General purpose modern C++ Signal-Slot providing ease of use, flexibility and extremely high performance aiming to replace traditional interfaces in real-time applications signals 项目地址: https://gitcode.com/gh_mirrors/signals15/signals

1. 项目介绍

TheWisp Signals 是一个用于C++的开源信号槽库,它提供了易用性、灵活性和极高的性能,旨在替代实时应用中的传统接口。该项目针对视频游戏(以及其他可能需要低延迟的应用)进行了优化。尽管观察者模式在C++中通常很有用,但它从未被标准化,这导致了人们不断尝试进行改进。TheWisp Signals 库是在C++17特性 - template<auto> 的研究成果基础上开发的,它旨在成为像 boost::signals 那样功能完整,但在运行时和内存占用上极为轻量,以取代基于 interfacestd::function 的回调。

2. 项目快速启动

在开始使用TheWisp Signals之前,确保您的编译器支持C++17标准。

以下是一个简单的示例,展示了如何定义、连接和发射信号:

#include "signals.hpp"

// 函数回调
void on_update(float delta) {
    // 处理更新
}

// 成员函数回调
class my_class {
public:
    void on_update(float delta) {
        // 处理更新
    }
};

int main() {
    // 定义一个信号,指定其签名为模板参数
    fteng::signal<void(float delta)> update;

    // 连接到一个函数回调
    update.connect(on_update);

    // 连接到一个对象的成员函数
    my_class* my_obj = new my_class;
    update.connect<&my_class::on_update>(my_obj);

    // 连接到一个lambda回调
    update.connect([](float delta) {
        // 处理更新
    });

    // 发射信号
    update(3.14f);

    delete my_obj;
}

3. 应用案例和最佳实践

连接管理

插槽(slots)不会在它们超出作用域时自动从信号中断开连接。这是由于库的非侵入式设计和“只为所用的付费”原则。为了帮助自动断开插槽,connect() 方法返回一个未管理的(原始)连接,可以转换为 fteng::connection 对象表示唯一的所有权。建议将此连接保存到插槽的结构中,以便在RAII风格中自动断开信号。

以下是一个示例,演示了如何实现当对象被删除时自动从信号中断开连接:

class game {
    // 游戏类的其他成员
};

fteng::signal<void(const game& instance)> game_created;

class subsystem {
public:
    // 使用lambda捕获'this'来连接信号
    fteng::connection on_game_created = game_created.connect([this](const game& instance) {
        std::cout << "Game is created.\n";
    });
};

int main() {
    subsystem* sys1 = new subsystem;
    game game_instance;
    game_created(game_instance);  // 通知每个子系统

    delete sys1;  // 删除sys1,自动断开连接

    game game_instance2;
    game_created(game_instance2);  // 再次通知,不应崩溃
}

在回调中连接/断开插槽

有时在回调过程中,我们可能希望从信号中断开插槽。也有时候我们希望在回调过程中创建或销毁其他对象,这些对象也恰好观察到了触发回调的同一信号。以下是一个示例,展示了库如何支持这些用法:

fteng::signal<void(entity eid)> entity_created;

class A {
    std::unique_ptr<B> b;
    fteng::connection on_entity_created = entity_created.connect([this](entity eid) {
        // 创建'B'对象,它也会连接到信号
        // 在回调期间连接更多的对象是可以的,
        // 但请注意,它们不会被通知
    });
};

4. 典型生态项目

由于TheWisp Signals是一个信号槽库,它通常被用于需要事件驱动通信的系统中。在开源生态中,可能会有很多项目使用它来处理复杂的消息传递系统,例如游戏引擎、实时模拟器或其他需要高性能事件处理的系统。以下是一些可能使用TheWisp Signals的开源项目类型:

  • 游戏开发框架
  • 实时策略游戏
  • 物理模拟引擎
  • 多媒体编辑软件
  • 交互式教育应用

这些项目会利用TheWisp Signals的高性能和灵活性来构建复杂的事件处理逻辑,同时保持代码的整洁和可维护性。

signals General purpose modern C++ Signal-Slot providing ease of use, flexibility and extremely high performance aiming to replace traditional interfaces in real-time applications signals 项目地址: https://gitcode.com/gh_mirrors/signals15/signals

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黎云香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值