4

我最近一直在研究处理/Java/JOGL 作品,其中我正在绘制到屏幕外缓冲区。当我启动程序时,我看到了一些漂亮的故障(见下图)。

我假设这是我上次运行程序时缓冲区地址空间中的剩余数据。最小的方块是 8x8 像素。似乎更大的块将 8x8px 的正方形平铺在 4x4 元块中,而这些块也以 4x4 平铺成 überchunks。我使用的是 64 位操作系统。

谁能向我解释为什么我在程序 init 上看到这个故障图像?我已经回答了我的问题了吗?(主要是好奇引擎盖下发生了什么。)

编辑:添加了图像的放大版本,因为 SO 没有任何类型的点击缩放图像。

我的故障启动屏幕。 相同的放大镜头。

编辑: @SuperKael 要求提供代码。很难隔离可能造成这种效果的原因,因为渲染主要被抽象到 Processing 的 JOGL 实现中。以下是试图解释我的代码中发生的事情:

地图背景图像加载为PImage

PImage backgroundImage = pApplet.loadImage(pathToImage);

要在该背景图像上绘制的内容的缓冲区被初始化:

PGraphics foregroundBuffer = pApplet.createGraphics(w, h, PApplet.OPENGL);

加载要在缓冲区内渲染的前景图像:

for (String path : foregroundImagePaths) {
    pApplet.loadImage(path);
}

在我的主draw()循环中,绘制背景图像,将其他图像绘制到缓冲区中,然后绘制缓冲区:

pApplet.image(backgroundImage, 0, 0);
foregroundBuffer.blendMode(PApplet.ADD);
for (PImage foregroundImage : foregroundImages) {
    foregroundBuffer.image(foregroundImage);
}
pApplet.image(foregroundBuffer, 0, 0);

当应用程序启动时,故障图像只会短暂出现。我相信foregroundBuffer在正确初始化之前可能会被绘制到屏幕上,并且其他操作会阻塞主线程足够长的时间以在初始化发生时看到故障。

这是背景图像的缩小副本: 在此处输入图像描述

4

1 回答 1

0

一种可能的解释:当您的程序启动时,缓冲区使用的内存可能“未初始化”。这意味着它包含之前用户物理上留下的任何东西(任务、进程、系统、驱动程序等)。

那里的内存由系统以最小大小的块来管理,通常一些字节用于链接块并记录块长度,然后是实际数据。

当您显示“未初始化”缓冲区时,您实际上会显示这些块(将左侧链接/大小/内容解释为图像数据),并且当存在一系列非常小的块时,它们会产生这种效果。

于 2013-02-11T16:14:48.140 回答