Лучший способ интерактивной отправки изображений из бэкэнда Haskell в Qt QUI

Я создаю приложение, состоящее из двух частей: QtQuick GUI (C ++) и бэкэнда Haskell, обрабатывающего изображения с использованием repa а также accelerate пакеты.

Я хочу, чтобы интерактивно отображать изображения в графическом интерфейсе. Я хотел бы не копировать данные, а использовать какую-то общую память или любой другой механизм, который позволил бы мне добиться максимальной производительности.

Каков наилучший способ «передавать» и отображать эти изображения в интерактивном режиме в C ++ GUI?

Я слышал о HQK а также qtHaskell, но поддерживает только qtquick до v4.8 (а нам нужна v5.0 — v5.2)

5

Решение

Я не уверен насчет Haskell, но в lablqt (моя библиотека для сборки приложений QtQuick + OCaml, http://kakadu.github.io/lablqt/) Я бы попробовал этот метод:

  1. Мы храним изображение на стороне OCaml / Haskell как изменяемый массив символов (в OCaml это называется строкой), и мы запрещаем GC перемещать это значение.
  2. В стороне C ++ мы храним адрес нашего изображения и используем его для построения QString. Я не ожидаю никакого копирования, потому что QString использует копирование при записи.
  3. ПРИБЫЛЬ

Может быть, такой подход неудачен, потому что если нам понадобится изменить размер изображения, GC создаст экземпляр нового изображения, скопирует старый в новый, и после этого нам нужно будет обновить указатель на изображение на стороне C ++.

Извините, по моей идее будет непригодным для использования.

1

Другие решения

Хм, не могли бы вы использовать mmap? Есть вектор-ММАП для Haskell, который отображает файл в (общую) память только для чтения или как изменяемый вектор.

1

Я бы посмотрел на FFI как вы, вероятно, могли бы избежать встраивания вашего кода на haskell непосредственно в ваш код C ++! Это также позволит вам разделить память между ними.

Вы также можете открыть канал на C ++ для своей программы на haskell и таким образом передать данные, хотя затем вы делаете копию в памяти. Если ваши изображения не будут огромными, я сомневаюсь, что создание копии в памяти сильно повлияет на производительность.

1