rame.createBufferStrategy(2); // Number of buffers to have
BufferStrategy bufferStrategy = frame.getBufferStrategy();
while (!done()) { // Some condition to end
Graphics g = null;
try {
g = bufferStrategy.getDrawGraphics();
drawNextScene(g); // Method to draw to
} finally {
// Free resources
if (g != null) {
g.dispose();
}
}
bufferStrategy.show();
}
使用 BufferStrategy 时,您不能假设绘制到缓冲区的最后一项仍有效;必须使用 contentsLost() 方法进行询问。如果丢失该项,则必须重新绘制整个缓冲区。否则,您只需绘制最后一次使用后发生的更改的项。
除了 BufferStrategy 的缓冲区支持外, BufferCapabilities 类允许您使用 getCapabilities() 方法来发现某个策略支持哪些能力,如全屏幕方式。
Merlin的魔力: 练习完全控制图形显示(4)
时间:2011-02-02 IBM John Zukowski
工作示例
将所有代码段放在一起可产生清单 7 中的示例程序。由于我的美术技能有限,所以不要指望有什么复杂的花样。然而,您将发现一个使用 BufferStrategy 和全屏幕绘制方式的完整工作示例。示例程序通过记住什么东西没有绘制到当前缓冲区来有意 不让缓冲区同步 ― 以便让您更清楚地了解同时工作的多个缓冲区。程序的确随意地将 100 个矩形绘制到屏幕,两次绘制之间有 1/10 秒的延迟。
清单 7. 工作示例
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.Random;
public class MultipleBuffers {
public static void main(String args[]) {
GraphicsEnvironment graphicsEnvironment =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice =
graphicsEnvironment.getDefaultScreenDevice();
DisplayMode displayModes[] = graphicsDevice.getDisplayModes();
DisplayMode originalDisplayMode = graphicsDevice.getDisplayMode();
JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.setIgnoreRepaint(true);
try {
if (graphicsDevice.isFullScreenSupported()) {
graphicsDevice.setFullScreenWindow(frame);
}
Random random = new Random();
int mode = random.nextInt(displayModes.length);
DisplayMode displayMode = displayModes[mode];
System.out.println(displayMode.getWidth() + "x" +
displayMode.getHeight() + " \t" + displayMode.getRefreshRate() +
" / " + displayMode.getBitDepth());
if (graphicsDevice.isDisplayChangeSupported()) {
graphicsDevice.setDisplayMode(displayMode);
}
frame.createBufferStrategy(2);
BufferStrategy bufferStrategy = frame.getBufferStrategy();
int width = frame.getWidth();
int height = frame.getHeight();
for (int i=0; i<100; i++) {
Graphics g = bufferStrategy.getDrawGraphics();
g.setColor(new Color(random.nextInt()));
g.fillRect(random.nextInt(width),
random.nextInt(height), 100, 100);
bufferStrategy.show();
g.dispose();
Thread.sleep(100);
}
} catch (InterruptedException e) {
} finally {
graphicsDevice.setDisplay
|