Альфа-смешивание SWT draw2d

Я ищу способ рисования полупрозрачных фигур в рамках draw2d. В настоящее время я использую setAlpha() из org.eclipse.draw2d.Graphics. Проблема в том, что он тормозит весь UI, если я рисую более одной полупрозрачной фигуры.

Вот еще один вопрос, касающийся его производительности [1]. Он нацелен на SWT на Linux, я ориентируюсь как на Linux, так и на Windows. Система Windows (Win7) имеет графическую карту с поддержкой 3D и i7 q720. Linux-машина оснащена еще лучше и поддерживает 3D, так что я думаю, что это не проблема производительности платформы.

У меня вопрос: есть ли эффективный способ добиться альфа-смешивания в draw2d?

Я пытался использовать OpenGL соответственно LWJGL. Поскольку draw2d и OpenGL нельзя смешивать, и я должен полагаться на draw2d, я подумал, что могу сделать что-то вроде этого: draw2d -> OpenGL -> draw2d здесь, где canvas — это холст, на котором происходит рисование OpenGL, а c1 — это холст, на котором я хочу получить нарисованное изображение OpenGL. Но моя попытка скопировать рисунки OpenGL не работает, я получаю только базовый фон Canvas (canvas). Кроме того, я не уверен, что это улучшит "производительность" в любом случае...

Спасибо,
atx


person atx    schedule 01.06.2011    source источник


Ответы (2)


Эта проблема известна, но не решена. В списке рассылки draw2d есть обсуждение по этой проблеме: список рассылки

TL;DR: возможное решение было исключено из-за проблем с лицензией между LWJGL и Eclipse.

person atx    schedule 19.10.2011

Убедитесь, что все ваши изображения src/dest имеют одинаковую глубину (например, ARGB). В противном случае во время копирования происходят дорогостоящие преобразования (src->dest).

GC не разрешают доступ к своим базовым буферам, на самом деле. MemoryImageSource может быть подходящим вариантом.

Вы можете получить свои изображения рисования OpenGL, используя что-то вроде:

BufferedImage capture  = new Robot().createScreenCapture(new Rectangle( canvas.getX(), canvas.getY(), canvas.getWidth(), canvas.getHeight() ) );

Как-то муторно, но очень быстро.

Я использую его для сохранения jpeg-файлов моих живых анимационных кадров в папку.

Затем VirtualDub создает фильм из кадров. Придется поиграться с частотой кадров ;)

Отлично подходит для создания тизеров YouTube! Вы можете увидеть его здесь!

person Dominic Cerisano    schedule 16.12.2011
comment
Спасибо за совет! Я решил свою проблему, реализовав наполовину готовую реализацию LwjglGraphics org.eclipse.draw3d и интегрировав ее в org.eclipse.draw2d. работает как шарм. - person atx; 10.01.2012