sách gpt4 ai đã đi

c++ - Tối ưu hóa

In lại 作者:可可西里 更新时间:2023-11-01 11:13:29 25 4
mua khóa gpt4 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::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 机器的英特尔凌动。

1 Câu trả lời

让我们假设这个神秘的 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
Bài viết được đề xuất: go - 使用 Go redis 客户端 (Redigo)
Bài viết được đề xuất: performance - Redis - 如果集合中有超过 x 个成员,则删除/弹出
Bài viết được đề xuất: php - Predis:两种集群策略的优缺点
Bài viết được đề xuất: php - 在 laravel redis 中设置 ZADD 命令的选项
可可西里
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com