LWJGL文本问题和帧率下降

时间:2014-07-24 08:19:46

标签: java fonts lwjgl

在LWJGL中我将文本添加到我的人机界面。完成后,程序降至约1-2FPS。我用Display.sync(60);

封顶了它

没有文字,它运行正常。有,绝对......可怕吗? 以下是我的文字来源:

import java.awt.Font;
import java.io.InputStream;

import org.newdawn.slick.Color;
import org.newdawn.slick.TrueTypeFont;
import org.newdawn.slick.util.ResourceLoader;

public class Text {

private TrueTypeFont font2;

public void drawString(String font, String string, int x, int y, Color color) {

    // TODO: Fix extreme lag issues.

    try {
        InputStream inputStream = ResourceLoader.getResourceAsStream(font);
        Font awtFont = Font.createFont(Font.TRUETYPE_FONT, inputStream);
        awtFont = awtFont.deriveFont(24f); // set font size
        font2 = new TrueTypeFont(awtFont, false);

        Color.white.bind();
        font2.drawString(x, y, string, color);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

不要完全想要发布我的游戏来源,而是显示文本的代码。

    // Initialization code OpenGL
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    Text t = new Text();
    t.drawString("res/Minecraftia.ttf", "test", 0, 0, Color.yellow);

修改

    // Initialization code OpenGL
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClear(GL_COLOR_BUFFER_BIT);



    while (!Display.isCloseRequested()) {
        // Render


        init();
        input();
        grid.draw();
        drawSelectionBox();
        Display.update();
        Display.sync(60);
    }

    Display.destroy();
    System.exit(0);
}
private void init() {
    // This is what i'm meant to do????
    Text t = new Text();
    t.drawString("res/Minecraftia.ttf", "test", 0, 0, Color.white);
}

再次编辑:(希望不要太久)

public Boot() {
    try {
        Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
        Display.setTitle("Test Program.");
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
    }

    grid = new BlockGrid();

    // Initialization code OpenGL
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClear(GL_COLOR_BUFFER_BIT);

    init();
    input();
    grid.draw();
    drawSelectionBox();
    Display.update();


    Text t = new Text();
    t.drawString("res/Minecraftia.ttf", "test", 0, 0, Color.white);

    while (!Display.isCloseRequested()) {
        // Render


        init();
        input();
        grid.draw();
        drawSelectionBox();
        //Display.update();
        Display.sync(60);
    }

    Display.destroy();
    System.exit(0);
}

1 个答案:

答案 0 :(得分:0)

因为您读取了整个字体并在每次渲染调用中创建它。

public void drawString(String font, String string, int x, int y, Color color) {

try {
    //You create a new resource stream and load a file
    InputStream inputStream = ResourceLoader.getResourceAsStream(font); // <-- slow

    //You create a new Fonts and load it out of the input stream
    Font awtFont = Font.createFont(Font.TRUETYPE_FONT, inputStream); // <-- extremely slow

    //You create a new TrueTypeFont out of it 
    awtFont = awtFont.deriveFont(24f); // set font size
    font2 = new TrueTypeFont(awtFont, false); // <-- slow

    Color.white.bind();
    font2.drawString(x, y, string, color);
} catch (Exception e) {
    e.printStackTrace();
}
}

相反,你应该在init调用中只进行一次Font加载,然后在渲染时只引用TrueTypeFont。

请记住,渲染是一种性能非常敏感的调用,并且在该方法中创建实例或流并加载(并且在更新(..)中也会大幅降低您的FPS速率,应该避免。

<强>更新

此外,您还要在每个渲染调用中创建一个新的Text实例:

Text t = new Text();
t.drawString("res/Minecraftia.ttf", "test", 0, 0, Color.yellow);

在这里,也可以在开头创建一次,或者更好的是,只需传递String以绘制到drawString方法,而不是像Text那样使用包装器对象。