これは、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 回以上呼び出すと CPU 使用率が 200% になります (4 コア、1 ~ 2 回の呼び出し = 25%、3 回以上の呼び出し) = 50%、50% を超えることはできないと思います..)
これを効率的に行う他の方法はありますか?フレームごとにその関数への呼び出しを 4 回使用しているので、シーンにレンダリングする必要がある領域を把握しています (画面の各コーナーから取得します)。
また、マウスでどこを指しているかを知るためにも使っているのでリアルタイムで必要なのですが、1回の呼び出しでもシングルコアで100%使えるのでCPUの使用を減らしたいです。
編集
glPushName() メソッドを試してみましたが、CPU よりも GPU の方が遅く、遅くなる可能性が高くなります。また、プログラムで glReadPixels() 呼び出しを 1 回も使用しない場合、CPU 使用率は 0 ~ 1% 程度です。奇妙なことは、CPU使用率が高くなることですが、100%の使用率で期待するようにプログラムが遅れることはありません...プログラムがオンになっているときに他のプログラムを使用すると問題が発生し、それらを使用するのが遅くなります.