Я создаю приложение, состоящее из двух частей: QtQuick GUI (C ++) и бэкэнда Haskell, обрабатывающего изображения с использованием repa
а также accelerate
пакеты.
Я хочу, чтобы интерактивно отображать изображения в графическом интерфейсе. Я хотел бы не копировать данные, а использовать какую-то общую память или любой другой механизм, который позволил бы мне добиться максимальной производительности.
Каков наилучший способ «передавать» и отображать эти изображения в интерактивном режиме в C ++ GUI?
Я слышал о HQK
а также qtHaskell
, но поддерживает только qtquick
до v4.8 (а нам нужна v5.0 — v5.2)
Я не уверен насчет Haskell, но в lablqt (моя библиотека для сборки приложений QtQuick + OCaml, http://kakadu.github.io/lablqt/) Я бы попробовал этот метод:
Может быть, такой подход неудачен, потому что если нам понадобится изменить размер изображения, GC создаст экземпляр нового изображения, скопирует старый в новый, и после этого нам нужно будет обновить указатель на изображение на стороне C ++.
Извините, по моей идее будет непригодным для использования.
Хм, не могли бы вы использовать mmap
? Есть вектор-ММАП для Haskell, который отображает файл в (общую) память только для чтения или как изменяемый вектор.
Я бы посмотрел на FFI как вы, вероятно, могли бы избежать встраивания вашего кода на haskell непосредственно в ваш код C ++! Это также позволит вам разделить память между ними.
Вы также можете открыть канал на C ++ для своей программы на haskell и таким образом передать данные, хотя затем вы делаете копию в памяти. Если ваши изображения не будут огромными, я сомневаюсь, что создание копии в памяти сильно повлияет на производительность.