2012-04-21 79 views
2

我正在研究Java遊戲引擎,當我切換到Windows登錄屏幕並返回時,緩衝策略失去了它的硬件加速。我做的任何事情都不會將緩衝區恢復到硬件加速,直到我關閉程序並重新啓動它。Java緩衝策略失去硬件加速

下面是當程序啓動時((Graphics2D)bufferStrategy.getDrawGraphics())。getDeviceConfiguration()的一些屬性值。

Bounds: java.awt.Rectangle[x=0,y=0,width=1440,height=900] 
Buffer Capabilities: [email protected] 
    Back Buffer Capabilities: [email protected] 
     Accelerated: true 
     True Volatile: true 
    Flip Contents: undefined 
    Front Buffer Capabilities: [email protected] 
     Accelerated: true 
     True Volatile: true 
    Is Full Screen Required: false 
    Is MultiBuffer Available: true 
    Is Page Flipping: true 
Device: D3DGraphicsDevice[screen=1] 
    Available Accelerated Memory: 750780416 
    ID String: \Display1 
    Type: 0 
    Display Mode: [email protected] 
Image Capabilities: [email protected] 
    Accelerated: true 
    True Volatile: true 

這裏是顯示登錄屏幕後的相同屬性。

Bounds: java.awt.Rectangle[x=0,y=0,width=942,height=566] 
Buffer Capabilities: [email protected] 
    Back Buffer Capabilities: [email protected] 
     Accelerated: false 
     True Volatile: false 
    Flip Contents: null 
    Front Buffer Capabilities: [email protected] 
     Accelerated: false 
     True Volatile: false 
    Is Full Screen Required: false 
    Is MultiBuffer Available: false 
    Is Page Flipping: false 
Device: [email protected] 
    Available Accelerated Memory: -1 
    ID String: BufferedImage 
    Type: 2 
    Display Mode: [email protected] 
Image Capabilities: [email protected] 
     Accelerated: false 
     True Volatile: false 

緩衝功能改變從[email protected][email protected]。如果還沒有找到一種方法將緩衝策略返回到硬件加速。重新處理並創建緩衝策略不會恢復硬件加速。

緩衝區策略在Canvas對象上創建。上面的((Graphics2D)bufferStrategy.getDrawGraphics())。getDeviceConfiguration()屬性失去了加速,但是當我通過調用canvas.getGraphicsConfiguration()獲取Canvas對象上的GraphicsConfiguration時,Canvas對象本身仍然顯示它加速。

以下是canvas.getGraphicsConfiguration()的屬性,而來自緩衝區策略的圖形對象返回false以加速。

Bounds: java.awt.Rectangle[x=0,y=0,width=1440,height=900] 
Buffer Capabilities: [email protected] 
    Back Buffer Capabilities: [email protected] 
     Accelerated: true 
     True Volatile: true 
    Flip Contents: undefined 
    Front Buffer Capabilities: [email protected] 
     Accelerated: true 
     True Volatile: true 
    Is Full Screen Required: false 
    Is MultiBuffer Available: true 
    Is Page Flipping: true 
Device: D3DGraphicsDevice[screen=1] 
    Available Accelerated Memory: 764411904 
    ID String: \Display1 
    Type: 0 
    Display Mode: [email protected] 
Image Capabilities: [email protected] 
    Accelerated: true 
    True Volatile: true 

下面是可用於重現上述問題的代碼:

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.image.BufferStrategy; 

import javax.swing.JFrame; 

public class AccelerationTest extends JFrame { 

    public AccelerationTest(){ 
     setSize(500, 500); 
     setVisible(true);  
     setIgnoreRepaint(true); 
     createBufferStrategy(2); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     (new Thread(new Runnable(){ 
      public void run(){ 
       do{ 
        render(); 
        try{Thread.sleep(200);}catch(InterruptedException e){}       
       }while (true);      
      }   
     })).start(); 
    } 

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

    private void render(){ 

     BufferStrategy bufferStrategy = getBufferStrategy(); 
     Graphics2D graphic = (Graphics2D) bufferStrategy.getDrawGraphics(); 

     graphic.setColor(Color.red); 
     graphic.fillRect(0, 0, getWidth(), getHeight()); 
     graphic.setColor(Color.white); 
     graphic.fillRect((int) (getWidth() * 0.1), (int) (getHeight() * 0.1), (int) (getWidth() * 0.8), (int) (getHeight() * 0.8)); 

     bufferStrategy.show(); 
     System.out.println(); 
     System.out.println("graphic from frame: \n" + getDeviceConfigurationString(graphic.getDeviceConfiguration())); 
     System.out.println(); 
     System.out.println("frame: \n" + getDeviceConfigurationString(getGraphicsConfiguration())); 

     graphic.dispose(); 
    } 

    private String getDeviceConfigurationString(GraphicsConfiguration gc){ 
     return "Bounds: " + gc.getBounds() + "\n" + 
       "Buffer Capabilities: " + gc.getBufferCapabilities() + "\n" + 
       " Back Buffer Capabilities: " + gc.getBufferCapabilities().getBackBufferCapabilities() + "\n" + 
       "  Accelerated: " + gc.getBufferCapabilities().getBackBufferCapabilities().isAccelerated() + "\n" + 
       "  True Volatile: " + gc.getBufferCapabilities().getBackBufferCapabilities().isTrueVolatile() + "\n" + 
       " Flip Contents: " + gc.getBufferCapabilities().getFlipContents() + "\n" + 
       " Front Buffer Capabilities: " + gc.getBufferCapabilities().getFrontBufferCapabilities() + "\n" + 
       "  Accelerated: " + gc.getBufferCapabilities().getFrontBufferCapabilities().isAccelerated() + "\n" + 
       "  True Volatile: " + gc.getBufferCapabilities().getFrontBufferCapabilities().isTrueVolatile() + "\n" + 
       " Is Full Screen Required: " + gc.getBufferCapabilities().isFullScreenRequired() + "\n" + 
       " Is MultiBuffer Available: " + gc.getBufferCapabilities().isMultiBufferAvailable() + "\n" + 
       " Is Page Flipping: " + gc.getBufferCapabilities().isPageFlipping() + "\n" + 
       "Device: " + gc.getDevice() + "\n" + 
       " Available Accelerated Memory: " + gc.getDevice().getAvailableAcceleratedMemory() + "\n" + 
       " ID String: " + gc.getDevice().getIDstring() + "\n" + 
       " Type: " + gc.getDevice().getType() + "\n" + 
       " Display Mode: " + gc.getDevice().getDisplayMode() + "\n" +    
       "Image Capabilities: " + gc.getImageCapabilities() + "\n" + 
       "  Accelerated: " + gc.getImageCapabilities().isAccelerated() + "\n" + 
       "  True Volatile: " + gc.getImageCapabilities().isTrueVolatile() + "\n";   
    } 
} 

回答

1

這個問題可以被忽略。在測試項目之外的代碼之後,我發現這不是緩衝區策略,而是失去硬件加速,而是一個VolatileImage。在檢查是否需要重新創建VolatileImage時,如果isAccelerated返回false,則會跳過該部分。因此,在屏幕更改期間,加速似乎不可用,但會再次變爲可用,但代碼跳過該部分,因爲創建的VolatileImage已經創建而沒有加速。