Добавление сигналов / слотов (QObject) в QGraphicsItem: снижение производительности?
Я хочу добавить сигналы / слоты в QGraphicsItem, чтобы я мог связаться с QGraphicsItemObjects из другого потока. Есть две опции, которые я знаю: использовать QGraphicsObject или наследовать от QObject и QGraphicsItem.
Использование QGraphicsObject
Предполагается, что это медленно. В соответствии с этим ответом на stackru QGraphicsObjects являются медленными из-за их реализации. Когда я смотрю на источник QGraphicsObjects, я вижу много сигналов, излучаемых в соответствии с изменениями, внесенными в объект. Для меня это кажется правдоподобным аргументом, почему QGraphicsObjects медленны, но я думаю, что этого снижения производительности (если оно действительно таковое) можно избежать с помощью второго решения.
Наследование от QObject и QGraphicsItem.
При создании класса, который наследуется от QObject и QGraphicsItem, кажется, что вы получаете наиболее интересную особенность QGraphicsObject за вычетом снижения производительности: вы можете определять слоты и излучать сигналы в своем классе, но вы не наследуете реализацию QGraphicsObject по умолчанию, которая будет постоянно излучать сигналы об изменениях, которые могут вас не интересовать. Теперь вы можете излучать сигналы, но вам не нужно беспокоиться о том, что сигналы излучаются из-за того, что вас не волнует (значение x, которое изменяется, генерирует сигнал в QGraphicsObject, но не в этом решении).
Резюме моего вопроса
- QGraphicsObjects действительно медленнее, чем QGraphicsItems?
- Если да, то потому ли, что реализация испускает сигналы (а испускание сигналов сильно ухудшает производительность)?
- И если да, то второе решение (множественное наследование) позволяет избежать этого штрафа?
2 ответа
Этот поток предлагает другой вариант: создать подкласс QObject для передачи сигналов от имени ваших QGraphicsItems.
Если у вас есть много QGraphicsItems, которые могут совместно использовать один QObject, то это будет легче, чем если бы каждый QGraphicsItem наследовал QObject.
QGraphicsObjects действительно медленнее, чем QGraphicsItems?
Да. Ваш анализ верен. QGraphicsObjects медленнее из-за сигнализации, которую они выполняют. Они также имеют большие накладные расходы памяти, потому что они наследуются от QObject, что может значительно повлиять на производительность, если создается много объектов QGraphicsObject.
Если да, то потому ли, что реализация испускает сигналы (а испускание сигналов сильно ухудшает производительность)?
Да, если способ использования предметов вызывает чрезмерную сигнализацию. Однако излучение сигналов может быть не таким дорогим, как другие операции. В своем выступлении "Qt GraphicsView in Depth" Алексис Менард говорит, что вызовы itemChange медленные и что иногда лучше прослушивать изменения напрямую. И QGraphicsItems, и QGraphicsObjects будут иметь штраф от использования itemChange.
И если да, то второе решение (множественное наследование) позволяет избежать этого штрафа?
Да. Некоторых ненужных сигналов можно избежать, унаследовав их от QGraphicsItem и QObject, и испуская сигналы только для того, что необходимо. Конечно, служебная память QObject по-прежнему будет возникать.
Вы можете изменить наследование своего класса, как показано ниже:
class GraphicalButton: общедоступный QObject, общедоступный QGraphicsItem
Затем добавьте Q_OBJECT в начало вашего класса.
теперь вы можете добавлять сигналы и слот.
Перед запуском приложения очистите и запустите qmake