在嵌入式环境中使用HTML渲染器

32

我正在进行一个项目,需要为嵌入式设备设计GUI,并希望使用HTML来完成。我希望你们能帮助我找到适合我的渲染引擎。

要求如下:

  • 网页必须被渲染到内存缓冲区中,然后我将把内存缓冲区传输到显示器上。

  • 通过回调或事件通知我需要重新获取资源(HTML页面,图像等)的渲染引擎。原因是我必须获取该资源并将其提供给渲染引擎(该设备并非所有配置都具备TCP/IP,因此需要通过串行线路获取资源,为了安全起见,我需要验证请求是否被允许)。

  • 我必须能够向渲染引擎注入鼠标和键盘事件。

  • 仅限C和/或C++。

  • 易于移植且不依赖于仅存在于win / linux / mac的库。 我所拥有的设备运行的是自定义操作系统...

  • 占用空间小且内存消耗少,我可能可以获得10MB的空间占用和5-10 MB的分配内存,但不要再多了。

  • 欢迎开源和商业解决方案。

  • 我不需要完全支持HTML5和CSS3,如果我只使用"基本的HTML和一些CSS",那就足够了。

我已经查看了一些WebKit、Chromium、Gecko、Berkelium和Awesomium,但并没有找到符合我的需求的。

是否有任何东西接近我所需的?或者我应该放弃这个想法,并用其他方式构建GUI?感谢任何帮助!


有趣的问题。在我看来,值得奖励。 - Niklas R
2
听起来像是:Qt嵌入式+Webkit! - masoud
“…但实际上并没有找到符合我的需求的。” - 确实,很难找到真正符合我们需求、拥有适当许可证且项目实际上是多平台管理的工具。我的公司最终决定自己编写HTML渲染器。 - marcinj
为什么会是“不具建设性”的呢? :) - mlvljr
在2021年,我们有litehtml和rmlui的选择。然而,在repo中我没有看到渲染到图像缓冲区的示例。 - moi
3个回答

31

很好的问题!事实证明,在这个领域有一些选择,正如你所猜测的那样,其中许多都是基于Webkit的。但是有一些选项不是基于Webkit的,我相信这就是你最感兴趣的。

链接

最简单的、符合您需求的第0级浏览器是Links web browser的图形化版本。它适用于跨平台(诚然,对于Windows环境,您需要一些Cygwin库),开源,占用内存小,在其一些分支或增强版本(例如Elinks)中具有改进的功能,如支持Javascript,完整的鼠标功能以及您在问题陈述中所需的铃声和哨声。

当然,它是用C语言编写的。

Konqueror/嵌入式

探索此领域中的其他选项,Konqueror/Embedded 是值得考虑和关注的。是的,它基于 Qt/Embedded 和 Webkit (mumble mumble),但他们旨在提供精简版本的浏览器和库堆栈以满足特定需求。再次强调,Windows 在这里将会是个例外,但仍然可行。

Fennec

最后一个跨平台选择是 Mozilla Firefox 的精简版,Fennec。虽然代码库更大,但Mozilla正在积极开发其嵌入式版本,并且非常感谢您在这方面提供的任何帮助。据我所知,精简版仍处于预阿尔法版(Fennec, however, lives on),但未来应该会成为一个可行的选择。

还有其他许多选择可以探索

除了当前竞争的一系列网络浏览器之外,专有选项如ANT Galio也可能满足您的需求。看起来还有许多其他专有解决方案,但其中大部分(例如Internet Explorer MobileMobile Safari)只适用于少数平台。好的专有跨平台解决方案,而不是基于Webkit的,似乎相当罕见。

SpliFF在他的回答中提供了一个非常好的建议:尝试使用libRocket。正如他所推荐的,它是轻量级的、跨平台的、目前和积极维护的,易于您进行钩子连接,并且提供了您寻求的自动化案例。在这种情况下,它是用C++编程的,还提供了Python绑定以提供额外的便利。

总之,根据您的需求,您仍需要评估上述选项的优缺点和API规范。

我建议从Links开始,因为它是最具功能和强大的选项,同时在非常小的内存占用和代码库上进行了优化。它最大的优势是这是从一开始就设定的设计目标,并且整个代码树都是按照这种设计理念构建的。

请告诉我们您选择了什么。这是社区中足够常见的需求,我相信其他人也会从您的经验中受益。


2
非常感谢您提供如此详细的答案。我几乎忘记了这篇帖子。我一定会研究您的建议! - tkarls
@tkarls,请问你最终选择了哪个解决方案? - Tomas
1
是的,最后我们决定自己实现一个“GUI库”。我们正在从XML文件中解析格式化数据,所以你可以称它为一个小型迷你浏览器。 - tkarls

11

看看librocket。它符合您的要求,支持HTML+CSS,轻量级,处理事件并渲染到缓冲区。最近我浏览了一堆项目,寻找基本上您所要求的东西,这是我找到的匹配项。

libRocket是基于HTML和CSS标准的C++用户界面中间件包。它被设计为任何项目界面需求的完整解决方案。 libRocket使用经过时间考验的开放标准XHTML1.0和CSS2.0(同时借鉴了HTML5和CSS3的特性),并通过适用于实时应用程序的特性进行扩展。因此,您不必像其他中间件空间中的其他软件包一样学习全新的专有技术。
  • 跨平台架构(Windows、Mac、Linux、iPhone等)。
  • 动态布局系统。
  • 高效的应用程序范围样式,配备自定义模板引擎。
  • 完整的用户控件集:按钮、滑块、下拉菜单等。
  • 运行时可视化调试套件。
  • 易于与Python脚本集成和扩展。
  • 抽象接口,可插入到任何游戏引擎中(OpenGL、DirectX和Ogre3d的示例)。
  • 装饰引擎允许应用于任何元素的自定义应用程序特定效果。
  • 通用事件系统,无缝绑定到现有项目中。

+1,完美的建议。您没有完全涵盖OP的所有需求,但是为自动化案例添加一些额外的文档就足以回答这个问题了。非常好,值得仔细研究,并在我的答案中更新以便完整性起见指向此答案。 - MrGomez
渲染到缓冲区的示例代码在哪里?网页必须被渲染到内存缓冲区中,然后我将把内存缓冲区传输到显示器。 - moi

3
请查看DS Organize,这是一个自制的DS浏览器,以及由Google开发的ES Operating System(最初由Nintendo开发的操作系统)。
考虑到Nintendo DS只有4MB的RAM(大多数DS浏览器使用内存扩展后可达8MB),因此我建议您查看DS Organize。如果您的内存模型和VRAM写入自由度较高,则可能也可以直接将渲染到VRAM上,这样可以节省几百KB的空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接