为什么OpenGL中的800x600矩形比许多小矩形花费的时间长得多?在我看来,我认为绘图1会比许多人好。
public class LWJGLtest {
int screenwidth = 1024;
int screenheight = 768;
private Texture texture;
int[][] Star1 = new int[100][2];
public void start() {
try {
Display.setDisplayMode(new DisplayMode(screenwidth, screenheight));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
System.exit(0);
}
for (int r = 0; r < Star1.length; r++) {
Star1[r][0] = (int) (screenwidth * Math.random());
Star1[r][1] = (int) (screenheight * Math.random());
for (int c = 0; c < Star1[r].length; c++) {
System.out.print(" " + Star1[r][c]);
}
System.out.println("");
}
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, screenwidth, screenheight, 0, 1, -1);
try {
texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("fighter.png"));
} catch (IOException ex) {
Logger.getLogger(LWJGLtest.class.getName()).log(Level.SEVERE, null, ex);
}
//////////////////
boolean bsmall = false;
////////////////////
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1f, 0f, 0f);
if (bsmall) {
for (int i = 0; i < 100; i++) {
int x = (int) (screenwidth * Math.random());
int y = (int) (screenheight * Math.random());
DrawImage(texture, x, y, 30, 30);
//DrawRect(x, y, screenwidth, screenheight);
}
} else {
for (int i = 0; i < 1; i++) {
int x = 0;//(int) (screenwidth * Math.random());
int y = 0;//(int) (screenheight * Math.random());
DrawImage(texture, x, y, screenwidth, screenheight);
//DrawRect(x, y, screenwidth, screenheight);
}
}
Display.update();
}
Display.destroy();
}
void DrawImage(Texture tex, int x, int y, int w, int h) {
if (tex == null) {
return;
}
tex.bind();
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(x, y);
glTexCoord2f(1, 0);
glVertex2f(x + w, y);
glTexCoord2f(1, 1);
glVertex2f(x + w, y + h);
glTexCoord2f(0, 1);
glVertex2f(x, y + h);
glEnd();
}
public static void main(String[] argv) {
LWJGLtest displayExample = new LWJGLtest();
displayExample.start();
}
}
当bsmall == true时,我得到的fps比假的时候好1000?
答案 0 :(得分:3)
这是一个非常深刻的问题,并且非常依赖于硬件。但是,请注意,在您的情况下,纹理坐标是固定的。这意味着您的较小矩形绘制较小版本的纹理。可能你的纹理使用mipmapping。当您将纹理显示为像您在这里一样小时,Mipmapping具有较小版本的纹理。
因此,矩形越小,实际上最终访问的数据就越少。这称为纹理提取,并且其开销通常远大于顶点处理。所以是的,你正在处理更多的顶点,你正在绘制相同数量的像素,并且你正在进行相同数量的纹理提取 - 但你的纹理提取很可能完全在纹理缓存中,所以它的速度要快得多访问。
你需要比较苹果和苹果 - 让输出看起来完全一样,然后看看哪种技术更快。
另一个例子 - 在PS3图形硬件上,有一种平铺全屏幕绘制的模式,导致着色器四分配器更好地将工作分配给片段着色单元。同样,它可能与你的显卡。这很难知道,也很难理解,特别是当制造商不喜欢泄露他们所有的秘密时。