JOGL: Как я могу быстро нарисовать много строк - PullRequest
0 голосов
/ 16 февраля 2011

Я использую JOGL (OpenGL для Java) для своего приложения, и мне нужно рисовать тонны строк на экране одновременно, и мое текущее решение слишком медленное.Прямо сейчас я рисую строки, используя TextRenderer, используя метод draw3D, и даже для небольшого количества строк (около 300-500) он просто убивает FPS.Я начал возиться с нанесением текста на текстуры объекта, что намного быстрее, но с этим есть несколько проблем.Во-первых, для выделения всех этих текстур требуется много памяти.Во-вторых, мне нужно найти способ изменить размер текстуры, чтобы она была такой же большой, как строка, а затем сопоставить ее с объектом без растяжения.Проблема в том, что все эти тысячи ящиков используют одну модель, отображаемую со списком вызовов.Я не уверен, что возможно изменить текстурное наложение для каждого объекта в этой ситуации.

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

Итак, мой вопрос: иду ли я по правильному пути, рисуя строки на текстурах, и если да, то как я могу это сделать?преодолеть эти 2 проблемы?Или есть другой способ, который бы соответствовал моим потребностям?

1 Ответ

1 голос
/ 17 февраля 2011

В зависимости от того, как именно работает TextRenderer - вы можете использовать списки отображения для пакетирования ваших команд рисования текста.

Если TextRenderer работает, имея текстуру отдельных глифов символов и соединяя вместе строку глифа за раз: это будет хорошо. просто добавьте код для рисования текста с помощью glNewList и glEndList . Как только список определен, просто используйте glCallList , чтобы использовать его.

Если, однако, TextRenderer работает, рисуя полные строки в текстуру и используя один квадрат на строку - списки отображения могут не работать. Если строки в одном пакете не все помещаются в кэш TextRenderer, он удалит наименее недавно использованную, чтобы освободить место. Списки отображения воссоздают только выполненные вызовы OpenGL, поэтому работа, выполненная TextRenderer по обновлению текстуры строкового кэша, будет потеряна, и вы получите неправильный вывод. Из-за быстрого сканирования источника, я подозреваю, что TextRenderer работает таким образом.

Подводя итог: списки отображения значительно ускорят рендеринг, но только в том случае, если вы не переполните текстовую структуру кэша TextRenderer и не используете TextRenderer после того, как список отображения был определен.

Если вы не можете встретить эти ограничения, вам придется пойти немного жестче и написать свой собственный текстовый рендерер, который отображает глиф за глифом - тогда это будет тривиально кешировать выходную геометрию и очень быстро перерисовать. Вот пример такой системы здесь , с инструментом для создания шрифта здесь . Он использует LWJGL, а не JOGL, но перевод между ними будет меньше всего беспокоить вас, если вы захотите интегрировать его - он связан с управлением текстурами и т. Д.

...