有人可以帮我理解这行代码的render方法中的行吗?

时间:2013-01-06 10:19:36

标签: java multithreading rendering buffer

我也不完全了解volatile和synchronized修饰符的作用。但基本上这应该是我从youtube系列中学习的游戏的开始,到目前为止所做的一切都是启动一个有一个while循环的线程,内部运行方法更新和渲染。事情是除了设置颜色和创建矩形之外,我不了解渲染方法中的任何内容。

package game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

public class Game implements Runnable {

    public static Thread Game;
    public volatile boolean running = false;

    public void start() {
        running = true;
        Game = new Thread(this);
        Game.start();
    }

    public synchronized void stop() {
        running = false;
        try {
            Game.join();
        } catch (InterruptedException e) {
            System.out.println("asddsa");
        }

    }

    public void update() {

    }

    public void render() {
        BufferStrategy bs = GameFrame.GraphicsBoard.getBufferStrategy();
        if (bs == null) {
            GameFrame.GraphicsBoard.createBufferStrategy(3);
            return;
        }
        Graphics g = bs.getDrawGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, GameFrame.GraphicsBoard.getWidth(),
                GameFrame.GraphicsBoard.getHeight());
        g.dispose();
        bs.show();
    }

    public synchronized void run() {
        new GameFrame();

        while (running) {
            update();
            render();
        }

    }

}

1 个答案:

答案 0 :(得分:2)

挥发性

Java中的Volatile用作Java编译器和Thread的指示符,它不缓存此变量的值,并始终从主内存中读取它。

在这个代码示例中,一个线程(游戏线程)可以缓存“运行”的值,而不是每次都从主内存中获取它,如果在任何其他线程之间更改了值;它不会被这个帖子看到。在java中将boolean变量“ running ”设置为volatile可确保不会发生这种情况。

Synchronized

Synchronized用于使您的方法线程安全。

编辑:如下所示的长答案。

如果您的代码在多线程环境中执行,则需要同步多个线程之间共享的对象,以避免任何状态损坏或任何类型的意外行为。

java中的

synchronized关键字提供锁定,确保共享资源的互斥访问并防止数据竞争。线程还需要在访问同步的代码之前获取锁。

可以对整个方法或特定块进行同步。该示例显示了方法同步。意味着整个方法被锁定,并且在任何时候只有一个线程可以访问您的方法。

不建议进行方法同步,因为它可能会降低性能。本回复中还有其他优点和缺点。