OpenGL маленькие против больших прямоугольников - PullRequest
0 голосов
/ 30 марта 2012

Почему прямоугольник 800x600 в OpenGL занимает намного больше времени, чем многие маленькие прямоугольники? Я бы подумал, что рисунок 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, я получаю 1000 лучших кадров в секунду, чем когда false?

1 Ответ

3 голосов
/ 13 апреля 2012

Это очень глубокий вопрос и очень зависит от оборудования.Однако обратите внимание, что в вашем случае координаты текстуры являются фиксированными.Это означает, что ваши меньшие прямоугольники рисуют меньшие версии текстуры.Скорее всего, ваши текстуры используют mipmapping.Mipmapping имеет меньшие версии текстуры, когда вы отображаете текстуру меньше, чем вы здесь.

Таким образом, чем меньше ваши прямоугольники, тем меньше данных вы фактически получите в результате.Это называется извлечением текстуры, и часто ее издержки намного больше, чем обработка вершин.Так что да, вы обрабатываете больше вершин, вы рисуете примерно одинаковое количество пикселей, и вы делаете то же самое количество выборок текстур - но ваша выборка текстур, скорее всего, полностью в текстовом кеше, так что это намного быстреедля доступа.

Вам нужно сравнить яблоки и яблоки - сделать вывод точно таким же, а затем посмотреть, какая техника быстрее.

Другой пример - на графическом оборудовании PS3 есть определенныйшаблон мозаичного отображения в полноэкранном режиме, который заставляет распределитель четырех квадратов шейдеров лучше распределять работу между элементами затенения фрагментов.Точно так же это может быть с вашей видеокартой.Это трудно понять и понять, особенно когда производителям не нравится раскрывать все свои секреты.

...