无法加速像素修改的 BufferedImages

2024-03-12

很长一段时间,1-2个月,我一直在试图找到这个特定问题的答案:

我无法让我的图像硬件加速!

我一直在网上搜索,创建了自己的方法,用键盘敲击我的头(仍然感到疼痛)但没有成功。

尽管我讨厌 Java SDK 以外的库,但我尝试了 LWJGL 和 JOGL,但由于某些愚蠢的原因,它们无法在我的计算机上运行。

我尝试使用System.setProperty("Dsun.java2d.opengl", "True"),我使用了 VolatileImage 但我无法向它绘制单个像素。(我尝试使用drawLine(x,y,x,y)但很慢)

现在我是如此绝望。我会尽一切努力来解决这个问题!所以,如果你知道解决方案(我知道你们中的一些人知道),请告诉我,这样我就可以摆脱这个问题。

My code:

   public static void render(int x, int y, int w, int h, ) {

            int a[] = new int[3]; // The array that contains RGB values for every pixel
            BufferedImage bImg = Launcher.contObj.getGraphicsConfiguration().createCompatibleImage(800, 600, Transparency.TRANSLUCENT); // Creates an image compatible to my JPanel (Runs at 20-24 FPS on 800x600 resolution)
            int[] wr = ((DataBufferInt) bImg.getRaster().getDataBuffer()).getData(); // Contains the image data, used for drawing pixels
            for (int i = 0; i < bImg.getWidth(); i++) {
                for (int j = 0; j < bImg.getHeight(); j++) {
                    a[0] = i % 256;
                    a[2] = j % 256;
                    a[1] = i * j % 256;
                    wr[i + j * bImg.getWidth()] = new Color(a[0], a[1], a[2]).getRGB(); // Sets the pixels from a[]
                }
            }
            bImg.flush();
            g.drawImage(bImg, x, y, w, h, null); // Draws the image on the JPanel
            g.dispose();
            System.out.println(bImg.getCapabilities(Launcher.contObj.getGraphicsConfiguration()).isAccelerated()); // Prints out whether I was successful and made the image accelerated or failed and made everything worse
        }

我希望你能理解代码。请以任何方式修改它,以帮助我找到问题的解决方案。

注意:请不要发布有关外部库的任何内容,除非您绝对确定没有它们我就无法正常工作。

另外,我的显卡不支持加速吗? (因为我看到一些帖子,硬件加速对其他人有效,但对我无效)顺便说一句,它是 GeForce 430 GT。

提前致谢!


来源复制自:Java 硬件加速不适用于 Intel 集成显卡 https://stackoverflow.com/questions/14635377/java-hardware-acceleration-not-working-with-intel-integrated-graphics

尝试这个:

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 {
                    // CHANGE HERE, DONT SLEEP
                    //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.exe 占用了 12% 的 CPU。 700帧/秒

然后我添加了系统变量:

Variable name: J2D_D3D_NO_HWCHECK
         Variable value: true

然后重新启动IDE,并运行程序:

我得到了惊人的结果。我有可用的硬件加速。 java.exe 占用了 5% 的 CPU。 1700 帧/秒。动画很棒!

以上是检查硬件加速是否在您的系统中起作用。

现在回答你的问题:

AFAIK:您无法使用 BufferedImage 获得真正的硬件加速。您应该使用 VolatileImage 来获得硬件加速。但使用 VolatileImage 时,您无法获取像素数据缓冲区来修改像素。使用硬件逐像素渲染是没有意义的。

我的建议是:

1)设计您的逻辑,它可以使用易失性图像的 Graphics 和 Graphics2D 渲染像素。但不要去像画 1 像素的线那样进行 hack。

2)使用缓冲策略,双/三缓冲。

3) 如果您想坚持使用 BufferedImage 来设置每个像素,请使用 BufferedImage 作为数据模型,同时在易失性图像上渲染绘制缓冲图像。如果您要缩放图像,这将有很大帮助。

4) 缓存经常渲染的图像。

5)更好地编写代码,例如:

int wi = bImg.getWidth();
int he = bImg.getHeight();
for (int i = 0; i < wi; i++) {
    for (int j = 0; j < he; j++) {
        wr[i + j * wi] = ((i % 256) << 16) | ((i * j % 256) << 8) | (j % 256);
    }
}

