gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:08:36 26 4
gpt4 key购买 nike

我正在使用 Java2D TextLayout 类以及 LineBreakMeasurerAttributedCharacterIterator 将一段文本绘制到一个框中。文本被换行。

分析显示代码非常慢。大多数时间都在 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 是之前设置的AttributedStringcontextg2d.getFontRenderContext()

最佳答案

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

关于performance - 如何提高 TextLayout.draw(..) 的 Java2D 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com