代码之家  ›  专栏  ›  技术社区  ›  kongo09

如何提高TextLayout.draw(..)的Java2D性能

  •  3
  • kongo09  · 技术社区  · 16 年前

    我用的是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 回复  |  直到 16 年前
        1
  •  0
  •   Logan Stinger    15 年前

    这个职位是相当老了,所以我希望你已经找到了一个解决方案,为您的需要工作。如果你还没有,这里有一些事情要考虑。您只需要绘制可见区域内的文本。因为您知道每条线的y坐标,所以很容易检查y是否位于getVisibleRect()的范围内。仅绘制必要的文本可以极大地提高性能(当然,假设您的文本比单个页面长)。