java - 为 Java Swing 创建合成图像输出的最佳实践

标签 java html image swing 2d-games

我正在使用 java swing 开发 2d 游戏,其中程序生成的环境由低分辨率图像平铺数组表示。目前,这全部位于 JLabel 中的 html 标签(用于换行符)内。

除此之外,我想显示角色 Sprite ,它不会占用整个图 block ,但会有一些 alpha 组件。过去,在 JS/html 和 JS/canvas 中,我只是简单地制作了带有 Alpha channel 的 Sprite 图 block ,并使用表格和/或绝对定位将它们直接放置在地砖上方。

然而,在 java swing 中,绝对定位(以及大多数 html)似乎工作得不太好。

由于 Sprite 永远不会位于两个地砖之间/重叠,因此显而易见的解决方案是在游戏外制作一堆预先计算的图像文件 - 每种类型的地砖上的每个角色一个,但是,这会随着所使用的图像数量呈指数级扩展磁盘空间(和工作),并且似乎没有必要。

据我所知,看起来应该可以在运行时将所有这些图像创建为 Bufferedimages,方法是在启动时预先计算它们,或者根据需要在每个帧中创建一些图像。

如果我能做到上述,我也许还可以将我需要的所有图像放入每个帧的一个大位图中,并显示它。如果我使系统过载,这还可以减少帧的非同步加载。

在上述选项中,什么似乎是最好的?或者是否有另一个我完全缺少的明显解决方案?如果解决方案是制作合成图像,有人可以为我指出正确的方向吗?非常感谢。

最佳答案

这个主题需要整本书,但本质上,你能做的是......

创建一个自定义组件(从 JPanel 或示例扩展),用于渲染世界 View ,渲染的程度取决于您的需求,但您只能渲染整个世界的一小部分。这很重要,因为如果它没有显示,您就不想渲染它。

在此组件的 paintComponent 方法中,您将渲染当前 View 的各个层。

如果您使用 png 图像,那么这就像计算 View 和虚拟世界之间的位置并使用 Graphics#drawImage 一样简单。如果您的模型得到了很好的优化,您甚至可以在单个渲染循环中实现这一点,也就是说,对于每个“图 block ”位置,您可以确定要在其中显示的内容并单独构建每个图 block 的输出,而不是使用多个循环来渲染每个层。

您还可以使用在屏幕外准备的后备缓冲区(例如地面层),而不是在 paintComponent 方法中渲染整个 View ,它可以简单地作为 paintComponent 方法中的单个步骤进行绘制,这将有助于提高整体性能。

根据您的需要,您可以根据需要或多或少地渲染到此后备缓冲区...

看看Performing custom painting了解更多详情

最佳实践将归结为有关整体引擎设计的更多背景。从性能的角度来看,绘制的越少,速度就越快。

关于java - 为 Java Swing 创建合成图像输出的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24816076/

相关文章:

html - 如何防止我的网站水平滚动?

javascript - 如何动态检查 "checkbox"- jQuery Mobile

java - OpenCV4Android 默认的 Mat 图像类型是什么?

java - 使用 Executor 处理 10000 个线程

Java-使用回调接口(interface)有何优势?

java - 为什么 "class"、 "metaClass"和 "declaringClass"不能用作 JSON-lib 中的键?

java - 如何使用 setRGB 制作图像?

html - CSS/HTML 菜单 : submenu disappearing on hover

php - Oracle Blob 作为 PHP 页面中的 img src

image - 如果模糊算法已知,图像上的模糊可以逆转吗?