【问题标题】:Java Hardware Acceleration not working with Intel Integrated GraphicsJava 硬件加速不适用于英特尔集成显卡
【发布时间】:2013-01-16 02:53:51
【问题描述】:

大家好,希望有人能帮我解决这个问题。我无法让硬件加速在配备英特尔集成显卡的笔记本电脑上工作。

问题:

在使用带有 JFrame 的 BufferStrategy 的 Windows 7 和 8 机器上,使用 Java 7 update 11 的硬件加速似乎无法与英特尔集成显卡一起使用。


详情

显卡:Intel(R) HD Graphics 4000
JRE:Java 7 更新 11
操作系统:Windows 7、Windows 8


预期结果


实际结果


资源

如果您想验证问题,可以下载我创建的用于测试的应用程序:http://ndcubed.com/downloads/GraphicsTest.zip

如果您不喜欢下载已编译的 JAR 文件,您可以使用以下源代码自行编译应用程序:

package graphicstest;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferStrategy;

public class GraphicsTest extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new GraphicsTest();
            }
        });
    }

    GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
    BufferCapabilities bufferCapabilities;
    BufferStrategy bufferStrategy;

    int y = 0;
    int delta = 1;

    public GraphicsTest() {

        setTitle("Hardware Acceleration Test");
        setSize(500, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        setVisible(true);

        createBufferStrategy(2);
        bufferStrategy = getBufferStrategy();

        bufferCapabilities = gc.getBufferCapabilities();

        new AnimationThread().start();
    }

    class AnimationThread extends Thread {
        @Override
        public void run() {

            while(true) {
                Graphics2D g2 = null;
                try {
                    g2 = (Graphics2D) bufferStrategy.getDrawGraphics();
                    draw(g2);
                } finally {
                    if(g2 != null) g2.dispose();
                }
                bufferStrategy.show();

                try {
                    Thread.sleep(16);
                } catch(Exception err) {
                    err.printStackTrace();
                }
            }
        }
    }

    public void draw(Graphics2D g2) {
        if(!bufferCapabilities.isPageFlipping() || bufferCapabilities.isFullScreenRequired()) {
            g2.setColor(Color.black);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setColor(Color.red);
            g2.drawString("Hardware Acceleration is not supported...", 100, 100);
            g2.setColor(Color.white);
            g2.drawString("Page Flipping: " + (bufferCapabilities.isPageFlipping() ? "Available" : "Not Supported"), 100, 130);
            g2.drawString("Full Screen Required: " + (bufferCapabilities.isFullScreenRequired() ? "Required" : "Not Required"), 100, 160);
            g2.drawString("Multiple Buffer Capable: " + (bufferCapabilities.isMultiBufferAvailable() ? "Yes" : "No"), 100, 190);
        } else {
            g2.setColor(Color.black);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setColor(Color.white);
            g2.drawString("Hardware Acceleration is Working...", 100, 100);
            g2.drawString("Page Flipping: " + (bufferCapabilities.isPageFlipping() ? "Available" : "Not Supported"), 100, 130);
            g2.drawString("Full Screen Required: " + (bufferCapabilities.isFullScreenRequired() ? "Required" : "Not Required"), 100, 160);
            g2.drawString("Multiple Buffer Capable: " + (bufferCapabilities.isMultiBufferAvailable() ? "Yes" : "No"), 100, 190);
        }

        y += delta;
        if((y + 50) > getHeight() || y < 0) {
            delta *= -1;
        }

        g2.setColor(Color.blue);
        g2.fillRect(getWidth()-50, y, 50, 50);
    }
}

结论

在没有硬件加速的情况下,我创建的许多应用程序需要它在具有集成显卡的机器上运行缓慢。我真的很困惑为什么它不能专门使用这种类型的显卡。无论如何,感谢您阅读所有这些内容,希望我们能够深入了解:)!

【问题讨论】:

  • 感谢您的发帖!

标签: java hardware hardware-acceleration integrated


【解决方案1】:

尝试将环境变量 J2D_D3D_NO_HWCHECK 设置为“true”。


第一种方法

控制面板->系统->高级系统设置->环境变量->系统变量->新建->

         Variable name: J2D_D3D_NO_HWCHECK
         Variable value: true

第二种方法

在批处理文件中:

         set J2D_D3D_NO_HWCHECK=true

         java -jar myapp.jar

【讨论】:

  • 我在更新我的英特尔集成显卡驱动程序后寻找解决我的 Intellij 白屏问题的方法时偶然发现了这个答案。在我升级我的驱动程序后,Intellij(没有其他 Swing java 应用程序有这个问题)在我启动它时显示一个窗口框架和框架内的纯白色。设置 J2D_D3D_NO_HWCHECK = true 后重新启动 Intellij,然后它工作正常。
【解决方案2】:

我只是为遇到同样问题的人解决了这个问题。它是安装的 JRE 类型。我在 64 位机器上安装了 32 位 JRE 环境,由于某种原因,它没有使用集成的英特尔图形芯片。但是在安装适当的 64 位 JRE 后,翻页和硬件加速可以与 Intel 集成芯片配合使用。

您可以在以下位置下载其他版本的 JRE:http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html

真的很奇怪,不敢相信我偶然发现了答案。希望这对将来的某人有所帮助:)

【讨论】:

  • 如果上述方法不起作用,请尝试将环境变量 J2D_D3D_NO_HWCHECK 设置为“true”。出于某种原因,似乎在英特尔集成显卡上启动 Direct3D 管道并没有通过硬件检查,但是通过跳过此检查,它可以毫无问题地使用 Direct3D,并通过启用硬件加速来提高性能。 set J2D_D3D_NO_HWCHECK=true 在运行您的应用程序之前在命令提示符中。但是在设置环境变量时要小心。
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多