gpt4 book ai didi

java - 性能加载图像游戏类

转载 作者:行者123 更新时间:2023-12-03 21:33:31 24 4
gpt4 key购买 nike

我正在尝试在游戏中为对象绘制图像的几种方法之间做出选择。

我希望对象具有自己的draw()方法,但恐怕会导致不必要的图像副本或其他一些效率下降,无论是否明显。

级别开始时,第一种方式加载BufferedImages

public class levelone{

BufferedImage imageguy;

public void draw(Graphics2d g){
g.drawImage(imageguy, null, guy.getx(), guy.gety());
}

}


第二种方法将图像加载到guy.class中,并通过levelone.class中的 guy.draw(g);调用从那里绘制图像。

第三种方式将图像加载到levelone.class中,并从level.one中的 guy.draw(imageguy, g);的guy.class绘制图像。

请帮助我了解解决此问题的最佳方法。如果不清楚我要问的是什么,请告诉我,我会尽力使其更容易理解。

最佳答案

这更多是一个设计问题。首先,这是:

...效率的其他一些下降,无论是否明显。

...不是一种非常健康或富有成效的思维方式。如果它不引人注意,那就不用担心了。否则,如果您在每个时钟周期都沉迷于代码,那么最好还是用汇编代码编写游戏。

但是这里需要注意的是更大范围的设计级可伸缩性问题。

值得注意的是,将渲染/绘图逻辑与高级类耦合在一起可能会成为维护负担。这取决于项目的范围,但是如果它是一个相当大的项目,那么如果将绘图/渲染逻辑与游戏逻辑分开,则会有更多的喘息空间。然后,您可以完全专注于从游戏设计的角度来看,“怪物”或“物品”或类似物品需要做什么,而无需担心其绘制方式。绘图在其他地方完成。

但是,如果我们假设您无论如何都希望在这些对象中包含绘制逻辑,那么您的问题似乎最终归结为您要为与游戏中的对象相关的图形存储一些图像缓冲区的地方。

简短的答案是,“取决于”。您对做出什么假设充满信心?例如,在您发布的代码中:

public void draw(Graphics2d g){
g.drawImage(imageguy, null, guy.getx(), guy.gety());
}


...如果将对象图像平移到图形上,这似乎有点荒谬。如果您要做的只是将项目的图像钝化为图形,那么您最好完全消除 draw方法,将公共访问器公开给该图像,并让一个中心位置负责处理消灭这些图像的责任。图像在正确的时间和地点。

到那时,如果您要做的只是存储图像并将对象的访问器暴露在对象中,那么您还不妨让外部世界自己关注加载/存储这些图像并使其模糊化,从而使对象干净整洁。彻底绘制逻辑。这也将为您提供最大的灵活性,以优化何时以及如何绘制事物,而不会侵入您的所有对象。

但是,您是否总是要只从对象中剔除图像?游戏中的物体是否可能会绘制其他事物,形状,文本等?如果是这样,您可能想要保留 draw方法。

所以对我来说,最终的问题是,您是否真的想在对象内部进行绘制?


如果没有,那么您将拥有最大的灵活性来优化您的心脏内容,因为您可以将最有效的加载,存储和绘制图形的责任留给中央渲染引擎,而不是将责任分散到游戏中的每个对象上(并且如果您想以不同的方式做事,可能必须全部更改)。
如果您确实希望这样做,那么您最好将对象内部渲染的所有细节完全封装起来,包括保留执行此操作所需的所有资产,以使外部世界不必为此而烦恼,并且可以调用“绘图”并传入绘图目标(例如,Graphics2D)。


因此,我建议您提出的建议可能都不是理想的。但是,如果有一种选择可能不好,我会说这是您的第三种。那是:


第三种方式将图像加载到levelone.class中并从中绘制
带有guy.draw(imageguy,g)的guy.class;在levelone.class中。


这里的问题是,您有点两全其美。您正在将这个“家伙”的绘图细节泄漏给外部世界,但是外部世界仍然必须依靠“家伙”通过将这些绘图细节传递回去来进行绘图。如果没有别的,您真的想在这里,无论是由人还是由外界承担主要责任,后者更为灵活,而前者则更为紧凑。当外部世界必须将一个人的形象传给该人以进行绘制时,那么您就不会获得任何好处。如果您真的想要一个家伙“吸引自己”,那么通常您希望能够在没有外界太多帮助的情况下做到这一点。赋予一个实体坚定的责任,而不是将其分散到多个实体。

关于同一图像的不必要副本,无论您使用中央图像缓存如何处理,都可以轻松解决。一个简单的方法就是使用地图。加载图像时,请在地图上搜索路径。如果已经存在,则返回对已加载图像的引用。否则,加载图像并将路径/图像作为键/值对插入到地图中。

关于java - 性能加载图像游戏类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30687540/

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