【发布时间】:2016-10-22 00:45:48
【问题描述】:
我正在使用 GLFW 设置 OpenGL 上下文,然后通过多次初始化每个库来测试每个库的速度,并打开所有优化标志。
在我的机器上,gl3w 可以在大约 0.5 秒内被初始化 100 次:
#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 倍! p>
#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); 之后会引发分段错误,而它不应该。
【问题讨论】:
-
但是,但是,但是!我认为喷气发动机比活塞发动机快。为什么启动和停止我的喷气发动机所用的时间比启动和停止汽车发动机的时间要长?我以为喷气发动机旋转得更快?这基本上就是你问的问题。基本上,启动/停机时间与运行期间达到的速度无关。我看不出这个问题的真正目的是什么。
-
@enhzflep 你是说
gl3w使所有OpenGL 函数调用变慢? AFAIK没有区别!或者你是说 GLEW 比gl3w做得更多?我不明白你的喷气发动机和活塞发动机的类比。 -
没有。我是说你报告说 GL3W 比 GLEW 慢,但你没有尝试进行任何支持这种说法的测试。您只需测量启动时间。类比的目的是证明定时启动时间作为确定运行速度的手段是荒谬的。 ;)
-
这就是我所要求的。为什么初始化 gl3w 比初始化 GLEW 花费的时间更少。也许我只是措辞不正确。编辑:固定标题。
标签: c performance opengl glfw glew