Mal*_*chi 5 java network-programming
对于我的大学任务,我必须制作一个可联网的pacman版本.我认为我最好先制作pacman的本地副本,然后扩展此功能以进行网络播放.
我不得不说,我对java GUI开发相对较新,并在java中使用这些功能.
我已经开始关注java中游戏开发的上述链接以及pacman游戏的一个例子.
我决定将迷宫表示为一个int数组,其中不同的值意味着不同的东西.但是当主游戏循环中的paint方法运行时,我正在用这种方法重绘整个迷宫.
for (int i : theGame.getMaze())
{
if (i == 4)
{
g.setColor(mazeWallColour);
g.fillRect(curX, curY, cellSize, cellSize);
curX += 25;
}
else
{
curX += cellSize;
}
index++;
// Move to new row
if (index == 25)
{
index = 0;
curX = 10;
curY += cellSize;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这为我提供了不到1fps.虽然我已经注意到上面链接的示例使用类似的方式重绘每次调用paint方法,我相信这是在一个不可见的图像(有点像双缓冲[有点像第一个链接使用BufferStrategy]解释])什么是重绘迷宫的更好方法?
任何指针/建议都很有用.
感谢您的时间.
http://pastebin.com/m25052d5a - 主要游戏类.
编辑:我刚刚发现一些非常奇怪的事情发生后,试图看看执行了多长时间的代码.
在我添加的paintClear(Graphics g)方法中
ocean = sprites.getSprite("oceano.gif");
g.setPaint(new TexturePaint(ocean, new Rectangle(0,t,ocean.getWidth(),ocean.getHeight())));
g.fillRect(10, 10,getWidth() - 20,getHeight() - 110);
Run Code Online (Sandbox Code Playgroud)
这让整个事情顺利进行 - 然而当我删除这些线条时,整个事情变慢了?可能是什么导致了这个?
看来您对 Thread.sleep 的调用没有达到您的预期,但我不认为这是您麻烦的根源。你有:
Thread.sleep(Math.max(0, startTime - System.currentTimeMillis()));
startTime 将始终小于 System.currentTimeMillis(),因此 startTime - System.currentTimeMillis() 将始终为负数,因此您的睡眠时间将始终为 0 毫秒。它与您展示的示例不同,因为该示例在进行计算之前将 startTime 增加 40 毫秒。它正在计算休眠多长时间以将绘图时间填充到 40 毫秒。
无论如何,回到你的问题。我建议您进行衡量,以了解您的时间都花在哪里了。在您知道什么是慢的之前,优化是没有意义的。您已经知道如何使用 System.currentTimeMillis()。尝试用它来衡量时间的去向。难道都是用来画墙的吗?
编辑 - 我看到这已被标记为已接受,所以我是否应该推断当您修复睡眠时间后问题就消失了?我没有太多的 Java GUI 经验,但我可以推测您的代码可能导致其他重要线程匮乏。通过将线程设置为具有最大优先级并且仅调用 sleep(0),您几乎可以保证进程中的其他线程无法执行任何操作。Raymond Chen 博客中的一篇文章解释了原因。