2013-01-31 9 views
9

Witam wszystkich Mam nadzieję, że ktoś pomoże mi rozwiązać ten problem. Mam problem z przyspieszeniem sprzętowym do pracy na laptopie z Intel Integrated Graphics.Akceleracja sprzętowa Java nie działa z kartą graficzną Intela

Problem:

Akceleracja sprzętowa przy użyciu Java 7 aktualizację 11 nie wydaje się działać z zintegrowana grafika Intela na Windows 7 i 8 maszyny z wykorzystaniem BufferStrategy z JFrame.


Szczegóły

Karta graficzna: Intel (R) HD Graphics 4000
JRE: Java 7 Aktualizacja 11
OS: Windows 7, Windows 8


oczekiwanych rezultatów

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


Rzeczywiste wyniki

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


Resources

Jeśli chcesz sprawdzić problemu można pobrać aplikację stworzyłem dla testów na: http://ndcubed.com/downloads/GraphicsTest.zip

Jeśli don Czuć się komfortowo, pobierając skompilowany plik JAR, możesz samodzielnie skompilować aplikację przy użyciu następującego kodu źródłowego:

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

Wnioski

bez akceleracji sprzętowej wiele aplikacji, które stworzyłem, które wymagają go uruchomić powoli na maszynie ze zintegrowaną grafiką. To naprawdę zaskakujące dla mnie, dlaczego nie działa specjalnie z tego typu kartą graficzną. W każdym razie dziękuję za przeczytanie tego wszystkiego, mam nadzieję, że możemy dojść do sedna tego :)!

+0

Dzięki za taki post! – UDPLover

Odpowiedz

5

Po prostu wymyśliłem to dla każdego, kto ma ten sam problem. Był to rodzaj zainstalowanego JRE. Miałem 32-bitowe środowisko JRE zainstalowane na maszynie 64-bitowej iz jakiegoś powodu nie wykorzystywałem zintegrowanego układu graficznego Intela. Jednak po zainstalowaniu odpowiedniego 64-bitowego środowiska JRE, przerzucanie strony i akceleracja sprzętowa działają z układem scalonym Intela.

można pobrać inne wersje JRE w: http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html

Naprawdę dziwne, nie mogę uwierzyć, że natknęliśmy się na odpowiedź. Mam nadzieję, że to pomoże komuś w przyszłości :)

+0

Również jeśli powyższe nie działa, spróbuj ustawić zmienną środowiskową J2D_D3D_NO_HWCHECK na "true". Z jakiegoś powodu wydaje się, że uruchomienie potoku Direct3D na zintegrowanej karcie graficznej Intel nie kończy procesu sprawdzania sprzętu, ale pomijając to sprawdzenie, bez problemu używa Direct3D i zwiększa wydajność poprzez włączenie przyspieszania sprzętowego. 'ustaw J2D_D3D_NO_HWCHECK = true' w wierszu poleceń przed uruchomieniem aplikacji. Należy jednak zachować ostrożność podczas ustawiania zmiennych środowiskowych. – neptune692

2

Spróbuj ustawić zmienną środowiskową J2D_D3D_NO_HWCHECK na "true".


Pierwsza metoda

Panel sterowania -> System -> Zaawansowane ustawienia systemu -> Zmienne środowiskowe -> Zmienne systemowe -> Nowy ->

  Variable name: J2D_D3D_NO_HWCHECK 
     Variable value: true 

Druga metoda

W pliku wsadowym:

  set J2D_D3D_NO_HWCHECK=true 

     java -jar myapp.jar 

+0

Natknąłem się na tę odpowiedź, szukając rozwiązania problemu z moim białym monitorem Intellij po tym, jak zaktualizowałem sterownik Intrgrated Graphics Intela. Po aktualizacji sterownika, Intellij (żadna inna aplikacja Swing Java nie miała tego problemu) wyświetla ramkę okna i gładką biel wewnątrz ramki po uruchomieniu. Zrestartowano Intellij po ustawieniu J2D_D3D_NO_HWCHECK = true, a następnie działało dobrze. – IceMan

Powiązane problemy