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);
}

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

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调用中只加载一次字体,然后在渲染时只引用TrueTypeFont。

请记住,渲染是一个对性能非常敏感的调用,在该方法中创建实例或流并加载(以及在update(…)中)可能会大大降低你的FPS速率,应该避免。

此外,每次渲染调用都创建一个新的Text实例:

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

这里也是,在开始时创建一次,或者,更好的是,只是将String传递给drawString方法来绘制,而不是使用像Text这样的包装对象。

最新更新