gpt4 book ai didi

java - 我怎样才能更快地渲染我的阵列?

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

我一直在研究 nonogram Java 中的求解器,我的所有算法都运行良好,但我一直在努力实现可视化。

在算法执行期间,我可以访问两个“解决方案数组”。一个是 int[][] 类型,包含值 -1 表示“肯定是白色”,0 表示“不确定”和 1 表示“肯定是黑色”。另一个数组是 float[][] 类型,它包含 01 之间的值,这里 0 是当然是白色,1 表示肯定是黑色,.2 的值表示单元格更可能是白色而不是黑色。

由于我最近从 PHP 切换到 Java 编程(没有适当的介绍),所以我不太了解如何正确地可视化这个数组。当然,我首先尝试使用 X.? 等字符将第一种类型的数组简单地打印到控制台,但这是远非美好。然后我发现了一些关于 BufferedImage 的东西,我创建了以下函数(对于 float[][]int[][] 类似):

public void toImage(int w, int h, float[][] solution) throws IOException {
int[] data = toImage1(w, h, solution);
BufferedImage img = toImage2(data, w, h);
toImage3(img);
}

public int[] toImage1(int w, int h, float[][] solution) throws IOException {
int[] data = new int[w * h];
int i = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
int a = y / 100;
int b = x / 100;
int z = (int) (255 * Math.sqrt(1 - solution[a][b]));
if (solution[a][b] == 1 && ((((y % 100 >= 10 && y % 100 <= 15) || (y % 100 >= 85 && y % 100 <= 90)) && x % 100 >= 10 && x % 100 <= 90) || (((x % 100 >= 10 && x % 100 <= 15) || (x % 100 >= 85 && x % 100 <= 90)) && y % 100 >= 10 && y % 100 <= 90))) {
z = 100;
} else if (solution[a][b] == 0 && ((((y % 100 >= 10 && y % 100 <= 15) || (y % 100 >= 85 && y % 100 <= 90)) && x % 100 >= 10 && x % 100 <= 90) || (((x % 100 >= 10 && x % 100 <= 15) || (x % 100 >= 85 && x % 100 <= 90)) && y % 100 >= 10 && y % 100 <= 90))) {
z = 230;
}
data[i++] = z << 16 | z << 8 | z;
}
}
return data;
}

public BufferedImage toImage2(int[] data, int w, int h) {
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
img.setRGB(0, 0, w, h, data, 0, w);
return img;
}

public void toImage3(BufferedImage img) throws IOException {
File f = new File("Nonogram.png");
ImageIO.write(img, "PNG", f);
}

这里,wh 应该分别是每列中的单元格数量。行乘以 100(我希望每个单元格由 100x100 像素的 block 表示)。然后我还希望在确定的单元格中有一个额外的灰色框,这就是 ifelse if 的用途。

这很好用,并创建了这样的图像:nonogram

但是,我遇到了两个问题:

  1. 这个功能 super 慢。在分析执行后,我看到 90% 的执行时间花在了这个函数上。按照评论中的建议,将我的函数分解为两部分后,我得到以下配置文件:profile
  2. 我不想写入 .png 文件,而是想要一个 JFrame 来显示我的图像,但是(再次因为我错过了对 Java 的正确介绍),JFrame的似乎不是我最好的 friend ,我似乎不知道如何使用它们。

是否有可能一次填充整个 100x100 像素的单元格?有没有办法不必每次都创建整个 BufferedImage ,而只需修改在另一种方法中更改的位?我应该使用 BufferedImage 以外的东西吗?我的代码需要哪些元素,有人可以编写示例方法或所需的代码片段吗?

最佳答案

好吧,看起来写入文件实际上并不是您最大的问题,看起来您最大的问题是您要单独转储像素。以下是我可能会做的一些事情:

  1. 制作较小的图像。 100x100 很多。为什么不是 20x20?您可以随时使用图像编辑器放大。
  2. 完全跳过 int[] 步骤,直接写入 BufferedImage
    • 使用bufferedImage.setRGB(startX, startY, w, h, rgbArray, offset, scansize),但仅限于您批量绘制的图像部分.
  3. 根据 ab 的值(与 wh 相对,包括尤其是循环,请参见第 4 点。
  4. 完全牢固地填充方框,然后通过分别覆盖这些线来添加内部矩形。所有这些复杂的 if 检查正在扼杀你的表现。做到无分支(没有 if 语句),它会运行得更快。
  5. 将 for 循环中的代码放入一个单独的方法中,使其更加清晰。将其命名为类似于 drawSingleBox

请记住,更多具有好名字的方法可以更轻松地了解正在发生的事情。 writeImageToFile 优于 toImage3convertArrayToImage 优于 toImage2

此外,您还询问了如何将图像作为 JFrame 的背景;一旦您拥有完全绘制的 BufferedImage 对象,您就可以使用 JFrame background image 中的信息做那部分。

关于java - 我怎样才能更快地渲染我的阵列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32258231/

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