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