GlMapBuffer需要越来越长

时间:2015-06-27 12:41:27

标签: c++ opengl optimization

我遇到了glMapBuffer的问题。我制作了一个简单的程序,我想实现Sprite渲染。因为对500个精灵进行500次绘制调用非常慢,所以我想使用一个大的VBO并使用新数据每帧更新它。好的是,它更快。奇怪的是,它随着程序的运行而变慢。

我描述了它,问题的根源是调用glMapbuffer需要更长时间。起初,它只使用了程序中一个刻度的几个百分点,但在一分钟后它已经是36%。探查器(VS社区)只是指向nvoglv32.DLL,但这对我来说是死路一条。

我真的不知道如何解决它。

以下是Sprite渲染器的代码: http://pastebin.com/43Yp0y0M(当我在这里复制它时,它看起来很奇怪) 和头文件:http://pastebin.com/fc0gvAUb

还有其他的东西,但你可以忽略它们,它们看起来不会导致问题。

我初始化它,然后在主循环中我基本上做:

renderer.Begin();

for(data)
   renderer.Submit(data.pos,data.dims,data.col);

renderer.End();

renderer.Render();

这是实现这样的事情的正确方法吗?我的意思是,也许我在某个地方忘记了一些重要的glCall。

我让它运行15分钟,现在只需映射缓冲区需要20ms :(我也更新了我的驱动程序,但即使这样也无济于事。

1 个答案:

答案 0 :(得分:1)

哦,愚蠢的我,试图责怪OpenGL。

错误在于num_sprites变量,它没有重置,因此每帧都增加了。然后它被用在glDrawElements中,所以我认为Opengl所做的就是重新调整缓冲区并使其变大,而不是允许访问未分配的内存。缓冲区越大,映射它就越长。

这对我来说很难找到,因为实际的错误在其他地方。 所以,这是我的第一个更大的bug发现的故事,想知道还有多少仍然被隐藏:D