我最近一直在处理一个Processing / Java / JOGL片段,我正在绘制一个屏幕外缓冲区。当我启动程序时,我看到一些美丽的故障(见下图)。
我认为这是我上次运行程序时缓冲区地址空间中的剩余数据。最小的方块是8x8像素。似乎更大的块在4x4元块中平铺8x8px正方形,并且那些也是4x4平铺成überchunks。我使用的是64位操作系统。
任何人都可以向我解释为什么我在程序初始化中看到这个闪烁的图像?我几乎已经回答了我的问题吗? (通常只是好奇发生了什么事情。)
编辑添加了图片的放大版本,因为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
被吸引到屏幕上,并且其他操作会阻止主线程足够长时间以便在初始化发生时看到毛刺。
这是背景图片的缩小副本:
答案 0 :(得分:0)
一种可能的解释:当程序启动时,缓冲区使用的内存可能是“未初始化”。这意味着它包含其先前用户(任务,进程,系统,驱动程序等)在物理上留下的任何内容。
存储器由系统通过最小尺寸的块管理,通常一些字节用于链接块并记录块长度,然后是实际数据。
当您显示“未初始化”缓冲区时,您实际显示这些块(将左侧链接/大小/内容解释为图像数据),当存在一系列非常小的块时,它们会产生此效果。