2008-09-29 32 views
31

मैं जावा 2 डी गेम लिखने की प्रक्रिया में हूं। मैं अंतर्निहित जावा 2 डी ड्राइंग पुस्तकालयों का उपयोग कर रहा हूं, एक ग्राफिक्स 2 डी पर चित्रण करता हूं जिसे मैं एक जेफ्रेम में कैनवास से एक बफरस्ट्रेटी से प्राप्त करता हूं (जिसे कभी-कभी पूर्ण-स्क्रीन किया जाता है)। BufferStrategy डबल-buffered है। पुनर्भुगतान एक टाइमर के माध्यम से सक्रिय रूप से किया जाता है। हालांकि, विशेष रूप से लिनक्स पर मुझे कुछ प्रदर्शन समस्याएं हैं।जावा 2 डी ड्राइंग इष्टतम प्रदर्शन

और जावा 2 डी में ग्राफिक्स बफर बनाने और ग्राफिक्स ड्राइंग बनाने के बहुत सारे तरीके हैं जो मुझे नहीं पता कि मैं सही काम कर रहा हूं या नहीं। मैं graphics2d.getDevice कॉन्फ़िगरेशन() के साथ प्रयोग कर रहा हूं। बनाएँ कॉम्पैक्टिव वोल्टाइल इमेज, जो वादा करता है, लेकिन मेरे पास कोई वास्तविक सबूत नहीं है कि अगर मैं ड्रॉइंग कोड को उस पर स्विच करता हूं तो यह कोई तेज़ होगा।

आपके अनुभव में, जावा 1.5+ में स्क्रीन पर 2 डी ग्राफिक्स प्रस्तुत करने का सबसे तेज़ तरीका क्या है? ध्यान दें कि गेम काफी आगे है, इसलिए मैं ओपनजीएल या गेम इंजन जैसे ड्राइंग की एक पूरी तरह से अलग विधि पर स्विच नहीं करना चाहता हूं। मैं मूल रूप से जानना चाहता हूं कि स्क्रीन पर सामान खींचने के लिए ग्राफिक्स 2 डी ऑब्जेक्ट का उपयोग करने का सबसे तेज़ तरीका कैसे प्राप्त करें।

+0

जिज्ञासा से बाहर, गेम क्या है? : डी –

+0

पुन: मारियो ऑर्टेगॉन: http: // www।metalbeetle.com/spaceexploration/। मैंने मुख्य में एक लिंक नहीं लगाया क्योंकि यह केवल चुपके विज्ञापन होगा। – Zarkonnen

+1

लिंक थोड़ा अजीब लगता है (.. लेकिन वह 8 साल पहले था) –

उत्तर

16

मुझे वही समस्याएं हैं जो आपको लगता है। यहाँ मेरी पोस्ट की जाँच करें:

Java2D Performance Issues

यह प्रदर्शन गिरावट और इसे ठीक करने के लिए कारण पता चलता है। हालांकि सभी प्लेटफार्मों पर अच्छी तरह से काम करने की गारंटी नहीं है। आप देखेंगे कि पोस्ट में क्यों।

0

सुनिश्चित करें कि आप डबल बफरिंग का उपयोग करते हैं, पहले स्मृति में एक बड़े बफर को आकर्षित करें जिसे आप सभी ड्राइंग करते समय स्क्रीन पर फ्लश करते हैं।

+1

वर्तमान में, मैं myCanvas.createBufferStrategy (2) का उपयोग करता हूं। लेकिन मुझे नहीं पता कि मैन्युअल रूप से एक वाष्पशील बफर बनाना तेजी से नहीं होगा। – Zarkonnen

1

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

0

रहे हैं चीजों की जोड़ी आप मन

1) में रखने के लिए की आवश्यकता होगी ताज़ा हो रहा है this link दिखाता है कि कैसे swingtimers जो फिर से रंगना फोन करने के लिए एक अच्छा विकल्प हो सकता है का उपयोग करें। पश्चाताप प्राप्त करना (जैसा कि पिछले पोस्टर ने कहा है महत्वपूर्ण है इसलिए आप बहुत अधिक काम नहीं कर रहे हैं)।

2) सुनिश्चित करें कि आप केवल एक थ्रेड में ड्राइंग कर रहे हैं। मल्टीप्ल थ्रेड से यूआई को अपडेट करने से बुरा चीजें हो सकती हैं।

3) डबल बफरिंग। यह प्रतिपादन आसान बनाता है। this site आपके लिए कुछ और अच्छी जानकारी है

+0

