【问题标题】:The best method to send images interactively from Haskell backend to Qt QUI以交互方式将图像从 Haskell 后端发送到 Qt QUI 的最佳方法
【发布时间】:2013-11-19 00:58:24
【问题描述】:

我正在构建一个由两部分组成的应用程序:QtQuick GUI (C++) 和使用 repaaccelerate 包处理图像的 Haskell 后端。

我想在 GUI 中以交互方式显示图像。我不希望复制数据,而是使用某种共享内存或任何其他机制,这将使我获得最大的性能。

在 C++ GUI 中以交互方式“传输”和显示这些图像的最佳方式是什么?

我听说过HQKqtHaskell,但它只支持qtquick 直到v4.8(我们需要v5.0 - v5.2)

【问题讨论】:

  • QtQuick/C++ 端调用 Haskell,还是 Haskell 后端独立运行,通信以更像 IPC 的方式进行?哪一方“驱动”图像的产生? (我问是因为我最近也在思考类似的事情,这些问题似乎很重要……)
  • 这是双向通信,但大多数图像将从 Haskell 推送到 GUI。

标签: c++ performance qt haskell rpc


【解决方案1】:

我会看看FFI,因为您可能会直接将您的haskell 代码嵌入到您的C++ 代码中!这也将允许您在它们之间共享内存。

您也可以在 C++ 中为您的 haskell 程序打开一个管道并以这种方式传递数据,尽管您随后会在内存中制作副本。除非您的图像很大,否则我怀疑在内存中制作副本会产生很大的性能差异。

【讨论】:

    【解决方案2】:

    嗯,你能用mmap吗? Haskell 有vector-mmap,它将文件映射到只读或可变向量的(共享)内存中。

    【讨论】:

    • 看起来很有趣。你试过在类似的情况下使用它吗?
    • 很遗憾没有。我只是用它尝试了一些小例子,但后来不需要它。我的用例是将大型数据结构映射到文件中,以便虚拟内存管理完成这项工作。 mmap 还有一些更底层的包装器,它们适用于原始指针,也许有一种方法可以让 repa 直接使用它们。希望对repa或加速有更多了解的人可以提供信息。
    • 感谢您的反馈!现在,我正在测试 ZeroMQ。我在 haskell irc 上读到它的性能足以应付这种情况。
    【解决方案3】:

    我不确定 Haskell 但在 lablqt(我用于构建 QtQuick+OCaml 应用程序的库,http://kakadu.github.io/lablqt/)我会尝试这种方法:

    1. 我们在 OCaml/Haskell 端将图像存储为一个可变的字符数组(在 OCaml 中称为字符串),并防止 GC 移动该值。
    2. 在 C++ 端,我们存储图像的地址并使用它来构建 QString。我不希望有任何复制,因为 QString 使用写时复制。
    3. 利润

    也许这种方法很糟糕,因为如果我们需要调整图像大小,GC 将实例化新图像,将旧图像复制到新图像,然后我们需要在 C++ 端更新指向图像的指针。

    对不起,在我的想法中将无法使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多