绘制gl场景时CPU使用率高;来源
Heavy CPU usage when draw gl scene; origin?
既然只有窗口的大小在变化,那么我的程序需要一个完整的核心来渲染最大化窗口上的场景是否正常?
我在windows上使用c++语言的Qt 4.7来绘制150张尺寸为1754*1240的图片(组件是RGBA,每个在一个字节上)。我像这样加载我的纹理:
glGenFramebuffers(TDC_NB_IMAGE, _fborefs);
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
//initialize tex
glGenTextures(TDC_NB_IMAGE, _picrefs);
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
qDebug() << "loading texture num : " << i;
_pics[i].scale = 1.f;
_pics[i].pos.rx() = i % ((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].pos.ry() = i / ((int)sqrt((float)TDC_NB_IMAGE));
_pics[i].text.load("imgTest.png");
glBindTexture(GL_TEXTURE_2D, _picrefs[i]);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//GL_LINEAR_MIPMAP_LINEAR
glTexImage2D (GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,
TDC_IMG_WIDTH, TDC_IMG_HEIGHT, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
_pics[i].text.toImage().bits()
);
//glGenerateMipmap(GL_TEXTURE_2D);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _picrefs[i], 0);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我这样画我的场景:
glBindFramebuffer(GL_FRAMEBUFFER, _fbo);
glClear( GL_COLOR_BUFFER_BIT);
//for each image
for (int i = 0 ; i < TDC_NB_IMAGE ; i++)
{
//compute coords
if (_update)
{
//pos on 0,0
_pics[i].quad.topleft.rx() = 0;
_pics[i].quad.topleft.ry() = 0;
_pics[i].quad.topright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.topright.ry() = 0;
_pics[i].quad.botright.rx() = TDC_IMG_WIDTH;
_pics[i].quad.botright.ry() = TDC_IMG_HEIGHT;
_pics[i].quad.botleft.rx() = 0;
_pics[i].quad.botleft.ry() = TDC_IMG_HEIGHT;
//translate
QPointF dec(0, 0);
dec.rx() = _pics[i].pos.x() * TDC_IMG_WIDTH + _pics[i].pos.x() * TDC_SPACE_IMG;
dec.ry() = _pics[i].pos.y() * TDC_IMG_HEIGHT + _pics[i].pos.y() * TDC_SPACE_IMG;
_pics[i].quad.topleft += dec;
_pics[i].quad.topright += dec;
_pics[i].quad.botright += dec;
_pics[i].quad.botleft += dec;
//scale
_pics[i].quad.topleft *= _globalScale;
_pics[i].quad.topright *= _globalScale;
_pics[i].quad.botright *= _globalScale;
_pics[i].quad.botleft *= _globalScale;
_update = false;
}
//prepare tex drawing
//draw drawing area
glBindTexture (GL_TEXTURE_2D, 0);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
//draw texture
glBindTexture (GL_TEXTURE_2D, _picrefs[i]);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 0.0);glVertex3f (_pics[i].quad.topleft.x(), _pics[i].quad.topleft.y(), 0);
glTexCoord2f (1.0, 0.0);glVertex3f (_pics[i].quad.topright.x(), _pics[i].quad.topright.y(), 0);
glTexCoord2f (1.0, 1.0);glVertex3f (_pics[i].quad.botright.x(), _pics[i].quad.botright.y(), 0);
glTexCoord2f (0.0, 1.0);glVertex3f (_pics[i].quad.botleft.x(), _pics[i].quad.botleft.y(), 0);
glEnd();
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
经过一些基准测试,似乎繁重的CPU使用来自"//绘制纹理"块。实际上,有时需要0毫秒,有时需要400毫秒。总的来说,当窗口最大化时,paintGL函数渲染场景需要5秒,当窗口大小为800*600时,渲染时间接近0。
我在渲染过程中改变了比例(只修改了_globalScale),所以无论窗口大小如何,我都可以看到150张图片。图片的大小对CPU的使用没有任何影响。
我两周前开始使用OpenGL,所以我肯定错过了文档和教程中的一些东西。但是,即使我再读一遍,我也找不到解释,也找不到另一种表达这150张照片的方法。
在未来,它将有可能修改一张图片(更准确地说,这张图片的一层,这意味着更多的纹理)与图形平板电脑甚至鼠标,所以我需要提高速度。
加载按比例缩小的图像版本,以便快速渲染和降低内存压力。然后,当你放大图像的特定子集时,你可以加载全分辨率的图像并显示它们,而不是低分辨率的纹理。
相关文章:
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何确定包含路径的来源?
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 如何降低应用程序的 CPU 使用率?
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- 一段时间后 CPU 使用率高
- CMakeLists.txt:(add_executable):没有给目标提供来源:教程
- 高CPU使用率,在API桌面复制中获取帧之间具有不同的超时间隔
- GetDC ReleaseDC 在特定上下文中的高 CPU 使用率
- 从 C++11 代码中获取系统内存和 CPU 使用率
- 如何找出 Kernel32 依赖项的来源
- Rcpp - 来源Cpp - 未定义的符号
- 找不到小内存泄漏的来源
- 从模板实例化/类型推断中查找错误消息的实际来源
- 在 Visual Studio 中记录 CPU 使用率
- 安装了要来源的特征cmake目标点包括但不安装
- 如何使用C API限制Tensorflow(R1.1)中的GPU使用率
- C++如何允许等待而不会过多的 CPU 使用率
- 绘制gl场景时CPU使用率高;来源