6) 对于耗时的数学运算,如 sqrt()、sin()、cos(),缓存这些运算的结果并创建查找表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法加速像素修改的 BufferedImages 的相关文章

  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 连接外部 Accumulo 实例和 java

    我正在尝试使用 Accumulo 连接到虚拟机 问题是 我无法将其连接到 Java 中 我可以看到 Apache 抛出的网页 但我无法让它与代码一起工作 我认为这是缺乏知识的问题而不是真正的问题 但我找不到这方面的文档 所有示例都使用 lo
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • 重命名 xcode 4 项目和实际文件夹

    我知道如何在 Xcode 4 中重命名项目 但是如何重命名源文件夹 问题是 在 Xcode 中重命名项目 只会在 Xcode 中重命名 尽管与以前相比是进步 但为什么 Xcode 不重命名文件系统中的文件夹 我不知道 您可以在 Xcode
  • 如何将双精度数四舍五入到小数点后一位? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图以 格式返回一个随机双精度值
  • `aws apigateway put-integration`:“Lambda 函数 ARN 必须位于同一账户中”

    我正在尝试遵循这个否则很棒的帖子 https docs aws amazon com lambda latest dg with on demand https example configure event source html部署基于
  • 如何在 gcc 8 上使用 std::filesystem?

    我已经更新了 gcc 的版本 gcc version 产生以下输出 gcc Ubuntu 8 1 0 5ubuntu1 16 04 8 1 0 Copyright C 2018 Free Software Foundation Inc Th
  • Rails 预编译 为什么 javascript 不能在本地工作,但在 heroku 上可以工作

    因此 在我预编译资产之前 该应用程序在本地运行良好 当部署到heroku时 我做了资产预编译 然后部署 它在heroku上运行良好 但现在似乎javascript被破坏了 关于如何解决它有什么建议吗 我应该删除公用文件夹中的文件还是使用某些
  • .net 线程监控

    我想从另一个线程监视一个线程 当前正在查看 thread isalive 属性 如果线程中有任何异常 thread isalive 属性仍然为 true 如果线程中有任何异常或者线程处于无限循环中 我想杀死线程 感谢您的意见 解决方案 建议
  • SublimeREPL scala 错误

    我安装了 SublimeREPL 但每次尝试启动 REPL 时 都会出现一个对话框 显示错误 OSError 2 没有这样的文件或目录 我使用 MacPorts 安装了 Scala 2 10 我正在运行 OS X Lion 10 8 3 我
  • 如何围绕已存在但无法在java中修改的类创建接口

    假设我的代码中已经有 2 个类 class SomeOrder String getOrderId return orderId class AnotherOrder String getOrderId return orderId 如何围
  • `postMessage` 或屈服于事件循环或类似的同步共享内存吗?

    我没有看到任何内容JavaScript 规范 https tc39 github io ecma262 the 提议的 DOM 规范扩展 http tc39 github io ecmascript sharedmem dom shmem
  • 错误 您的 SQLite 版本 (3.7.17) 太旧。 Active Record 支持 SQLite >= 3.8

    我刚刚从 Rails 5 2 升级到 Rails 6 当我尝试使用该应用程序执行任何操作时 会引发上述错误 我在 gem 文件中使用 sqlite3 进行开发 旧应用程序工作得很好 但升级后 错误不断抛出 group development
  • 查找成对欧几里得距离(距离矩阵)的快速算法

    我知道 matlab 有一个内置的 pdist 函数可以计算成对距离 然而 我的矩阵太大了 以至于它的 60000 x 300 和 matlab 内存不足 这个问题是后续问题Matlab 欧氏成对平方距离函数 https stackover
  • 为什么我请求 ACCESS_MEDIA_LOCATION 权限时没有显示权限框?

    我正在尝试实现 Android 10 的 ACCESS MEDIA LOCATION 权限 以便访问照片的位置 首先 应用程序请求 READ EXTERNAL STORAGE 权限 以便使用 MediaStore 访问照片 然后应用程序使用
  • 更改序列的起始值 - Postgresql

    我在序列号方面遇到了一个小问题 从一个文件中 我填充了我的数据库 其中有一个客户端ID 它是一个序列号 并且是我的主键 我有 300 个客户端 因此有 300 个客户端 ID 1 到 300 现在我的问题是 我有一个新客户的表单 我无法添加
  • 如何使用包名来区分grails中的类?

    可以使用包名称来区分 grails 中的类吗 例如com business appName DomainClass 和 com business appName foo DomainClass 我认为这会导致问题 因为 grails 需要唯
  • 将我的自定义函数应用于数据框 python

    我有一个数据框 其中有一列称为 信号 我想向该数据框添加一个新列并应用我构建的自定义函数 我对此很陌生 在将我从数据框列中获取的值传递到函数中时 我似乎遇到了麻烦 因此任何有关我的语法错误或推理的帮助将不胜感激 Signal 3 98 3
  • 在CSS中生成对角线(条纹)

    我想知道是否可以在 css 或 svg 中生成对角线来覆盖 div 从而允许 div 的背景颜色显示出来 像下面这样的东西 如果有人有一个例子会很有帮助 你可以试试 HTML div class deg45 stripes TEST div
  • 在 PHP 中使用 session_name() - 无法访问数据

    当我使用时 session name fObj session start SESSION foo bar 随后加载页面并运行 session start print r SESSION 不返回会话数据 如果我删除 session name
  • 是否有办法在 google play 上检查设备兼容性而无需上传

    将 Android 应用程序上传到市场时 Google Play 根据您的应用程序清单设置确定兼容设备列表 例如 使用许可 使用功能 uses sdk 支持屏幕 到目前为止 我发现我必须调整我的清单 以便只有在将我的应用程序上传到 Goog
  • Android 开发人员:TimerTask 和手机睡眠可能有些奇怪?

    我已经编写了我的第二个 Android 应用程序 该应用程序根据特定的时间表 仅截至目前的日期和时间 切换音频配置文件 如果我通过 eclipse 使用模拟器运行代码 代码可以正常工作 但是我最近导出了 apk 并将其安装在我的 At t
  • 无法加速像素修改的 BufferedImages

    很长一段时间 1 2个月 我一直在试图找到这个特定问题的答案 我无法让我的图像硬件加速 我一直在网上搜索 创建了自己的方法 用键盘敲击我的头 仍然感到疼痛 但没有成功 尽管我讨厌 Java SDK 以外的库 但我尝试了 LWJGL 和 JO