2013-01-31 15 views
9

Ciao a tutti Spero che qualcuno possa aiutarmi a risolvere questo problema. Ho difficoltà a far funzionare l'accelerazione hardware su un laptop con Intel Integrated Graphics.Accelerazione hardware Java non funzionante con Intel Integrated Graphics

Il problema:

accelerazione hardware utilizzando Java 7 aggiornamento 11 non sembra di lavorare con Intel Graphics integrata su un 7 e 8 computer Windows utilizzando un BufferStrategy con un JFrame.


dettagli

Scheda grafica: Intel (R) HD Graphics 4000
JRE: Java 7 Aggiornamento 11
OS: Windows 7, Windows 8


Risultati attesi

Image of expected results (http://i.stack.imgur.com/PmCoZ.png).


risultati effettivi

Image of actual results (http://i.stack.imgur.com/P3gkb.png).


Risorse

Se si desidera verificare il problema è possibile scaricare l'applicazione che ho creato per test a: http://ndcubed.com/downloads/GraphicsTest.zip

Se don Per sentirsi a proprio agio nel download di un file JAR compilato è possibile compilare autonomamente l'app utilizzando il seguente codice sorgente:

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); 
    } 
} 

Conclusioni

senza accelerazione hardware un sacco di applicazioni che ho creato che lo richiedono eseguito lentamente sulla macchina con grafica integrata. È davvero sconcertante per me perché non funziona in modo specifico con questo tipo di scheda grafica. Comunque grazie per aver letto tutto questo speriamo di poter arrivare a fondo :)!

+0

Grazie per questo post! – UDPLover

risposta

5

Ho appena capito per chi ha lo stesso problema. Era il tipo di JRE installato. Ho avuto l'ambiente JRE a 32 bit installato su una macchina a 64 bit e per qualche motivo non stava utilizzando il chip grafico integrato Intel. Tuttavia, dopo aver installato l'appropriato JRE a 64 bit, il capovolgimento della pagina e l'accelerazione hardware funzionano con il chip integrato Intel.

È possibile scaricare altre versioni di JRE a: http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html

davvero strano non riesco a credere mi sono imbattuto la risposta. Spero che questo aiuti qualcuno in futuro :)

+0

Anche se quanto sopra non funziona prova a impostare la variabile ambientale J2D_D3D_NO_HWCHECK su "true". Per qualche motivo sembra che l'avvio della pipeline Direct3D su Intel Integrated Graphics non superi il controllo hardware, ma saltando questo controllo utilizza Direct3D senza problemi e aumenta le prestazioni abilitando l'accelerazione hardware. 'imposta J2D_D3D_NO_HWCHECK = true' nel prompt dei comandi prima di eseguire l'app. Tuttavia, prestare attenzione quando si impostano le variabili ambientali. – neptune692

2

Prova a impostare la variabile ambientale J2D_D3D_NO_HWCHECK su "true".


Primo metodo

Pannello di controllo -> Sistema -> Impostazioni di sistema avanzate -> Variabili d'ambiente -> Variabili di sistema -> Nuovo ->

  Variable name: J2D_D3D_NO_HWCHECK 
     Variable value: true 

Secondo metodo

Nel file batch:

  set J2D_D3D_NO_HWCHECK=true 

     java -jar myapp.jar 

+0

Mi sono imbattuto in questa risposta mentre cercavo una soluzione al mio problema di schermo bianco Intellij dopo aver aggiornato il mio driver grafico integrato Intel. Dopo aver aggiornato il mio driver, Intellij (nessun'altra app di Java di Swing ha avuto questo problema) visualizza una cornice di una finestra e un semplice bianco all'interno della cornice quando la avvio. Intellij riavviato dopo aver impostato J2D_D3D_NO_HWCHECK = true e quindi ha funzionato correttamente. – IceMan