Как генерировать простую 2D графику в реальном времени? - PullRequest
0 голосов
/ 22 марта 2009

Для моей стажировки по интерфейсу «мозг-компьютер» мне нужно создать очень быстрые мерцающие квадраты на ЭЛТ-мониторе (мерцание = чередование двух цветов). Частота обновления монитора составляет 85 Гц, и мы хотели бы, чтобы это было узким местом, а это значит, что перекрашивание всех квадратов может занять максимум 1000/85 = 11 мс.

Моим языком предпочтения для программирования с графическим интерфейсом и графическим интерфейсом является Java, поэтому я попытался создать прототип с AWT, потому что он синхронный (в отличие от Swing). Теперь у меня две проблемы: во-первых, измерения времени показывают, что перекрашивание даже 9 квадратов просто занимает слишком много времени. Мой алгоритм берет желаемую частоту и вычисляет время, в которое система должна перерисовываться заранее, а затем использует цикл (без задержки ожидания / ожидания), который каждый раз проверяет, достигнуто ли следующее «время», и, если это так, проходит по всем циклам. квадраты, чтобы перекрасить их. Теперь я реализовал это так: квадраты представляют собой панели с цветом фона A и содержатся в другой панели с цветом фона B, и мерцание происходит из-за изменения видимости панелей. Я подумал, что это будет быстрее, чем одна панель, которая должна рисовать прямоугольники все время. У меня нет подходящего инструмента профилирования (я не могу заставить работать Eclipse TPTP или профилировщик NetBeans), поэтому я не уверен, но у меня такое ощущение, что узкое место на самом деле не в перекрашивании, а в цикле ( с условной проверкой и т. д.). Можете ли вы порекомендовать что-нибудь о том, что я должен делать?

Вторая проблема заключается в том, что кажется, что квадраты отображаются сверху вниз. Как будто они разворачиваются очень быстро, но все же заметно. Это неприемлемо. Что мне интересно, хотя, это то, что вызывает это. Это Java / AWT, или Windows, или просто я пишу медленный алгоритм?

Можете ли вы порекомендовать мне кое-что попробовать? Я предпочитаю использовать Java, но я буду использовать C (или что-то еще), если я должен.

Ответы [ 2 ]

3 голосов
/ 22 марта 2009

Я бы избегал любых высокоуровневых «компонентов», таких как JPanels и тому подобное. Попробуйте получить Graphics2D, представляющий содержимое окна, и используйте его метод fillRect().

В противном случае вы могли бы сделать это достаточно легко в C и OpenGL. rasonly.c - это стандартная шаблонная программа, которая настраивает OpenGL для работы только в качестве растеризатора, то есть в режиме 2D. Используя это в качестве отправной точки, вы сможете запустить что-то, что рисует нужные вам «квадраты» без особых проблем.

Вы не очень хорошо описываете желаемую сцену, из этого уравнения звучит так, будто вы хотите нарисовать 100 квадратов, каждый из которых имеет свой цвет. Для максимальной производительности в OpenGL вы должны нарисовать все квадраты одного цвета вместе, чтобы минимизировать «изменения состояния» между вызовами рисования. Это, вероятно, чисто теоретический момент, поскольку рисование 100 2D-квадратов при 85 Гц действительно не должно облагать налогом OpenGL.

ОБНОВЛЕНИЕ : О, так прошло уже много лет, и в настоящее время вам, вероятно, нужно взять вышеупомянутое зерно соли и прочитать какой-нибудь современный учебник. Времена изменились. Посмотрите Vulkan API .

2 голосов
/ 22 марта 2009

(я помню демонстрацию этого с использованием микро и палитры BBC, хотя это было бы 50 кадров в секунду, а не 85, как это было в британском внутреннем телевидении)

Я бы переключился на jogl и использовал бы списки отображения. Они получают очень высокие скорости в секунду на Java.

...