- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
根据 OpenGL 文档,
3.1 glutMainLoop
glutMainLoop 进入 GLUT 事件处理循环。
用法
void glutMainLoop(void);
描述glutMainLoop 进入 GLUT 事件处理循环。在 GLUT 程序中,该例程最多应调用一次。一旦调用,此例程将永远不会返回。它将根据需要调用任何已注册的回调。
因此无论何时调用 glutMainLoop(),它都不会返回。结果,分配后我无法释放内存。我的问题是:我需要从文件中加载图像,这本书(Superbible 第 4 版)的解决方案是将这个加载文件例程放在绘图函数中。但是,我意识到由于多次打开和关闭文件,这种方法太昂贵了。记忆起我在学习B-tree时的数据结构课,访问外部资源的成本是相当大的,所以我尽量避免。所以我的替代解决方案是将这个加载图像例程放在只调用一次的设置场景函数中。但是现在我面临另一个问题,由于 glutMainLoop
,我无法删除内存。在这种情况下我能做什么?我是 openGL 的新手,所以我真的不知道如何处理这个特殊问题。任何想法将不胜感激。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "Utility.h"
#include "TgaHeader.h"
#include "TgaImage.h"
#include <GL/glut.h>
using namespace std;
TgaImage* image = NULL;
void setupScene() {
// set color background
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
// load image from file
image = loadTgAFile( "Fire.tga" );
}
void renderScene() {
// clear color
glClear( GL_COLOR_BUFFER_BIT );
// TGA format is 1 byte aligned
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glRasterPos2i( 0, 0 );
if( image != NULL ) {
glDrawPixels(
image->header.width,
image->header.height,
image->format,
GL_UNSIGNED_BYTE,
image->pixels
);
}
glutSwapBuffers();
}
void resizeWindow( int w, int h ) {
if( h == 0 ) {
h = 1;
}
glViewport( 0, 0, w, h );
// reset coordinate before modifying
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
// set the clipping volume
gluOrtho2D( 0.0f, w, 0.0f, h );
// reset to modelview matrix
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
int main( int argc, char** argv ) {
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 512, 512 );
glutCreateWindow( "Image" );
// register callback
glutReshapeFunc( resizeWindow );
glutDisplayFunc( renderScene );
// initialize scene
setupScene();
glutMainLoop();
// it will never reach this
delete image;
}
谢谢,
最佳答案
“推荐”机制是使用atexit
或onexit
函数来安排一个函数在程序退出时调用:
void exitProgram() {
// cleanup code
}
// then put this in main():
atexit( exitProgram );
请注意,一旦程序退出,操作系统就会清除该程序正在使用的所有资源,包括内存,因此从技术上讲,这不是内存泄漏。
关于c++ - glutMainLoop激活后如何回收内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6273275/
我刚开始使用OpenGL,似乎不容易理解glutMainLoop()的工作原理,实际上发生了什么?在任何函数调用响应之前,它是否会保持不执行任何操作? 最佳答案 它一遍又一遍地调用显示回调,在它们之间
我有一个使用glut的小程序,出于很多原因,我现在需要使用glfw。由于我从未使用过glfw,所以存在很多问题。 主要的功能是:glutDisplayFunc,glutReshapeFunc,glut
我的项目在 VBO 方面遇到了一些问题。注意:代码在尝试使用 VBO 之前运行良好。 这是错误: http://pastebin.com/6x7YWtgc 这是 gdb 回溯: http://past
我知道 glutMainLoop() 用于一遍又一遍地调用显示,保持恒定的帧速率。同时,如果我也有 glutTimerFunc(),它在最后调用 glutPostRedisplay(),那么它可以保持
在我的 OpenGL 程序中,我想使用 C++ 的“删除”宏来清理内存。但是,如您所知,当 OpenGL 窗口关闭时,它不会为“main”函数提供上下文,所以即使我编写了这样的代码: ... ...
有没有办法从 glutMainLoop() 中调用带有参数的函数?我有一个模拟,每一步都会更新一个顶点数组... 具体来说,我一直在寻找 glutIdleFunc() 作为解决方案,但它似乎不接受参数
我目前正在从事一个项目,我在 PC 上的 OpenGL 窗口中编写了一个 android 应用程序控件和对象。我有 OpenGL 窗口来做我想做的事,我从我的 android 设备获取数据以流式传输到
有人可以解释一下 glutMainLoop 是如何工作的吗?第二个问题,为什么定义 glClearColor(0.0f, 0.0f, 1.0f, 1.0f);在 glutDisplayFunc(Ren
我有一个任务... 1.- 我正在使用 openGL 显示一个矩阵数组,每个值都是一个强度,它已完成。2.- 我需要用新值刷新此窗口,但是 glutMainLoop() 没有帮助... 代码是: 无效
如果我尝试执行来自 here, the OpenGLBook 的代码,我收到此错误消息: undefined reference to glutMainLoop undefined reference
我正在编写一个 python tkinter 应用程序,它与我也在编写的 C++ 库接口(interface)。 C++ 库包含一个封装了一些 GLUT 函数的类。 我的主要功能(python)看起来
我是一名优秀的程序员,十分优秀!