对于最终的项目,我和我的朋友正在制作游戏。我们使用GLUT(我知道,不是最好的选择)。我们想要做的是为不同的游戏模式(例如闪屏,菜单屏幕,游戏屏幕等)提供多种显示回调函数,所以当游戏模式改变时,我们改变回调。所以实际上,就像在GLUT运行时能够调用glutDisplayFunc
一样。这可能吗?我们不愿意在整体显示功能中使用巨大的if/switch语句,因为我们认为它可能会影响性能。如果这种担忧没有根据,请说出口!在GLUT中切换显示回调
回答
我们不愿意在总体显示函数中使用巨大的if/switch语句,因为我们认为这会影响性能。
它当然不是最好的编码风格,但性能不是一个参数。
你可以使你自己的系统模拟glutDisplayFunc
,就像epicGameDisplayFunc
那样改变函数指针到传递的函数。
glutDisplayFunc需要一个指向显示场景的指针作为参数。使用多个显示功能最简单的方法是简单地使用要切换到的显示器场景功能指针调用glutDisplayFunc。
即
void render1() {
//.. display something
}
void render2() {
//.. display something else
}
//...
void someEvent() {
if(iWantToRender1) {
glutDisplayFunc(render1);
glutIdleFunc(render1);
} else {
glutDisplayFunc(render2);
glutIdleFunc(render2);
}
}
这比因为它改变调用哪个函数使用的if/else在render1/render2不同。如果你看看GLUT的文档,http://www.opengl.org/resources/libraries/glut/spec3/node46.html glutDisplayFunc改变了当前窗口的显示函数,而不是像glutTimerFunc那样执行某些东西来运行。
这个问题有点古怪,但我偶然发现了这个答案,同时寻找一个完全相同的问题的解决方案。
我认为,更优雅的方法是使用函数指针。首先,创建一个函数指针(可能是全球性的):
void (*foo)(void);
后
,您将创建不同的绘图功能,例如:
void draw_1()
{
/* Draw fancy stuff */
}
void draw_2()
{
/* Draw other fancy stuff */
}
现在你需要一个“主循环,主循环” - 功能,这是由glutMainLoop称为是指指针:
void mainloop_mainloop()
{
(*foo)();
}
正如我所说的,这个功能必须是你的glutMainLoop,所以将其设置:
glutDisplayFunc(mainloop_mainloop);
glutIdleFunc(mainloop_mainloop);
当然,你必须某处设置你的函数指针:
foo = &draw_1;
如果您现在想切换到另一个绘图环境,你只需要改变的指针。例如,您可以在菜单中执行此操作:
if (menuentry==1) foo = &draw_1;
if (menuentry==2) foo = &draw_2;
等等......
这使您能够保持在glut mainloop中,而不会弄乱显示功能,并且性能也不会受到影响,因为您只设置了if/switch一次。你只需要一个额外的函数调用,考虑到用于绘制你的东西的函数调用的数量,每个单独的帧都应该是可以忽略的...
- 1. 在GLUT中显示变量
- 2. 切换显示
- 3. GLUT只运行一次显示回调,不输出到终端
- 4. JavaScript切换显示
- 5. React.js切换显示
- 6. 切换TR显示
- 7. GLUT显示空白窗口
- 8. Glut Ortho2D投影不显示
- 9. 切换显示不工作
- 10. 切换显示javascript香草
- 11. Bootstrap- Navbar切换不显示
- 12. 切换 - 隐藏并显示
- 13. jQuery的切换并显示
- 14. 切换Dojo dijit的显示
- 15. 切换添加显示无?
- 16. Fullcalendar在切换回月时无法显示新事件
- 17. - (void)keyboardWas在切换到另一个UITextField时未显示调用
- 18. 切换(隐藏/显示)在Extjs4
- 19. 在显示的数据之间切换
- 20. 饼干在显示/隐藏DIV切换
- 21. Qtoolbar切换显示隐藏在Qmenu
- 22. 内部glutMainLoop(OpenGL的/ GLUT变化回调)
- 23. GLUT键盘回调问题C
- 24. JQuery noob:在悬停时显示div,单击以切换显示
- 25. 将对象用于Glut显示功能
- 26. 显示计时器GLUT游戏
- 27. 切换回SupportMapFragment显示一个空白活动
- 28. 如何在GLUT中调度函数
- 29. 使用回调滚动切换
- 30. 显示成功后每个div的确切结果AJAX回调