2014-08-28 224 views
2

我基本上试图用默认的帧缓冲区像素图做些事情。当有人暂停游戏时,我希望模糊它。我的问题是,即使我为整个模糊操作使用单独的线程,也必须在呈现线程上调用ScreenUtils.getFrameBufferPixmap方法。但是这个方法需要至少1秒才能在nexus上返回5.在我的模糊处理线程上调用该方法是不可能的,因为除了渲染线程之外的任何其他线程上都没有gl上下文。getFrameBufferPixels在libgdx中花费太长时间

是否有消除失速

+0

如果我的回答帮助你解决了这个问题,请接受它;) – Elvithari 2014-09-22 09:15:42

回答

0

你想要做什么任何解决方案:采取截图,修改它的CPU上,并将它上传到GPU。这种方法有三个问题。 1.抓取像素,需要很长时间。 2.可以独立成功地为每个像素执行模糊处理,因此在CPU上执行操作毫无意义。 GPU可以一眨眼的功夫。 3.上传纹理还需要一些时间。

正确的做法是:不是将所有内容都渲染到屏幕上,而是渲染到屏幕外的纹理。 (请参阅离线渲染教程)接下来,在屏幕大小的四边形上绘制此纹理,但在绘制时使用模糊着色器。有很多示例模糊着色器可用。它应该基本上对目标像素的周围进行采样并使其平均。

+0

你没有明白我的观点。我不想让实时模糊,因为我只是在游戏暂停时显示静态背景。另外我想生成一个lerp模糊(在这里描述的效果在ios plus中使用:https://github.com/mattdesl/lwjgl-basics/wiki/Lerp-Blur-Brief。 – 2014-08-28 07:51:10

+0

@Rahul Verma:我明白了你的观点。我的观点是:抓取输出像素的速度太慢,无法顺利运行,如果坚持,尝试使用其他方法来读取它们,但是它会变得很慢,你不想实时模糊?只是暂停时按一次,在GPU上记录模糊的纹理,并在暂停处于活动状态时将其用作静态图像,不需要再应用模糊处理,如果您想在一段时间内模糊更强,您可以 – Elvithari 2014-08-28 08:09:53

+0

你似乎是正确的,事实上,随着时间的推移模糊加强问题,我可以使用mix()bw实际像素和模糊像素,并逐渐增加重量模糊像素到满,但有短暂的你会看到,软件模糊(java代码)本来可以很容易地异步执行。毫无疑问,Shader的模糊会快速减弱,但它确定它不会落后于较老的设备(功能较弱的gpus)?无论如何,它肯定会比拉动GPU的像素值更小。 – 2014-08-28 10:57:41

0

source for ScreenUtils.java你可以看到,getFrameBufferPixmap基本上是围绕OpenGL's glReadPixels的包装。你可以做的改善Java或Libgdx包装的东西并不多。这不是OpenGL优化的方向(它擅长将数据推送到GPU,而不是拉取数据)。

将当前屏幕重新渲染到(更小,屏幕外)FrameBuffer,然后再将其拉下,可能会更好。您也可以使用GPU以这种方式进行模糊处理。

我相信屏幕的格式(例如,不是RGBA8888)可能会影响读取性能。

这不是Libgdx特定的,因此对于OpenGL的任何提示或建议(如Making glReadPixel() run faster)都应该适用。

相关问题