संपादित दोजावा: स्विंग में डबल-बफरिंग कैसे करें?
snarky टिप्पणी और एक-पंक्ति को रोकने के लिए बात को अनदेखा कर जवाब देता है: आईएफएफ यह बुला के रूप में सरल है setDoubleBuffered (सही), तो मैं कैसे वर्तमान ऑफ़लाइन बफर के लिए उपयोग मिलता है ताकि मैं BufferedImage के अंतर्निहित पिक्सेल डाटाबेसर के साथ गड़बड़ करना शुरू कर सकूं?
मैंने कोड का एक चलने वाला टुकड़ा लिखने के लिए समय निकाला (जो कि थोड़े मज़ेदार दिखता है) इसलिए मैं वास्तव में जवाब देने की प्रतिक्रिया की सराहना करता हूं (मेरा क्या झटका;) मेरा प्रश्न और समझाता है कि यह एक के बजाय क्या काम कर रहा है -लाइनर और स्नैकी टिप्पणियां;)
यहां कोड का एक कामकाजी टुकड़ा है जो एक जेएफआरएएम में एक वर्ग को उछालता है। मैं कोड के इस टुकड़े को बदलने के लिए इस्तेमाल किए जा सकने वाले विभिन्न तरीकों के बारे में जानना चाहता हूं ताकि यह डबल-बफरिंग का उपयोग कर सके।
ध्यान दें कि जिस तरह से मैं स्क्रीन साफ़ करता हूं और वर्ग को फिर से चलाता हूं, वह सबसे कुशल नहीं है लेकिन यह वास्तव में यह नहीं है कि यह प्रश्न क्या है (एक तरह से, यह इस उदाहरण के लिए बेहतर है कि यह कुछ हद तक धीमा है)।
असल में, मुझे बुफर्ड इमेज में कुछ पिक्सल को लगातार संशोधित करने की आवश्यकता है (जैसा कि कुछ प्रकार की एनीमेशन है) और मैं स्क्रीन पर एकल-बफरिंग के कारण दृश्य कलाकृतियों को देखना नहीं चाहता हूं।
मुझे एक जेएलएबल मिला है जिसका आइकन एक छवि आइकन है जिसे बुफर्ड इमेज लपेटता है। मैं उस BufferedImage को संशोधित करना चाहता हूँ।
क्या किया जाना चाहिए ताकि यह डबल-बफर हो जाए?
मैं समझता हूँ कि किसी भी तरह "छवि 1" जबकि मैं "छवि 2" पर ड्राइंग हो जाएगा दिखाया जाएगा। लेकिन फिर एक बार जब मैं "छवि 2" पर चित्रण कर रहा हूं, तो मैं "छवि 1""छवि 2" द्वारा "जल्दी" कैसे बदलूं?
क्या ऐसा कुछ है जो मुझे जेएलएबल के इमेज आइकन को स्वैप करके मैन्युअल रूप से करना चाहिए?
क्या मुझे हमेशा एक ही बुफर्ड इमेज में चित्रित करना चाहिए, तो उस BufferedImage के पिक्सेल के जेलाबेल की छवि आइकन के बुफर्ड इमेज में तेज 'ब्लिट' करें? (मुझे नहीं लगता है और मुझे नहीं लगता कि मैं मॉनीटर की "वर्टिकल रिक्त लाइन" [या फ्लैट स्क्रीन में समकक्ष) के साथ "सिंच" कैसे कर सकता हूं: मेरा मतलब है कि मॉनिटर स्वयं रीफ्रेश करने के पल के साथ हस्तक्षेप किए बिना 'सिंच' करने के लिए पिक्सल, कतरनी को रोकने के लिए])।
"repaint" आदेशों के बारे में क्या? क्या मुझे लगता है कि ये खुद को ट्रिगर करना है? मुझे/कब बिल्कुल repaint() या कुछ और कहां कॉल करना चाहिए?
सबसे महत्वपूर्ण आवश्यकता यह है कि मुझे छवियों के पिक्सेल डाटाबेस में सीधे पिक्सल संशोधित करना चाहिए।
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
public class DemosDoubleBuffering extends JFrame {
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
int xs = 3;
int ys = xs;
int x = 0;
int y = 0;
final int r = 80;
final BufferedImage bi1;
public static void main(final String[] args) {
final DemosDoubleBuffering frame = new DemosDoubleBuffering();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setSize(WIDTH, HEIGHT);
frame.pack();
frame.setVisible(true);
}
public DemosDoubleBuffering() {
super("Trying to do double buffering");
final JLabel jl = new JLabel();
bi1 = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
final Thread t = new Thread(new Runnable() {
public void run() {
while (true) {
move();
drawSquare(bi1);
jl.repaint();
try {Thread.sleep(10);} catch (InterruptedException e) {}
}
}
});
t.start();
jl.setIcon(new ImageIcon(bi1));
getContentPane().add(jl);
}
private void drawSquare(final BufferedImage bi) {
final int[] buf = ((DataBufferInt) bi.getRaster().getDataBuffer()).getData();
for (int i = 0; i < buf.length; i++) {
buf[i] = 0xFFFFFFFF; // clearing all white
}
for (int xx = 0; xx < r; xx++) {
for (int yy = 0; yy < r; yy++) {
buf[WIDTH*(yy+y)+xx+x] = 0xFF000000;
}
}
}
private void move() {
if (!(x + xs >= 0 && x + xs + r < bi1.getWidth())) {
xs = -xs;
}
if (!(y + ys >= 0 && y + ys + r < bi1.getHeight())) {
ys = -ys;
}
x += xs;
y += ys;
}
}
संपादित
यह एक पूर्ण स्क्रीन जावा आवेदन के लिए नहीं है, लेकिन एक नियमित रूप से जावा अनुप्रयोग, अपने स्वयं के (कुछ छोटे) विंडो में चल रहा है।
स्विंग डिफ़ॉल्ट रूप से डबल buffered है। यह एडब्ल्यूटी नहीं है। – camickr
अभी भी किसी के लिए वास्तविक कोड पोस्ट करने का इंतजार है जिसे हम जांच सकते हैं कि डबल बफरिंग प्रयास के लायक है या नहीं। – camickr
मुझे लगता है कि आपने स्विंग को गलत समझा है। आप ऑफ़लाइन बफर (अनमोडिफाइड) तक नहीं पहुंच सकते हैं। स्विंग आपके माता-पिता को बफर को पीछे रखेगी, और आपके माता-पिता इसे संशोधित करेंगे। ... जो भी आप चाहते हैं उसे करने के लिए, आपको * स्विंग डबलबफरिंग को अक्षम करना होगा और कहें, BufferedImage कहें। यदि आप असली "बिटब्लेट" करना चाहते हैं, तो आपको एडब्ल्यूटी में "भारी वजन" घटक का उपयोग करना होगा। –