GLUT 是一个很棒的 API,它非常易于使用,但我在处理范围方面遇到了一些困难。在定义回调时,没有传递参数的选项,所以在我看来好像程序员被迫依赖全局变量,我发现这很难接受。现在我在它自己的模块中拥有所有的 GLUT 代码,在它自己的线程上运行,并定义一个静态指针,我在入口点分配给模块,如下所示:
主模块
int main( int argc, char** argv ) {
int foo;
boost::thread graphicsThread(glutMain, argc, argv, &foo);
//...
graphicsThread.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GLUT 模块
static int* FOO_REF;
int glutMain( int argc, char** argv, int* foo ) {
FOO_REF = foo;
glutInit(&argc, argv);
//etc...
Run Code Online (Sandbox Code Playgroud)
还有比这更好的解决方案吗?
如果您正在使用 freeglut 或其衍生物,并且愿意将自己限制在 freeglut 衍生物上,那么它有一个非标准扩展来准确解决问题。您可以将 avoid*与每个窗口相关联。如果您将其设为包含您想要的所有每个窗口数据的结构,则可以完全避免全局变量。
概要:
#include <GL/glut.h>
#include <GL/freeglut_ext.h>
void * glutGetWindowData();
glutSetWindowData(void *data);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |