5

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

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

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

我听说过HQKand qtHaskell,但它只支持qtquickv4.8(我们需要 v5.0 - v5.2)

4

3 回答 3

1

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

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

于 2014-01-14T07:16:10.863 回答
1

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

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

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

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

于 2013-11-07T12:14:05.213 回答
1

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

于 2013-11-08T11:21:23.417 回答