为什么在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();
}
}当b小==为真时,我得到的fps比当为假时好1000倍?
发布于 2012-04-13 21:29:37
这是一个非常深刻的问题,并且非常依赖于硬件。但是,请注意,在您的示例中,纹理坐标是固定的。这意味着较小的矩形绘制较小版本的纹理。很可能您的纹理使用mipmapping。display具有较小的纹理版本,用于将纹理显示为较小的纹理,就像您在此处一样。
因此,矩形越小,实际访问的数据就越少。这就是所谓的纹理抓取,通常它的开销远远大于顶点处理。因此,是的,您正在处理更多的顶点,绘制大约相同数量的像素,并且执行相同数量的纹理提取--但是您的纹理提取很可能完全在纹理缓存中,因此访问速度要快得多。
您需要比较苹果和苹果--使输出看起来完全相同,然后看看哪种技术更快。
另一个例子--在PS3图形硬件上,有一种全屏平铺绘图的特定模式,这会导致着色器四元分配器更好地将工作分配给碎片着色单元。同样,它也可以与您的显卡。这很难知道,也很难理解,特别是当制造商不喜欢泄露所有秘密的时候。
https://stackoverflow.com/questions/9943401
复制相似问题