2009-12-12 16 views
6

मैं एक साधारण गेम प्रोग्रामिंग कर रहा था और इसे जावा ग्राफिक्स + स्विंग एपीआई के माध्यम से प्रदर्शित करना चाहता था। यह निश्चित रूप से थोड़ा धीमा महसूस किया, इसलिए मैंने मापा कि इसे कितना समय लगता है, जो लगभग 32 मिमी था। फिर मैंने त्वरित जावा ग्राफिक्स के बारे में पढ़ा और यहां वर्णित विधि का उपयोग किया: Space Invadersजावा ग्राफिक्स प्रदर्शन

हालांकि, किसी भी तरह यह धीमा भी है। अब इसे फिर से निकालने के लिए लगभग 98 मिमी लगते हैं। ऐसा क्यों है?

ध्यान दें कि मुझे एलडब्लूजीएल और जॉगएल जैसी पुस्तकालयों से अवगत है, लेकिन मैं इस तरह के ग्राफिकल सरल गेम के लिए एक पूर्ण उड़ा ओपनजीएल रैपर का उपयोग नहीं करना चाहता हूं।

+1

क्या आप अपना कुछ चित्र कोड पोस्ट कर सकते हैं? और घड़ी/टाइमर तर्क? – basszero

+0

घड़ी/टाइमर तर्क बस System.currentTimeMillis() के माध्यम से प्राप्त दो लंबे मानों का अंतर है।मुझे पता है कि इस तरह के समय को मापने के लिए यह एक अच्छा दृष्टिकोण नहीं है, लेकिन मैं बस इतना अनुमान लगाता था कि यह कितना समय लगता है। पेंटिंग कोड बस कैनवास पर एक स्थिर छवि खींचता है। तो यह सिर्फ g.drawImage (img, 0, 0, null) है जहां g BufferStrategy चर के माध्यम से प्राप्त किया जाता है। –

उत्तर

6
  1. पढ़ें this टाइमर
  2. प्रणाली बाधा दर को कम करने के लिए पृष्ठभूमि में एक हमेशा सो थ्रेड का उपयोग करें के बारे में और अधिक सटीक टाइमर पाने के लिए!
  3. आप here
  4. में मेरे कोड पर एक नज़र ले जा सकते हैं एक छोटा सा खेल मैं बना लिया है here

    long renderStart = System.nanoTime() 
    // render stuff here 
    long renderTime = (System.nanoTime() - renderStart)/1000000; 
    
+0

मैंने आपकी लाइब्रेरी (बोन्साई) डाउनलोड की। लेकिन मेरे पास एक सवाल है: आपने कक्षा 'गेमइंजिन' बनाई है। यहां उद्देश्य क्या है (Google अनुवाद)? –

+0

असल में मुझे अपने ग्रहण एसवीएन प्लगइन में कोई समस्या थी, इसलिए उसने फ़ाइल को दूरस्थ रूप से हटाया नहीं। बस आज मैंने एक और एसवीएन क्लाइंट के माध्यम से फ़ाइल हटा दी ... जिसने पूरे ग्रहण परियोजना को दुर्घटनाग्रस्त कर दिया, इसलिए मुझे इसे पुनर्निर्माण करना पड़ा, जिसने फिर से किसी भी तरह से भंडार को नष्ट कर दिया: डी तो फाइल विकास से सिर्फ एक बायीं तरफ है, कभी-कभी मैं चाहता था एप्लेट/गुई से वास्तविक इंजन को कारक बनाने के लिए। –

+0

धन्यवाद (15 वर्ण) –

6

स्विंग एक गेम के लिए धीमा हो जाएगा। आपकी सबसे अच्छी शर्त शायद एक एसडीएल रैपर है, जैसे jsdl या sdljava। एसडीएल काफी हल्का है और कई प्लेटफार्मों पर समर्थित है।