[लिंक] (https://docs.oracle.com/javase/tutorial/extra/fullscreen/rendering.html) [लिंक] (http://zetcode.com/tutorials/javagamestutorial/animation/) यह बेहतर है स्विंग टाइमर से बचने और एनीमेशन के लिए धागे पर भरोसा करने के लिए। पुनर्वित्त पर निर्भर प्रतिपादन पारित करने के बजाय सक्रिय प्रतिपादन का उपयोग करना भी अच्छा अभ्यास है() – ingframin

1

मैं इस प्रश्न को देख रहा हूं, उम्मीद है कि कोई आपको मुझसे बेहतर जवाब देगा।

इस बीच, मुझे निम्नलिखित Sun white paper मिला जो जेडीके 1.4 की बीटा रिलीज के बाद लिखा गया था।

"रनटाइम सोलारिस के लिए करें और लिनक्स

एसडीके के बीटा 3 रिलीज के साथ शुरू: वहाँ कुछ दिलचस्प सिफारिशों क्रम झंडे (लेख के नीचे) सहित, ठीक करने पर यहाँ हैं , संस्करण 1.4, जावा 2 डी डिस्प्ले छवियों को डिफ़ॉल्ट रूप से पिक्समैप्स में संग्रहीत करता है जब डीजीए उपलब्ध नहीं है, चाहे आप स्थानीय या रिमोट डिस्प्ले वातावरण में काम कर रहे हों। आप इस व्यवहार को pmoffscreen ध्वज के साथ ओवरराइड कर सकते हैं:

-Dsun.java2d.pmoffscreen = सत्य/झूठा

यदि आप इस ध्वज को सही पर सेट करते हैं, डीजीए उपलब्ध होने पर भी ऑफस्क्रीन पिक्समैप समर्थन सक्षम है। यदि आप इस ध्वज को गलत पर सेट करते हैं, तो ऑफस्क्रीन पिक्समैप समर्थन अक्षम है। ऑफस्क्रीन पिक्समैप समर्थन को अक्षम करने से कुछ प्रतिपादन समस्याएं हल हो सकती हैं। "

10

यहां मेरे सिर के ऊपर से कुछ सुझाव दिए गए हैं।यदि आप अधिक विशिष्ट थे और आप जो करने की कोशिश कर रहे थे, तो मैं और अधिक मदद करने में सक्षम हो सकता हूं। एक खेल की तरह लगता है, लेकिन मैं मानना ​​नहीं चाहता।

केवल वही ड्रा जो आपको चाहिए! अंधेरे से अंधाधुंध() हर समय कॉल न करें, कुछ भाई बहनों को दोबारा दोबारा कोशिश करें (रेक्ट) या पुनर्वित्त (एक्स, वाई, डब्ल्यू, एच)।

अल्फा मिश्रण के साथ बहुत सावधान रहें क्योंकि यह छवियों/primitives मिश्रण करने के लिए एक महंगा ऑपरेशन हो सकता है।

जितना संभव हो उतना प्रीरेंडर/कैश करने का प्रयास करें। यदि आप अपने आप को एक सर्कल ड्राइंग करते हैं, वैसे ही, एक बुफर्ड इमेज में ड्राइंग करने पर विचार करें और फिर बस BufferedImage खींचें। आप गति के लिए स्मृति का त्याग कर रहे हैं (गेम/उच्च परफ ग्राफिक्स के विशिष्ट)

ओपनजीएल का उपयोग करने पर विचार करें, एलडब्ल्यूजेजीएल के जॉगएल का उपयोग करें। जॉगएल अधिक जावा जैसी है जबकि एलडब्ल्यूजेजीएल ओपनजीएल एक्सेस के शीर्ष पर अधिक गेमिंग कार्यक्षमता प्रदान करता है। ओपनजीएल स्विंग कैन की तुलना में परिमाण (उचित हार्डवेयर और ड्राइवरों के साथ) के आदेश खींच सकता है।

26

मेरे अपने अनुसंधान इस पोस्ट के जवाब का एक संश्लेषण, Consty's के लिए जवाब है, और:

क्या काम करता है:

  • उपयोग GraphicsConfiguration.createCompatibleImage क्या आप पर ड्राइंग कर रहे हैं के साथ संगत चित्र बनाने के लिए। यह बिल्कुल जरूरी है!
  • Canvas.createBufferStrategy के माध्यम से डबल-बफरर्ड ड्राइंग का उपयोग करें।
  • -Dsun.java2d.opengl=True का उपयोग करें जहां ड्राइंग को गति देने के लिए उपलब्ध है।
  • स्केलिंग के लिए परिवर्तनों का उपयोग करने से बचें। इसके बजाय, उन छवियों के कैश स्केल किए गए संस्करण जिन्हें आप उपयोग करने जा रहे हैं।
  • पारदर्शी छवियों से बचें! बिटमास्क की गई छवियां ठीक हैं, लेकिन जावा 2 डी में पारदर्शिता बहुत महंगा है।

इन तरीकों का उपयोग करके, मेरे परीक्षणों में, मुझे 10x-15x की गति वृद्धि हुई, जिससे उचित जावा 2 डी ग्राफिक्स एक संभावना बना।

0

एक विकल्प यदि आप शुद्ध जावा 2 डी नहीं जाना चाहते हैं तो जीटीजीई या जेजीएएम (Google पर उनके लिए खोज) जैसी गेम लाइब्रेरी का उपयोग करना है, फिर ग्राफिक्स तक आसान पहुंच प्रदान करें और डबल बफरिंग और बहुत सरल ड्राइंग आदेश।

3

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

आप स्पष्ट रूप से प्रतिपादन संकेतों को सेट करना और गुणवत्ता विचारों की अनुमति देने पर चीजों को एंटीअलाइजिंग करना बंद करना भी चाहेंगे।

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