gpt4 book ai didi

c++ - 优化

转载 作者:可可西里 更新时间:2023-11-01 11:13:29 25 4
gpt4 key购买 nike

我正在尝试使用 OpenGL 渲染 3 个四边形(1 个背景图,2 个 Sprite )。我有以下代码:

void GLRenderer::onDrawObjects(long p_dt)
{
float _log_last_time = ELAPSED_MS;
fprintf(stdout, "-- starting draw: %.4f, dTime: %.4f\n", 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: %.4f\n", ELAPSED_MS, ELAPSED_MS - _log_last_time1);

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

// glTranslate, glRotate, glScale goes here

fprintf(stdout, "---- transform done: %.4f, dTime: %.4f\n", 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: %.4f\n", 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: %.4f\n", ELAPSED_MS, ELAPSED_MS - _log_last_time1);
_log_last_time1 = ELAPSED_MS;
}

fprintf(stdout, "-- flushing to card: %.4f, dTime: %.4f\n", ELAPSED_MS, ELAPSED_MS - _log_last_time);
_log_last_time = ELAPSED_MS;

glFlush();
glFinish();

fprintf(stdout, "-- flush done: %.4f, dTime: %.4f\n", 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

如您所见,第二个四边形的绘制花费了很长时间(164 毫秒)。我不知道为什么会这样,因为它们都是四边形的。我还检查了纹理(如果相关),但它比 bg(第一个四边形)小很多。如果它有任何相关性,我认为第一个四边形应该画得更长,而不是第二个。

我是 OpenGL 的新手(我过去做过很多 opengl,但只是初学者)所以我对自己在做什么有一些想法。我只是不确定如何进一步优化它以删除 164 毫秒的进程。

我怎样才能删除或最小化这个 164 毫秒的过程?

我必须注意,我使用的是带有英特尔 GMA 450 机器的英特尔凌动。

最佳答案

让我们假设这个神秘的 ELAPSED_MS 宏是一个周期精确的 CPU 计数器。我很怀疑这是真的,因为它似乎以很大的毫秒增量跳跃,但让我们假装是这种情况。

您分析 OpenGL 的方法完全错误。您没有测量渲染四边形所需的时间。您正在测量完成 glFinish 所需的时间。无法保证 glFinish 会在四边形完成渲染时返回。事实上,它可能会等待很长时间,可能是为了线程任务切换或其他什么。谁知道。

重点是您的分析方法不可靠。请停止使用它们。为 OpenGL 中的实际渲染操作获取分析数据的唯一准确方法是使用 timer queries (专门设计用于测试在 GPU 上完成操作需要多长时间)或使用 proprietary extensions .

微观分析(如分析绘制四边形所需的时间)很难正确执行。尤其是四边形绘图通常不值得费心分析。

ELAPSED_MS is ((((float)clock()) / CLOCKS_PER_SEC) * 1000.0f)

这没什么用。因为即使您的方法很好,clock 也不是进行任何形式计时的可靠方法。您必须使用 platform-specific calls ,或像 C++11's chrono 这样的平台中立库(或等效的 Boost)。

关于c++ - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com