अच्छी बात यह है कि अच्छी तरह से लागू 2 डी ग्राफिक्स लाइब्रेरी रैपर Graphics इंटरफ़ेस को कार्यान्वित करते हैं, इसलिए आप कई को आजमा सकते हैं और देख सकते हैं कि आपके कोड को संशोधित किए बिना आपके ऐप के लिए कौन सा सर्वश्रेष्ठ प्रदर्शन करता है।

+0

आज जेएसडीएल और एसडलजावा डेटा से बहुत बाहर हैं। जावा पर उच्च ग्राफिक्स प्रदर्शन की तलाश करने वाले अधिकांश लोग सीधे OpenGL का उपयोग करते हैं, उदा। LWJGL के माध्यम से (http://lwjgl.org/) – mikera

1

मैं, निकोलस के साथ सहमत के लिए ग्राफिक्स/अन्तरक्रियाशीलता प्रसंस्करण महान है

1

प्रयास करें JGame। यह 2 डी गेम के लिए एक साधारण इंजन है जो जीएल का उपयोग करता है जब यह उपलब्ध होता है और मोबाइल फोन से किसी डेस्कटॉप सिस्टम पर चलने वाले गेम का उत्पादन कर सकता है।

1

सबसे पहले पाया जा सकता है, तो आप की जाँच करनी चाहिए और कितना समय देखने अपने कोड बनाम खर्च किया जाता है। वास्तव में फ्रेम को चित्रित करने में कितना समय व्यतीत होता है। आपके पास कुछ बग या गड़बड़ हो सकती है जो इसे धीरे-धीरे चलाती है।

आपको अपनी स्क्रीन खींचने के लिए 98ms के बाद बेहतर प्रदर्शन करने में सक्षम होना चाहिए। वे गेम लाइब्रेरी शायद वही ग्राफिक्स कॉल का उपयोग करेंगे जो आप करेंगे। लेकिन आपके द्वारा उपयोग किए जाने वाले कंटेनर का एक बड़ा प्रभाव हो सकता है कि कितनी तेजी से चीजें खींची जाती हैं। मुझे कुछ महीने पहले कुछ डबल buffered ग्राफिक्स कोड पर काम करना याद है, और बैक बफर कैसे बनाया गया था प्रदर्शन में एक बड़ा अंतर बना दिया।

विशेष रूप से, सुनिश्चित करें कि आप केवल या कम से कम जब केवल आपके कैनवास का आकार बदलते हैं तो पृष्ठभूमि छवि बनाएं। मेरी ड्रा कोड में मैं यह कर:

 //create a graphics backplane 
    if(backplane == null || !backplaneSize.equals(this.getSize())){ 
     backplane = this.createImage((int)this.getSize().getWidth(), (int)this.getSize().getHeight()); 
     backplaneSize = this.getSize(); 
    } 

तो वापस विमान केवल अगर यह नया है, या घटक का आकार बदलने यदि बनाया जाता है। इसमें विशाल गति पर प्रभाव है।

मैं जेडीके 1.0 के बाद जावा में ग्राफिक्स प्रोग्रामिंग कर रहा हूं। असल में मैंने इस बफरस्ट्रेटी चीज़ के बारे में कभी नहीं सुना होगा। हे।

मुझे मूल जावा ग्राफिक्स कॉल के साथ अच्छी फ्रेम दर प्राप्त करने में कभी भी कोई परेशानी नहीं हुई है। यह देखने के लिए एक और चीज यह सुनिश्चित कर रही है कि स्विंग आपके लिए आपके घटक की पृष्ठभूमि को साफ़ करने की कोशिश नहीं कर रही है। यह मंदी का एक और स्रोत हो सकता है।

3

मैं एक विशेषज्ञ नहीं हूं, लेकिन जावा 2 डी विभिन्न प्रतिपादन पाइपलाइनों का समर्थन करता है। मेरी मशीन पर, सिस्टम संपत्ति

sun.java2d.opengl = सच

गति प्रतिपादन में पर्याप्त वृद्धि झुकेंगे की स्थापना करके ओपन किसी पर स्विच।

6

कुछ संकेत के प्रदर्शन में सुधार करने के लिए:

  1. क्लिप और बस ऐसा क्षेत्र है जो
  2. कुछ भी पैमाने पर मत बदल गया है आकर्षित जब
  3. सही बफर रणनीति
  4. उपयोग full screen exclusive mode अगर उपयोग ड्राइंग उचित।

स्विंग स्वाभाविक रूप से धीमी नहीं है। स्विंग के बारे में अधिकांश भ्रम उन लोगों से आता है जो इवेंट डिस्पैच थ्रेड के बारे में नहीं जानते या समझते हैं (और हाँ, यह सही होने के लिए बहुत प्रयास है)।

अपने समय के संबंध में, क्या आप बस समय सेटिंग के बीच g.drawImage को कॉल कर रहे हैं? यदि हां, तो आप किस आकार का भुगतान कर रहे हैं, और क्या आप इस कॉल पर कोई स्केलिंग कर रहे हैं?

संपादित करें:Pulp Core का उल्लेख करना भूल गया - जावा के लिए एक बहुत अच्छा गेमिंग ढांचा।

1

जावा 2 डी प्रदर्शन एक अंधेरे कला का थोड़ा सा है। यह प्लेटफ़ॉर्म के बीच भिन्न हो सकता है, लेकिन इसे अच्छी तरह से करने के लिए इसे प्राप्त करना संभव है।

कभी-कभी प्रतीत होता है कि निर्दोष चीजें बहुत धीमी प्रदर्शन कर सकती हैं। आप यह सुनिश्चित करना चाहते हैं कि आप using accelerated images as much as possible हैं।

छवि के type भी महत्वपूर्ण हो सकते हैं। मुझे पूरा विवरण नहीं पता, लेकिन मुझे पता है कि रूपांतरण कार्यक्रमों के कारण टाइप 5 (3 बीवायटीई बीजीआर) जैसे अन्य प्रकारों की तुलना में मेरे प्रोग्राम टाइप 1 छवियों (आईएनटी आरजीबी) का उपयोग करके बहुत तेज थे।

1

मैं बिल्कुल नहीं बता सकता कि आप क्या कर रहे हैं। आपका प्रश्न स्विंग के बारे में है लेकिन आप कैनवास और बफरस्ट्रेटी का जिक्र करते हैं। अच्छी तरह से स्विंग में आप एक जेपीनल का उपयोग करेंगे जो स्वचालित रूप से डबल buffered है, इसलिए आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

मैंने 1000 चलती गेंदों के साथ एक साधारण एनीमेशन का परीक्षण किया। टाइमर हर 100 एमएमएस आग लगाने के लिए सेट किया गया था। जब टाइमर निकाल दिया गया, 1000 गेंद जहां यादृच्छिक रूप से एक नई स्थिति में चली गई और एक नया बुफर्ड इमेज बनाया गया था और छवि को प्रदर्शित करने वाला पैनल चित्रित किया गया था। पुनर्भुगतान के बीच समय में अंतर 110 एमएमएस था जिसका अर्थ है कि यह एक नया बुफर्ड इमेज बनाने और चित्रकला करने के लिए केवल 10ms लिया गया। पेंटिंग को एक पूर्ण स्क्रीन किया गया था इसलिए कोई क्लिपिंग नहीं की गई थी।

यह posting मैंने जो उदाहरण कोड परीक्षण किया है उसे दिखाएं।

+0

यदि आप कुछ जल्दी के लिए समय मापना चाहते हैं, तो सबसे अच्छा तरीका System.nanoTime() (जेडीके 1.5 में जोड़ा गया) का उपयोग करना है, जो नैनोसेकंड में उपाय करता है। यह System.currentTimeMillis के रूप में लंबे समय तक सटीक नहीं है, लेकिन छोटी अवधि के लिए यह स्पष्ट रूप से अधिक कुशल है। –

संबंधित मुद्दे