Java'nın AWT'sini kullanırken Font
nesnesini oluşturmak ne kadar pahalı? Pratikte ne zaman Font
önbellekleme yapmalıyım, ya da AWT zaten dahili olarak önbelleklenen ağır yazı tipine hafif bir referans mıdır? Eğer Yazı Tipi (Bu OpenJDK olduğu) için kaynak koduna baktığımızdaJava AWT: Yazı tipi hafif bir nesnedir mi?
cevap
, isim, stil, boyut ile kurucular besbelli hafif şunlardır:
public Font(String name, int style, int size) {
this.name = (name != null) ? name : "Default";
this.style = (style & ~0x03) == 0 ? style : 0;
this.size = size;
this.pointSize = size;
}
Ancak, dosya ve fontformat alır yapıcısı geçerli: (tabii ki ağır özellikle FontManager.createFont2D(...)
parçası. Bu yapıcı().
Kapsamlı Font.createFont tarafından kullanılır olduğu
private Font(File fontFile, int fontFormat,
boolean isCopy, CreatedFontTracker tracker)
throws FontFormatException {
this.createdFont = true;
/* Font2D instances created by this method track their font file
* so that when the Font2D is GC'd it can also remove the file.
*/
this.font2DHandle =
FontManager.createFont2D(fontFile, fontFormat,
isCopy, tracker).handle;
this.name = this.font2DHandle.font2D.getFontName(Locale.getDefault());
this.style = Font.PLAIN;
this.size = 1;
this.pointSize = 1f;
}
Eğer sisteminizde bir font kullanıyorsan, iyisin, sadece onu yarat ve ismine göre gönderme. Kendi yazı tipinizi sağlıyorsanız (örn: bir TrueType dosyasından), önbelleğe almak daha iyi olabilir. (Yani, IIRC, sadece bir dosyaya AWT'nin önbelleğine yüklenmek için bir yol var, böylece sadece isimle isimlendirebilirsiniz.)
Kaynağa daha fazla kazma, getFamily(), getFontName gibi tüm işlevler(), getNumGlyphs(), ilk getFont2D (call) hangi temelde: her yazı kesinlikle hafif olduğunu gösterir, bu yüzden
private Font2D getFont2D() {
// snip
if (font2DHandle == null) {
font2DHandle =
FontManager.findFont2D(name, style,
FontManager.LOGICAL_FALLBACK).handle;
}
/* Do not cache the de-referenced font2D. It must be explicitly
* de-referenced to pick up a valid font in the event that the
* original one is marked invalid
*/
return font2DHandle.font2D;
}
ve yazı önbelleğe sorumlu olan FontManager gerekli bilgileri çekmektedir .