Java 为什么损坏的缓冲区以8x8像素的块显示?

Java 为什么损坏的缓冲区以8x8像素的块显示?,java,processing,jogl,corrupt,Java,Processing,Jogl,Corrupt,我最近一直在写一篇Processing/Java/JOGL文章,其中我正在画一个屏幕外的缓冲区。当我启动程序时,我看到一些漂亮的闪烁(见下图) 我假设这是上次运行程序时缓冲区地址空间中的剩余数据。最小的方形块为8x8像素。看起来更大的块将8x8px正方形平铺在4x4元块中,这些块也将4x4平铺成überchunk。我使用的是64位操作系统 有人能给我解释一下为什么我在程序init上看到这张浮华的图片吗?我几乎已经回答了我的问题了吗?(主要是好奇引擎盖下发生了什么。) 编辑:添加了图像的放大版本,

我最近一直在写一篇Processing/Java/JOGL文章,其中我正在画一个屏幕外的缓冲区。当我启动程序时,我看到一些漂亮的闪烁(见下图)

我假设这是上次运行程序时缓冲区地址空间中的剩余数据。最小的方形块为8x8像素。看起来更大的块将8x8px正方形平铺在4x4元块中,这些块也将4x4平铺成überchunk。我使用的是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);
当应用程序启动时,故障图像仅短暂出现。我相信在正确初始化之前,may
foregroundBuffer
会被绘制到屏幕上,并且其他操作会阻塞主线程足够长的时间,以便在初始化过程中看到故障

这是背景图像的缩小副本:
一种可能的解释是:当程序启动时,缓冲区使用的内存可能“未初始化”。这意味着它包含了前一个用户在物理上留下的任何内容(任务、进程、系统、驱动程序等等)

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


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

看起来很有趣。将其作为“功能”保留,或收取额外费用:)这看起来像是对图像尺寸的不匹配假设-即,如果您将第二个“uber”行移到左侧(将左侧移回第一个“uber”行的右端,然后对第三个“uber”行执行相同操作行,但移动了两次,看起来事情应该重新开始匹配…@twalberg,也许…我认为每个8x8块的线条都是完整的,但它们的读取顺序已经改变。左边的海岸线(即加利福尼亚州马林县——西北/东南海岸线)上有一些“元块”看起来它们是用倒转的坐标放在一起的,如[d3…d0,…a3…a0],以相同的方式反转每个区块。我认为反转负责使每个über/meta/chunk的边缘清晰可见。不确定这是否与此有关,但JPEG被分割为8x8块。渲染堆栈中是否有JPEG压缩发生?@johncarl,我不相信。图像已加载作为一个PNG。我还没有发布我的代码,因为我很难隔离相关部分,因为很多渲染都是在Processing的JOGL实现中抽象出来的。我会在有机会的时候这样做。你对未初始化内存的描述和我想的差不多,但我对碎片特别好奇我想这与内存空间作为字节有关,但不知道从那里可以走到哪里。