2014-07-22 35 views
1

我遇到了一个基本代码的问题,它在屏幕上以150x150的网格显示一些动画图像。 (注意:是的,我知道图像离开了屏幕的边缘,但最终我打算根据需要缩放图像以适合屏幕)。但是该程序只能以2 FPS运行,导致动画有时无法工作。我的循环是目前的(在Java中)如下:如何使循环更有效?

for (int i = 0; i < 22; i++) { 
    for (int j = 0; j < 11; j++) { 
     g2d.drawImage(getImage(texture_Ocean,l),i*64,j*64,i*64+64,j*64+64,0,0,64,64,this); 
    } 
} 

而且的getImage:

public Image getImage(Image i, Long l) { 
    BufferedImage b = (BufferedImage) i; 
    int w = b.getWidth(); 
    if (b.getHeight() % w == 0) { 
     int frames = b.getHeight()/w; 
     int frame = Math.round((l%1000)/(1000/frames)); 
     System.out.println(frame); 
     return b.getSubimage(0,(int) (w*frame) ,w, w); 
    } else { 
     return texture_error; 
    } 
} 

我的问题是如何让我的程序更高效/跑得快?我知道必须有办法做到这一点,因为你看到的游戏,如监狱建筑师和rimworld与300×300的话,并拥有实体hundreads。而像TF2这样的游戏在3D空间中显示数以千计的多边形。怎么样?

+0

我不是一个计算机图形专家,但我相当肯定你列出的游戏的帧速率更快,因为他们使用像OpenGL这样的库,直接与GPU的相关设备进行接口。 – kviiri

+0

我对texture_Ocean没什么好感,但是如果你可以保存在一个静态或成员变量中,并获得宽度和高度,那么你可以在每个迭代处保存一些好处理。 –

+0

它可能不会有太大的改进,但是你可以缓存getImage,因为它总是返回相同的结果,现在每个循环都进行内部计算。 – HamoriZ

回答

3

问题是,您正在使用CPU(并通过低效的内存访问方法)来完成GPU更好的工作。

你需要看看使用类似2D图形或游戏库或类似的东西来获得你正在寻找的那种表现。

+0

ok ty,你能提出任何好的图形库吗? –

+0

看到这个问题的一些建议:http://stackoverflow.com/questions/24883018/is-using-swingutilities-invokelater-inside-a-java-game-loop-a-bad-practice/24883129?noredirect=1# comment38670638_24883129 –

0

事情是,当开发游戏时,你应该关心很多优化。如果你不需要它,你不能简单地调用paint方法,并且希望一切都会好起来的。

除此之外,您应该尝试寻找专用于图形的库(如OpenGL),因为它们可以轻松地使用硬件来处理优化。