【问题标题】:Efficiency of Qt Signals and SlotsQt 信号和槽的效率
【发布时间】:2011-02-18 07:49:05
【问题描述】:

我浏览了 QMainWindow 内部的方法,发现有些部分(例如 resizeEvent 和 winEvent)没有作为信号实现,而是你必须继承这个类才能覆盖它们。

我的问题是,信号和槽的效率如何,是否有可能将这些类型的函数实现为其他类可以订阅的信号。例如,在高性能游戏引擎内部。

【问题讨论】:

    标签: c++ performance qt4 game-engine signals-slots


    【解决方案1】:

    据我记得,Trolltech 表示信号/插槽调用比virtual 调用慢大约 10 倍。您应该能够轻松地每秒处理数万甚至数十万个信号。

    【讨论】:

    • 信号/槽也生成元数据,因此类实例比虚拟方法占用更多内存。当调用 singal(是的,信号只是一个普通方法)时,它会通过连接的对象,并在接收者 metaObject 上使用“invoke”方法。比直接调用虚方法要慢
    • 所以我们不会说对实时使用信号和插槽有任何严重影响吗?我们有什么理由不能保证信号和槽在一定时间内完成?
    • @ArmadilloChubbz65:它仍然是 C++。按值传递一个 1 GB 的字符串,该副本将花费大量时间。
    【解决方案2】:

    信号和槽的设计使不同的对象可以通信,这两个对象都在您的控制之下。

    您提到的事件一次只涉及 一个 对象,事件循环直接通知该对象。这里不需要信号或槽。

    请注意,如果您愿意,可以在事件成员函数内发出信号。这通常是对事件做出反应的正确方式。这样,其他对象可以订阅某些内容。

    【讨论】:

      【解决方案3】:

      从 QMainWindow 派生,从那里重新实现 resize() 和 emit() 信号,如果您想在其他地方对此类信号做出反应。

      【讨论】:

      • 或者只是创建并安装一个事件过滤器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      相关资源
      最近更新 更多