Pacman在Java问题

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)

这让整个事情顺利进行 - 然而当我删除这些线条时,整个事情变慢了?可能是什么导致了这个?

更新的代码

Wee*_*ble 3

看来您对 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 博客中的一篇文章解释了原因。