首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL小vs大矩形

OpenGL小vs大矩形
EN

Stack Overflow用户
提问于 2012-03-30 20:54:43
回答 1查看 273关注 0票数 0

为什么在OpenGL中一个800x600的矩形要比许多小矩形花这么长的时间?在我的脑海中,我会认为画1会比画很多更好。

代码语言:javascript
复制
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倍?

EN

回答 1

Stack Overflow用户

发布于 2012-04-13 21:29:37

这是一个非常深刻的问题,并且非常依赖于硬件。但是,请注意,在您的示例中,纹理坐标是固定的。这意味着较小的矩形绘制较小版本的纹理。很可能您的纹理使用mipmapping。display具有较小的纹理版本,用于将纹理显示为较小的纹理,就像您在此处一样。

因此,矩形越小,实际访问的数据就越少。这就是所谓的纹理抓取,通常它的开销远远大于顶点处理。因此,是的,您正在处理更多的顶点,绘制大约相同数量的像素,并且执行相同数量的纹理提取--但是您的纹理提取很可能完全在纹理缓存中,因此访问速度要快得多。

您需要比较苹果和苹果--使输出看起来完全相同,然后看看哪种技术更快。

另一个例子--在PS3图形硬件上,有一种全屏平铺绘图的特定模式,这会导致着色器四元分配器更好地将工作分配给碎片着色单元。同样,它也可以与您的显卡。这很难知道,也很难理解,特别是当制造商不喜欢泄露所有秘密的时候。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9943401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档