当您想要漂亮的GUI时,但gpu不是

通常,运行中的实用程序不需要健全的UI,带有按钮,列表,窗口,鼠标支持和其他小东西,大多数运行中的愿望清单都可以打包在脚本中,有时还可以使用--help参数运行它们,从配置的角度来看,这甚至会更加正确。和缩放。 当不仅开发团队而且第三方人员开始使用这些工具时,一切都会变得更糟。 而且他们并不总是准备深入研究代码行中所提出的和谐思想。 然后,您必须大惊小怪的UI,开发人员通常会使其变得简单,方形,功能齐全且完全无聊。 前段时间,我正在研究一个小型通风/加热/摄像头控制系统,还研究了地下停车场的“戴黄色头盔的叔叔会想到什么”。



(这里是来自UI系统的图片,但是开发人员要求将其删除。如果您不想阅读rake字段上的游走,请在文章末尾链接到github)

该系统基于中文非名称SoC构建,制造商决定为此移植第一版的SDL框架。 内部工具和脚本的定型程度使得它们变成带有标签,列表,弹出窗口,阴影,渐变,透明度和其他优点的沉重且“美丽”的布局。

为了实现所有的美,nanogui被选择了,简单而朴实,同时“强大”了所有需要的东西。 它完全在纸上,但是沟壑忘了OpenGL。 几乎完全实现的UI控制系统开始在硬件上运行,并且出现黑屏,所有OpenGL3初始化都没有错误,设置了缓冲区,并且编译了着色器,但没有黑屏,看上去没有什么角度。

首先,他们犯了错误的手,然后是负责驱动程序和硬件的Antokha开发人员的手,然后从SoC SDK启动了一个三角形渲染的测试示例,然后通常最后阅读黑屏,文档和示例。

我和我的同事认为有什么问题,先去了中文论坛,还没有为开发人员找到明确的答案,答案令人失望,没有opengl的实现,而且很可能不会,因为该生产线已经停产了。
-但是SDL框架呢? -我们问
-我们将像素逐个绘制到视频存储器中。 -我们的中国朋友回答了我们。

那天,我看到一位程序员的悲伤眼睛,他计算出他将发送给/ dev / null的LoC数量。 但是,抛出一个现成的解决方案是非常令人失望的, (在Internet上有很多东西)事实证明,即使在OpenGL上的nanogui上也不需要软件渲染就可以生活。

在中国的工程奇迹中,在大型PC上每秒钟只有几秒钟的寿命,结果是非常缓慢的,绘制时间已经是20-25秒。 然后,他们决定不立即渲染整个UI,而是仅渲染窗口小部件的必要部分(已更改),但是即使在这种模式下,经过所有的修改和优化,每帧也要花费10秒钟以上,这是不可行的...

抽了一些SDK示例后,我们发现将现成的纹理复制到视频内存是“即时的”(当然是10秒),并且不透明需要大约1ms到512x512,而透明则需要2ms,如果您一次又一次地复制这些纹理,时间非线性地灾难性地增长,这是由于视频存储缓冲区的数量有限所致,其溢出导致刷新缓冲区并渲染屏幕上的内容(不是我的,它已经存在),即 对于一个不完全失效的接口,我们每帧只能复制不超过50-100个纹理,并且不能立即复制,而只能在等待视频驱动程序从缓冲区中获取数据后复制。

下一个迭代是将小部件渲染为流中自己的纹理,并且在创建纹理时,仅以正方形方式绘制与最终结果大致相似的小部件,以绘制各种线条,形状可以立即在视频内存中免费显示。

几乎打败了中国人“没有” GPU的奇迹,您仍然不能说20 FPS是一个不错的结果,并且几乎完成了该项目后,我请求客户许可以获取一些开源经验。 第一个SDL现在不是很流行,因此决定在SDL2上以软件模式使用nanogui渲染并将其放在github上。 也许有人会需要:)

阅读完文章后,%habruiser%有权询问为什么有必要阻止这一堆代码
圆角和阴影? 首先,它很漂亮,其次,“那个戴黄色头盔的叔叔”已经为系统的开发付出了代价,不幸的是(或幸运的是)最终出现在任务列表中,仍然需要使它们带有渐变并添加一些阴影。

这是2017年阳光明媚的索契(Sochi)的原始夏天。

这就是OpenGL渲染的方式



这就是软件在PC上呈现的方式



参考文献

原始wjakob / nanogui
NanoVG软件渲染
NanoGUI + SDL +软件渲染

PS不要相信中国开发人员在谈论系统中存在OpenGL,请检查所有组件的性能,以了解如何:)

Source: https://habr.com/ru/post/zh-CN468485/


All Articles