#c #performance #opengl #glfw #glew
#c #Производительность #opengl #glfw #glew
Вопрос:
Я использую GLFW для установки контекста OpenGL, а затем проверяю скорость каждой библиотеки, инициализируя ее несколько раз со всеми включенными флагами оптимизации.
На моей машине gl3w можно инициализировать 100 раз примерно за 0,5 секунды:
#include "gl3w.h"
#include <GLFW/glfw3.h>
int main(void)
{
if (!glfwInit()) return 1;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow *win = glfwCreateWindow(960, 540, "Title", NULL, NULL);
if (!win) return 2;
glfwMakeContextCurrent(win);
for (int i = 0; i < 100; i) if (gl3wInit()) return 3;
if (!gl3wIsSupported(3, 3)) return 4;
glfwDestroyWindow(win);
glfwTerminate();
return 0;
}
При инициализации GLEW 100 раз требуется около 2,5 секунды, что делает процесс примерно в 5 раз медленнее!
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(void)
{
if (!glfwInit()) return 1;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow *win = glfwCreateWindow(960, 540, "Title", NULL, NULL);
if (!win) return 2;
glfwMakeContextCurrent(win);
glewExperimental = GL_TRUE;
for (int i = 0; i < 100; i) if (glewInit()) return 3;
glfwDestroyWindow(win);
glfwTerminate();
return 0;
}
Я очень удивлен этим, поскольку обе эти библиотеки предназначены для одной и той же цели. Кто-нибудь может объяснить, в чем разница?
Кстати, исключение glewExperimental = GL_TRUE;
сокращает время до 0,3 секунды, но тогда GLEW инициализируется неправильно, потому что glBindVertexArray(0);
сразу после этого возникает ошибка сегментации, хотя этого не должно быть.
Комментарии:
1. Но, но, но! Я думал, что реактивные двигатели быстрее поршневых. Почему для запуска и остановки моего реактивного двигателя требуется больше времени, чем для запуска и остановки двигателя в моей машине? Я думал, реактивные двигатели вращаются быстрее? По сути, это тот вопрос, который вы задали. В принципе, время запуска / простоя не имеет ничего общего со скоростью, достигнутой во время работы. Я не понимаю, чего на самом деле хочет достичь этот вопрос.
2. @enhzflep Вы хотите сказать, что
gl3w
это замедляет все вызовы функций OpenGL? AFAIK, разницы нет! Или вы хотите сказать, что GLEW делает больше, чемgl3w
? Я не понимаю вашей аналогии с реактивным двигателем и поршневым двигателем.3. Нет. Я говорю, что вы сообщаете, что GL3W работает медленнее, чем GLEW, но при этом не предпринимаете попыток провести какой-либо тест, подтверждающий такое утверждение. Вы просто измеряете время запуска. Смысл аналогии состоял в том, чтобы продемонстрировать нелепость синхронизации времени запуска как средства определения скорости работы. 😉
4. Это то, о чем я прошу. Почему инициализация gl3w занимает меньше времени, чем инициализация GLEW. Возможно, я просто неправильно сформулировал это. Редактировать: исправлено название.
Ответ №1:
Потому что GLEW выполняет больше работы, чем GL3W.
GL3W состоит из только функций из заголовка OpenGL glcorearb.h
. Это содержит функции в OpenGL 4.5, а также множество расширений ARB. Это означает, что он не включает в себя другие функции расширения или неосновной профиль.
GLEW предоставляет вам все функции в реестре OpenGL. Кроме того, есть это:
glewExperimental = GL_TRUE;
Обычно GLEW проверяет, поддерживается ли определенное расширение, прежде чем пытаться загрузить его функции. Используя это, вы говорите GLEW не выполнять эту проверку. Вместо этого он попытается загрузить каждую функцию, независимо от того, указано расширение или нет.
Возможно, вам сказали, что вы должны использовать этот переключатель. Это больше не так.
Смотрите, OpenGL 3.0 изменил способ тестирования расширений в OpenGL. И, таким образом, старый метод устарел и, следовательно, был удален в 3.1 и core profile 3.2 .
Однако GLEW продолжал использовать старую функциональность тестирования расширений. Таким образом, вам пришлось использовать этот переключатель, если вы хотели использовать GLEW с профилем ядра.
В GLEW 2.0, восемь лет спустя, это наконец исправлено… спустя много времени примерно полдюжины гораздо более совершенных библиотек загрузки OpenGL многократно решили проблему. Но в любом случае, суть в том, что вы не должны использовать этот переключатель с GLEW 2.0.
Комментарии:
1. Вау, это так недавно! Неудивительно, что он не включен в мои репозитории Ubuntu. Поскольку я все равно использую основной контекст, я думаю, gl3w мне будет достаточно. Спасибо, что удовлетворили мое любопытство!