OpenGL Optimization
OpenGL Optimization
我正在尝试使用OpenGL渲染3个四倍(1 bg,2个精灵)。我有以下代码:
void GLRenderer::onDrawObjects(long p_dt)
{
float _log_last_time = ELAPSED_MS;
fprintf(stdout, "-- starting draw: %.4f, dTime: %.4fn", ELAPSED_MS, ELAPSED_MS - _log_last_time);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
for(std::vector<queuedRenderable*>::iterator itr = m_displayList.begin();
itr != m_displayList.end();
itr++)
{
Sprite* spriteToRender = (*itr)->m_sprite;
float _log_last_time1 = ELAPSED_MS;
fprintf(stdout, "---- profiling object: %.4f, dTime: %.4fn", ELAPSED_MS, ELAPSED_MS - _log_last_time1);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
// glTranslate, glRotate, glScale goes here
fprintf(stdout, "---- transform done: %.4f, dTime: %.4fn", ELAPSED_MS, ELAPSED_MS - _log_last_time1);
_log_last_time1 = ELAPSED_MS;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, (*itr)->m_material->m_glId);
fprintf(stdout, "---- set material done: %.4f, dTime: %.4fn", ELAPSED_MS, ELAPSED_MS - _log_last_time1);
_log_last_time1 = ELAPSED_MS;
unsigned listIds[] = {
(*itr)->m_mesh->m_glId
};
glCallLists(1, GL_UNSIGNED_INT, listIds);
fprintf(stdout, "---- draw mesh done: %.4f, dTime: %.4fn", ELAPSED_MS, ELAPSED_MS - _log_last_time1);
_log_last_time1 = ELAPSED_MS;
}
fprintf(stdout, "-- flushing to card: %.4f, dTime: %.4fn", ELAPSED_MS, ELAPSED_MS - _log_last_time);
_log_last_time = ELAPSED_MS;
glFlush();
glFinish();
fprintf(stdout, "-- flush done: %.4f, dTime: %.4fn", ELAPSED_MS, ELAPSED_MS - _log_last_time);
_log_last_time = ELAPSED_MS;
}
,我在控制台中得到以下结果:
-- starting draw: 24000.0000, dTime: 0.0000
---- profiling object: 24014.0000, dTime: 0.0000
---- transform done: 24033.0000, dTime: 19.0000
---- set material done: 24046.0000, dTime: 0.0000
---- draw mesh done: 24066.0000, dTime: 1.0000
---- profiling object: 24084.0000, dTime: 0.0000
---- transform done: 24102.0000, dTime: 18.0000
---- set material done: 24120.0000, dTime: 0.0000
---- draw mesh done: 24305.0000, dTime: 164.0000
---- profiling object: 24319.0000, dTime: 0.0000
---- transform done: 24338.0000, dTime: 19.0000
---- set material done: 24356.0000, dTime: 0.0000
---- draw mesh done: 24375.0000, dTime: 2.0000
-- flushing to card: 24389.0000, dTime: 389.0000
-- flush done: 24424.0000, dTime: 18.0000
您可以看到,第二次四分之一的绘图花费很长(164ms)。我不知道为什么它们都是四边形。我还检查了纹理(如果是相关的话),但是它比BG小得多(第一四分之一)。如果有任何相关性,我认为第一个四边形应该绘制更长的时间,而不是第二个。
我对OpenGL来说很陌生(过去我做了很多OpenGL,但是只是初学者),所以我对自己在做什么有一些的了解。我只是不确定如何进一步优化以删除164ms的流程。
如何删除或最小化164ms的过程?
我必须注意,我正在使用Intel GMA 450机器使用Intel Atom。
让我们假设这个神秘的ELAPSED_MS
宏是一个循环精确的CPU计数器。我肯定怀疑它是因为它似乎以毫秒的大量增量跳跃,但是让我们假装是这种情况。
您的分析方法的方法是完全错误的。您没有衡量渲染四边形所需的时间。您正在测量glFinish
完成所需的时间。不能保证glFinish
会返回四边形完成渲染的那一刻。确实,它可能等待一段时间,可能是线程任务开关或其他内容。谁知道。
关键是您的分析方法是不可靠的。请停止使用它们。在OpenGL中获取分析数据的分析数据的唯一准确方法是使用计时器查询(专门设计用于测试在GPU上需要多长时间完成的操作)或使用专有扩展。
>微型封装(例如分析绘制四轮的时间)很难做到。尤其是四边形的绘图通常毫无价值。
elapsed_ms是((((float)clock())/clocks_per_sec) * 1000.0f)
这无济于事。因为即使您的方法很好,clock
也不是不是一种可靠的方法来执行任何形式的计时。您必须使用特定于平台的呼叫或平台中性库,例如C 11的Chrono(或Boost等效)。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- OpenGL ES glTexImage2D optimization
- OpenGL Optimization
- OpenGL Optimization or...?