【问题标题】:Can someone help me understand line for line what is going on in the render method of this code? [closed]有人可以帮我逐行理解这段代码的渲染方法中发生了什么吗? [关闭]
【发布时间】:2013-01-06 10:19:35
【问题描述】:

我也不完全理解 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();
        }

    }

}

【问题讨论】:

  • 我建议您重新编写代码,使其仅包含您理解的内容。据我所知,一半的代码是不需要的或者是错误的,所以我无法向你解释。
  • 也许你想从一个更基本的例子开始?图形和同步不是新手最好的朋友。
  • 这件事是我从 YouTube 上学习的教程的一部分,解释它的人并没有很好地解释它
  • 这就是 Youtube 上随机教程的问题。我建议您选择更可靠的来源,例如 Oracle Java 官方教程。我会立即拒绝一个甚至不尊重标准 Java 命名约定的教程。
  • 您对游戏编程的去向有什么建议吗?书我可以进入游戏编程教程。

标签: java multithreading rendering buffer


【解决方案1】:

易挥发

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

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

Synchronized

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

编辑:长答案如下。

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

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

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

不建议方法同步,因为它可能会降低性能。此回复中未涵盖其他优点和缺点。

【讨论】:

  • @JBNizet 是的,同意。同步整个方法是个坏主意。但我只是回答 OP 为什么在那里使用关键字。
  • @Jayamohan 感谢您的输入,但为什么同步整个方法会是一件坏事?
  • 问题是没有同步整个方法。问题是同步一个方法使它神奇地线程安全。它没有。它只是使它同步。您应该解释同步的实际作用。
  • 如果可以的话,那将非常有帮助!
  • 在任何给定时间每个对象只能运行一个synchronized 方法(这是通过对象内部的隐藏锁实现的)。因此,如果两个线程几乎同时在同一个对象上调用两个synchronized 方法,“第二个”线程将在进入synchronized 方法之前阻塞,直到“第一个”线程退出它自己的@987654325 @ 方法。 (我希望这样写有意义。)
猜你喜欢
  • 2020-11-03
  • 2015-02-04
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多