【问题标题】:How do virtual machines render GUI?虚拟机如何渲染 GUI?
【发布时间】:2014-09-27 13:18:14
【问题描述】:

所以我一直在阅读有关执行环境(Python、JVM...)的大量信息,并且我开始自己实现一个。它是一个用 C 语言编写的基于寄存器的环境。我定义了一个基本的字节码格式,到目前为止执行非常顺利。我的问题是 VE 如何呈现 GUI。在迄今为止关于我的工作的更详细描述中,我的 VE 有一个屏幕缓冲区(正在试验它)。每次戳它,完全输出屏幕缓冲区就知道输出了。

到目前为止,基本计算和东西都很好,但是当我想了解如何渲染 GUI 时遇到了困难。我对此无能为力。任何帮助,将不胜感激。即使我对此的想法完全错误,任何指向正确方向的开始都会非常棒。谢谢。

【问题讨论】:

    标签: python c++ user-interface jvm pyc


    【解决方案1】:

    Python 上的所有 GUI 工具包都是 C/C++ 代码的封装。在 Java 上,有一些像 Swing 这样的“纯”Java 工具包,但它们依赖于 C 代码进行绘图和处理用户输入的最低级别。 Java VM 中没有对图形之类的特殊支持。

    至于 GUI 如何在最低级别呈现,这取决于。在 Windows 上,不允许用户模式软件直接访问视频硬件。最终,任何 C/C++ GUI 代码都必须通过 GDI 或 Direct3D 进行渲染。内核模式 GDI 代码能够通过写入帧缓冲区来完成所有的渲染,但也支持通过将操作传递给显示驱动程序来进行加速。另一方面,Direct3D 内核代码将几乎所有内容都传递给驱动程序,驱动程序又将所有内容传递给 GPU。几乎所有的内核模式代码都是用 C 编写的,而在 GPU 上运行的代码是手工编码的汇编代码和用高级着色语言编写的代码的混合体。

    请注意,GPU 汇编语言与 Intel x86 汇编语言非常不同,并且在制造商和 GPU 代之间存在很大差异。

    我不确定当前在 Linux 和其他 Unix 类型的操作系统上的做法是什么,但过去很常见的是让作为用户模式进程的 X 服务器直接访问帧缓冲区。 X 服务器中的 C 代码最终负责渲染。随着 GPU 加速的普及,这种情况可能至少有所改变。

    【讨论】:

    • 罗斯,谢谢你。所以我发现了 NASM 和 FASM(本质上是输出可执行文件的汇编程序),它们执行 GUI,但它们是特定于平台的。不过,我找不到太多使用 NASM 或 FASM 的 Linux 上的 GUI 示例。说到您的意思,您对 Python|Java 用来呈现 GUI 的那些 C/C++ 代码|库有任何想法吗?我正在用 C 编写我的 VE,所以尝试一下对我来说应该不是太大的问题。谢谢。
    • 我不太确定你在问什么,但我认为你最好不要尝试在 VM 中呈现 GUI,并将其留给现有的 GUI 工具包。此外,如果您不熟悉 GUI 编程,尝试在您自己的 VM 中实现一个也不是一个好的学习方法。
    • Ross,我已经使用 Win32 API 完成了 GUI,并且还使用 C# 和 WPF 在更高级别上完成了。现在我想了解它是如何在真正的低级别完成的。就像渲染窗口、控件、事件捕获……经过长时间的挖掘,我发现了从 C 开始设计的跨平台 GTK+ SDK。但我想要一些关于它是如何在低级别真正完成的指针。如果有任何混淆,我很抱歉。
    • 我添加了一个关于事物最终如何呈现给我的答案的概述,希望这会给你一些见解。
    • @ShankarMJ - 这个答案对我来说似乎很完整。仅供参考,open-jdk-7-jre package on Ubuntu 依赖于用于 GUI 的 libgtk2 包,而后者又依赖于Cairo 用于 2D 绘图。如果你想开发一个虚拟机,重新发明轮子来渲染 GUI 组件是没有意义的。在某个时候,您将开始开发一个操作系统,该操作系统恰好有一个可以运行的虚拟机......
    猜你喜欢
    • 2011-02-07
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2019-02-10
    相关资源
    最近更新 更多