Как я могу улучшить производительность Java2D TextLayout.draw (..) - PullRequest
3 голосов
/ 13 июля 2010

Я использую класс Java2D TextLayout вместе с LineBreakMeasurer и AttributedCharacterIterator для рисования фрагмента текста в поле. Текст завернут.

Профилирование показывает мне, что код очень медленный. Большую часть времени теряется в методе TextLayout.draw(..).

У кого-нибудь есть предложения по улучшению скорости?

    // Get iterator for string
    AttributedCharacterIterator iterator = attribText.getIterator();

    // Create measurer
    LineBreakMeasurer measurer = new LineBreakMeasurer(iterator, context);

    // loop over the lines
    int i = 1;
    while (measurer.getPosition() < iterator.getEndIndex()) {
        // Get line
        TextLayout textLayout = measurer.nextLayout(w);

        // get measurements
        float ascent  = textLayout.getAscent();
        float descent = textLayout.getDescent();
        float leading = textLayout.getLeading();
        float size    = ascent + descent;

        // Move down to baseline
        if( i == 1 ) {
            if( coverType == CoverType.SPINE ) {
                y = (box.height-size)/2;
                y -= (size+leading)*(lines-1)/2;
            } else if( vAlign == Alignment.Center ) {
                y += (h-size)/2-(size+leading)*(lines-1)/2;
            } else if( vAlign == Alignment.Bottom ) {
                y += (h-size) - (size+leading)*(lines-1);
            }
        }
        y += ascent;

        // calculate starting point for alignment
        float paintX = x;
        switch( hAlign ) {
            case Right: {
                paintX = x + w - textLayout.getVisibleAdvance();
                break;
            }
            case Center: {
                paintX = x + (w - textLayout.getVisibleAdvance())/2;
                break;
            }
        }

        // Draw line
        textLayout.draw(g2d, paintX, y);

        // Move down to top of next line
        y += descent + leading;
        i++;
    }

Соответствующий фрагмент кода показан выше. attribText - это AttributtedString, установленный ранее. context это g2d.getFontRenderContext().

1 Ответ

0 голосов
/ 04 января 2011

Этот пост довольно старый, поэтому я надеюсь, что вы нашли решение, которое работает для ваших нужд.Если у вас нет здесь, есть о чем подумать.Вам нужно только нарисовать текст, который находится в видимой области.Поскольку вы знаете координату y каждой строки, легко проверить, находится ли y в пределах getVisibleRect ().Только рисование необходимого текста значительно повышает производительность (если, конечно, ваш текст длиннее одной страницы).

...