我正在研究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";
}
}