这是我用来在 3d 场景中获取鼠标位置的代码:
void GetOGLPos(int x, int y, GLdouble &pX, GLdouble &pY, GLdouble &pZ){
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glGetIntegerv(GL_VIEWPORT, viewport);
winX = (float)x;
winY = (float)viewport[3]-(float)y;
glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &pX, &pY, &pZ);
}
但我注意到一件坏事......每帧对该函数进行 1-2 次调用使 CPU 使用率达到 100%,3 次或更多调用 200% CPU 使用率(我有 4 个内核,1-2 次调用 = 25%,3 次或更多调用= 50%,我想我不能让它高于 50%..)
有没有其他方法可以有效地做到这一点?我每帧使用 4 次调用该函数,所以我知道我应该为我的场景渲染哪些区域(我从每个屏幕角落获取它们)。
我也用它来知道我用鼠标指向哪个地方,所以我需要它实时,但我想使用更少的 CPU,因为即使只有 1 个调用,它也能 100% 使用单核系统。
编辑
我已经尝试过 glPushName() 方法,但它甚至更慢,在我的 GPU 中比在 CPU 中更慢。此外,当我在程序中不使用单个 glReadPixels() 调用时,我的 CPU 使用率只有 0-1%。奇怪的是我得到了很高的 CPU 使用率,但它并没有像你期望的 100% 使用率那样使程序滞后......唯一的问题是当我在我的程序打开时使用其他程序时,然后使用它们就会滞后.