“秘密”在于图形绘制到窗口的背后原理是什么?

5

图形本身只是一些抽象的类。那么调用g.drawImage(Image img, tx, null)或者其他类似的函数,是如何实际绘制到窗口上的呢?我查了一些资料,好像在java.awt.Component的实例中发生了一些事情,是这样吗?我不确定。

我的主要原因是想创建自己的Graphics上下文,称为Graphics3D。我的光栅化器将利用它,然后从一个Graphics3D上下文中,可以绘制和操纵3D对象。即使我能够将Graphics继承到我的Rasterizer中,我也不知道该怎么做。


1
实际的实现是本地的。它通过任何本地实现将Graphics类的期望翻译并将其翻译成本地对等体,该对等体充当Component的“表面”。 - MadProgrammer
1
在Swing和Graphics2D之上构建3D图形是一条死路。原语不提供执行许多严肃的3D库必须执行的操作,从隐藏表面删除开始。强烈建议查看到3D渲染API的薄绑定,如OpenGL和D3D,并在其之上实现您的引擎。 - Gene
3
叹气。我试图防止您浪费时间。不要尝试学习Java Swing以了解图形工作原理。请研究OpenGL或D3D及其如何与硬件通信。Swing仅使用硬件功率的一小部分,而这一部分不足以编写严肃的三维图形包。 Java3d是比OpenGL更高级的API。事实上,Java3d将OpenGL用作其底层。 - Gene
4
随你便。你将需要大量重新发明轮子。请注意,正如http://en.wikipedia.org/wiki/Java_3D中所述,Java 3D是基于OpenGL和D3D实现的。这些都是驱动程序API。我警告过你了。 - Gene
我决定采用完全的AWT方法来进行3D图形光栅化。是的,我意识到了不可思议的重复发明轮子的数量,但是本地库已经成为可移植性的问题,并且混淆了Java的目的:成为平台无关的语言。现在,我只想看看我能够真正实现多高效的3D图形,即使这意味着几乎不接触显卡。总的来说,您的CPU可以处理所有内容,包括图形,只需使用显卡进行绘制,没有其他东西。 - AMDG
显示剩余8条评论
1个回答

3

java.awt.Component是可以在屏幕上绘制的任何类的超类。

在这个类中,您可以看到如何真正地在屏幕上绘制像素。
在这个类中有一个方法,即public void repaint(long tm, int x, int y, int width, int height)。在这个函数中,您需要查看第3403行以了解它的工作原理。

它为此实例化了一个PaintEventPaintEvent e = new PaintEvent(this, PaintEvent.UPDATE, new Rectangle(x, y, width, height)),其中PaintEvent的构造函数是PaintEvent(Component source, int id, Rectangle updateRect)

还有另一行Toolkit.getEventQueue().postEvent(e)
Toolkit获取系统的EventQueue,并将PaintEvent添加到其中。
EventQueue跟踪队列中的所有事件,并相应地触发它们。
PaintEvent是绘制屏幕上矩形的事件。


那么我可以通过以下方式创建自己的绘图器:创建一个名为Paint3DEventQueue的类,继承EventQueue,并为自定义JComponent抛出自定义PaintEvent,然后像通常在JPanel中一样覆盖paintComponent方法,它将执行完全相同的操作(减去其他一些方法)? - AMDG
我说绘制窗口的过程是这样的,对吗?1) 通过repaint(long tm, int x, int y, int width, int height);定义要更新的区域。 2) 创建一个JPanel来绘制该区域的内容。 3) 创建一个具有指定JPanel(作为组件)的PaintEvent以绘制到屏幕上。是这样吗? - AMDG
1
不,绝对不能这样做。因为你试图过度深入。你必须创建自己的组件来调用repaint(long ....);。如果你使用JPanel,那么这个JPanel将会调用paint(Graphics),而不是你自己写的方法。但是在这里,你正在尝试创建自己的屏幕绘制方法。 - afzalex
那我应该创建自己的自定义组件而不是一个JPanel,然后让我的Paint3DEventQueue基于其中的paintComponent()方法? - AMDG
是的,如果你想要自己在屏幕上绘制,这是唯一的方法。@LinkTheProgrammer。据我所知。 - afzalex
1
你@afzalex,真是救星啊。现在我可以继续为Minecraft创建光栅化器了。 - AMDG

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