gpt4 book ai didi

c++ - 当对象在屏幕空间中较小时,OpenGL 更新缓慢

转载 作者:太空宇宙 更新时间:2023-11-04 14:33:19 24 4
gpt4 key购买 nike

我正在 Linux 上使用 X11 学习 OpenGL,遇到了一个问题,我没有意识到问题出在哪里。

当我在屏幕上绘制覆盖大空间的对象时,它会快速渲染并以高帧率更新到 X11。但是当我将相机远离物体或绘制一个小物体时,它会覆盖屏幕上的小空间(例如,像素区域),它更新得非常慢。它绘制得越小,更新框架的速度越慢。

当我距离 1x1 平面 100 个单位时,它达到每秒 1 帧左右。

代码如下:

XGetWindowAttributes(dpy, win, &gwa);
glViewport(0, 0, Width, Height);
SetupViewMatrix();

Camera * cam = mainCamera.GetComponent<Camera>();
if(cam != NULL){
CamPose(cam->eyePose, cam->pivotPoint, cam->upDirection);
} else {
CamPose(Vector3::back(), Vector3::forward(), Vector3::up());
}
//glViewport(0, 0, gwa.width, gwa.height);

ClearScreen();

GLfloat cube[] = {
-0.05f, -0.05f, -0.05f,
-0.05f, 0.05f, -0.05f,
0.05f, 0.05f, -0.05f,
-0.05f, -0.05f, -0.05f,
0.05f, 0.05f, -0.05f,
0.05f, -0.05f, -0.05f,
};//*/
GLfloat colors[] = {
0.5f, 0.5f, 0.5f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f,

0.5f, 0.5f, 0.5f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f,
};//*/

glVertexPointer(3, GL_FLOAT, 0, cube);
glColorPointer(4, GL_FLOAT, 0, colors);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

glXSwapBuffers(dpy, win);
glFlush();

和 SetupViewMatrix 函数:

void WindowDrawer::SetupViewMatrix(){
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65, (float)Width/Height, 0.1, 1000);
};

和 ClearScreen 函数:

void WindowDrawer::ClearScreen(){
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

编辑: 我正在添加更多代码来提供帮助。 这是我用来创建窗口的 Init 函数:

void WindowDrawer::InitX11OpenGL(){
dpy = XOpenDisplay(NULL);
if(dpy == NULL){
printf("\n\tCannot Connect to X server\n\n");
exit(0);
}
root = DefaultRootWindow(dpy);

vi = glXChooseVisual(dpy, 0, att);
if(vi == NULL){
printf("\n\tno appropriate visual found\n\n");
exit(0);
} else {
printf("\nvisual %p selected\n", (void *)vi->visualid);
}
cmap = XCreateColormap(dpy, root, vi->visual, AllocNone);
swa.colormap = cmap;
swa.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask;

win = XCreateWindow(dpy, root, 0, 0, 720, 480, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa);
XMapWindow(dpy, win);
glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
glXMakeCurrent(dpy, win, glc);
glEnable(GL_DEPTH_TEST);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}

我用这个来创建事件循环:

void WindowObject::DealWithEvents(){
if(XEventsQueued(windowDrawer.dpy, QueuedAlready)){
XNextEvent(windowDrawer.dpy, &xev);
eventHandler.RouteXEvents(&xev, windowDrawer.dpy);
} else {
memset(&redrawEvent, 0, sizeof(redrawEvent));
redrawEvent.type = Expose;
redrawEvent.xexpose.window = windowDrawer.win;
XSendEvent(windowDrawer.dpy, windowDrawer.win, False, ExposureMask, &redrawEvent);
XFlush(windowDrawer.dpy);
eventHandler.RouteXEvents((XEvent *)&redrawEvent, windowDrawer.dpy);
}
};

好吧,正如我所见,这似乎不是性能问题,而是更新队列(或类似问题)的问题。因为当物体靠近相机时,比如说,它使用大屏幕空间,它会像它应该的那样绘制得更快,但当它在屏幕空间变小时,它会线性减慢屏幕更新。我正在打印 expose、keypress 和 keyrelease 的事件,所有这些事件都运行得很快,就像它应该的那样,只是屏幕区域更新不跟随系统的速度。

最佳答案

哦,我发现了错误,我正在回答我自己的问题。我很惭愧地告诉你这个,因为它像一个真正的图形新手所期望的那样愚蠢:/

问题是我在低 ppi 显示器上使用小屏幕工作。此外,屏幕上的形状是一个完美的正方形(它不会在像素上绘制对角线边缘),因此当对象较小时,需要很长时间才能重新绘制边界像素。计算机图形使用一些抗锯齿效果来平滑这种效果,而原始 opengl 没有,所以它会产生与我过去看到的完全不同的效果。我花了很长时间才意识到这只是一个像素细节问题......

谢谢大家的帮助。

关于c++ - 当对象在屏幕空间中较小时,OpenGL 更新缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44478530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com