2

我正在学习 Java 并开始我的第一堂课/项目。在这个项目中,导师的像素在屏幕上移动并稳定剪辑,并在几秒钟内完成它在屏幕上的旅程。我的需要几分钟,每 5 秒只移动 1 个像素。我原以为 MacBook Pro 会比这更好地处理 Java 图形。为了查看它是我的代码还是单元,我在 Windows 中启动时从头开始重建了项目,性能得到了显着提高。在那里,光标每秒移动 1-2 个像素;仍然不如讲师,但比OSX处理得更好。我想知道这是正常的还是预期的?OSX 是否只是在处理 Java 图形方面很糟糕?如果它有助于回答这个问题,我已经链接了我的代码,以及 OSX 中缓慢移动的像素和糟糕的帧速率的视频。Fraps 显示我在 Windows 中的平均速度为 650 fps,OSX 端的代码输出显示它在 40-60 左右,具体取决于我是否有其他视频处理。在视频中它大约是 45,但那是因为屏幕捕获使它从平均 60 fps 减慢。

OSX 中的帧率示例:https ://www.youtube.com/watch?v=PQ0-L4slgP4

屏幕类代码:http: //pastebin.com/3ETKsY8r

游戏类代码:http: //pastebin.com/NDreVB60

我在 Apple 端使用 10.7.5 下的 Eclipse Juno,在 Bootcamp 端使用 Windows 7。MacBook 配备 4GB 内存和 2.53 Ghz Intel Core 2 Duo。

4

1 回答 1

1

我在我的 MacBookPro 上运行了您的代码示例,结果比您发布的视频中的要好得多。

现在,我不是 Java 2D 图形方面的超级专家,但有一个观察结果是,由于您需要在每次迭代时一遍又一遍地重绘整个画布以使像素移动,因此渲染过程中涉及的逻辑应该很快。此外,由于像素沿对角线移动,右侧较大的区域对您的示例没有用处,因此我建议将 JFrame 设置为正方形,这样可以减少重新绘制的区域。

最后,我对 Screen 类的代码进行了一些更改,这可以使您的操作更快。

package com.oblivion.rain.graphics;

public class Screen {
    // Height was removed since there is no use for it
    private int width;
    public int[] pixels;

    int time = 0;
    int counter = 0;

    // We need this in order to avoid the iteration in the clear method.
    int previousPixel = 0;

    public Screen(int width, int height) {
        this.width = width;
        pixels = new int[width * height]; // 50,400
    }

    public void clear() {
        // In case the frame is a rectangle, the previousPixel
        // could hold a value that is greater than the array size
        // resulting in ArrayOutOfBoundsException
        if (previousPixel < pixels.length) {
            pixels[previousPixel] = 0;
        }
    }

    public void render() {
        counter++;

        if (counter % 100 == 0) {
            time++;
        }

        // Calculate the previousPixel index for use in the clear method
        previousPixel = time + (time * width);


        // Make sure we didn't exceed the array length, then set the 
        // array data at the calculated index
        if (previousPixel < pixels.length) {
            pixels[previousPixel] = 0xff00ff;
        }
    }
}
于 2012-12-17T14:16:29.853 回答