合并栅格

发布于 2024-10-20 07:05:46 字数 520 浏览 4 评论 0原文

我正在尝试实现一个具有图层支持的绘画工具。我为每一层创建一个 WritableRaster。要显示画布,必须合并图层。最有效的方法是什么?我可以使用 bufferedImage,设置光栅并使用 alpha 合成将每个图层绘制到 Graphics 上下文。但是,在数据级别上合并它然后绘制单个图像不是更好/更快吗?

编辑: 我做了一些分析。这就是我当前的方法:

//tmp.getRaster().setRect(layer.getRaster()); // VERY slow
tmp.getRaster().setDataElements(0, 0, layer.getRaster()); //slow
g2.drawImage(tmp, 0, 0, scaledDim.width, scaledDim.height, null);

我之前对每一层使用 BufferedImages 而不是 WritableRasters,并且没有明显的延迟。

我的下一步是缓存顶层和底层,因此只需要绘制 3 个图像。这可能会解决问题。

I am trying to implement a painting tool with layer support. For each layer I create a WritableRaster. To display the canvas, the layers have to be merged. What's the most efficient way to do this? I could use a bufferedImage, set the raster and draw each layer to the Graphics context with a alpha composite. But isn't it better/faster to merge it on data level and then draw a single image?

Edit:
I did some profiling. This is what my current approach looks like:

//tmp.getRaster().setRect(layer.getRaster()); // VERY slow
tmp.getRaster().setDataElements(0, 0, layer.getRaster()); //slow
g2.drawImage(tmp, 0, 0, scaledDim.width, scaledDim.height, null);

I used BufferedImages instead of WritableRasters for each layer before and there was no delay noticeable.

My next step would be to cache top and bottom layers, so there would be only 3 images to be drawn. That would probably solve the problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

只是偏爱你 2024-10-27 07:05:46

我的感觉是,绘制栅格大致相当于“在数据级别上合并它”。

我不会担心这个,除非你注意到这是一个瓶颈。

My sense is that drawing a raster is roughly equivalent to "merging it on a data level".

I wouldn't worry about this unless you notice it's a bottleneck.

中二柚 2024-10-27 07:05:46

也许你可以使用 JAI:

ParameterBlock pb = new ParameterBlock();
pb.add(bufImage1);
pb.add(bufImage2);
pb.add(....
RenderedImage ri = JAI.create("xor",pb);

maybe you can use JAI:

ParameterBlock pb = new ParameterBlock();
pb.add(bufImage1);
pb.add(bufImage2);
pb.add(....
RenderedImage ri = JAI.create("xor",pb);
情深如许 2024-10-27 07:05:46

如果将它们分别传输(绘制)到图像缓冲区上,则可能正在使用显卡加速。

如果您循环遍历各个缓冲区并手动合并它们(我假设这就是您所说的“在数据级别上进行操作”的意思),您将使用 CPU。

所以实际上,手动执行会比位块传输


所以,你原来的解决方案是最好的。让显卡发挥它的作用,它非常擅长。

If you blit (draw) them each onto an image buffer, you are probably using graphics-card acceleration.

If you loop through the indivual buffers and merge them by hand (I assume this is what you mean by "Do it on the data level"), you will be using the CPU.

So actually, doing it by hand will be significantly slower than blitting.


So, your original solution is best. Let the graphics card do its job, it's very good at it.

兔姬 2024-10-27 07:05:46

好的,所以我引入了上层和下层缓存,现在我得到了相当不错的性能。我可以添加尽可能多的层,只要我的内存可以处理,而不影响渲染时间。

Ok, so I introduced a upper and a lower layer cache and now I got a pretty good performance. I can add as many layers as my memory can handle without affecting rendering time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文