gpt4 book ai didi

java - 为什么我损坏的缓冲区以 8x8 像素的 block 出现?

转载 作者:搜寻专家 更新时间:2023-11-01 03:54:00 27 4
gpt4 key购买 nike

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

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

任何人都可以向我解释为什么我在程序初始化时看到这个错误的图像吗?我几乎已经回答了我的问题吗? (主要是好奇引擎盖下发生了什么。)

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

My glitchtastic startup screen. Zoomed-in shot of the same.

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

map 背景图像作为 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 在被正确初始化之前被绘制到屏幕上,并且其他操作阻塞主线程足够长的时间以在初始化发生时看到故障。

这是背景图像的缩小副本: enter image description here

最佳答案

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

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

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

关于java - 为什么我损坏的缓冲区以 8x8 像素的 block 出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14506557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com