2014-05-07 9 views
5

मैं कुछ जावा 2 डी कोड जावाएफएक्स में कनवर्ट करने की कोशिश कर रहा हूं और मैं जावाएफएक्स कैनवास के प्रदर्शन के संबंध में एक समस्या के साथ फंस गया हूं। किसी बिंदु पर, मुझे स्क्रीन पर हजारों छोटी मंडलियां खींचना होगा।जावाएफएक्स कैनवास देरी

मेरी समस्या यह है कि पहले चित्र में, मेरे कोड को निष्पादित करने में काफी समय लगता है। लेकिन अगर मुझे दूसरी ड्राइंग करना है, तो इसे आकर्षित करने के लिए केवल समय का एक अंश लगता है (यह कम से कम 10 गुना तेज है)।

क्या कुछ भी गलत है? क्या प्रारंभिक देरी को रोकने के लिए कोई रास्ता है?

मैंने इस कोड को परीक्षण करने के लिए लिखा था। इस कोड में मैं 1000 x 1000 कैनवास (पहले निर्मित) पर यादृच्छिक पदों पर 500,000 सर्किल खींचता हूं। मैंने इस कोड को बटन क्लिक ईवेंट से लिंक किया है, और पहली बार क्लिक करने पर इसे निष्पादित करने में 10 सेकंड लगते हैं। लेकिन अगर मैं फिर से क्लिक करता हूं, तो इसमें केवल 0.025 सेकंड लगते हैं।

private void paintCanvas() { 
    long initTime = System.currentTimeMillis(); 

    GraphicsContext cg = canvas.getGraphicsContext2D(); 
    cg.setFill(Color.WHITE); 
    cg.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
    cg.setFill(Color.rgb(0, 0, 0, 0.1)); 

    Random rand = new Random(); 
    for (int i = 0; i < 500000; i++) {  
     cg.fillOval(1000 * rand.nextFloat(), 1000 * rand.nextFloat(), 2, 2); 
    } 

    long endTime = System.currentTimeMillis(); 
    System.out.println("Time spent on drawing:" + (endTime - initTime)/1000.0f);   
} 

असल में नए तत्वों की अधिकतम संख्या नहीं है। उपयोगकर्ताओं की जरूरतों के आधार पर यह कुछ सैकड़ों से सैकड़ों हजारों में भिन्न हो सकता है। और हाँ, यह ठीक है अगर कुछ तत्व समय के साथ पॉप-अप करते हैं।

+0

मैं 500,000 पता इस मुद्दे को प्रदर्शित करने के लिए मूल्य है, लेकिन आपके लक्षित एप्लिकेशन में कितने, प्रत्येक फ्रेम को आकर्षित करने के लिए आपको * नए * तत्वों की अधिकतम संख्या क्या है? इस तरह एक उत्तर आपकी विशिष्ट बाधाओं के अनुरूप बेहतर हो सकता है। साथ ही, क्या ऐप के लिए यह ठीक है अगर कुछ तत्व समय के साथ "पॉप इन" करते हैं? – jewelsea

+0

हाय गहने। असल में नए तत्वों की अधिकतम संख्या नहीं है। उपयोगकर्ताओं की जरूरतों के आधार पर यह कुछ सैकड़ों से सैकड़ों हजारों में भिन्न हो सकता है। और हाँ, यह ठीक है अगर कुछ तत्व समय के साथ पॉप-अप करते हैं। –

+0

संबंधित [कैनवास डेवलपर द्वारा मेलिंग सूची टिप्पणी] से संबंधित करें (http://mail.openjdk.java.net/pipermail/openjfx-dev/2014-May/013838.html)। – jewelsea

उत्तर

1

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

जिम ग्राहम (ओरेकल पर james.graham:

यहाँ जवाब मुझे मिल गया है।कॉम)

सोम मई 12 21:17:19 यूटीसी 2014

इस वजह से आदेश बफर जो किया गया था रैखिक एक बिंदु पर (शायद अभी भी 2.2 में उस तरह से किया जाता है) से बढ़ जाने की संभावना है, लेकिन है अब 8.0 में घातीय। समय पहले प्रस्तुत करना लगभग तात्कालिक 8.0 में है, लेकिन जैसा कि आप मिल गया एक लंबा समय लगता है जब मैं अपना 2.x बनाता वर्ष में से एक के साथ प्रयास करें ...

 ...jim 
0

मैं कुछ चीज़ें के बारे में सोच लेकिन एक के साथ शुरू करते हैं कर सकते हैं:

यह हो सकता है कि बस समय में JVM संकलक अपने निष्पादन मार रहा है। आपके जेवीएम विकल्प पर निर्भर करता है (चाहे वह क्लाइंट या सर्वर जेआईटी हो, और चाहे आप AggresiveOpts का उपयोग कर रहे हों या नहीं)।

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

हमें अपने निष्कर्षों को जानें!

JVM विकल्पों संदर्भ (अपने विशिष्ट JVM दस्तावेज़ को खोजने के लिए आवश्यकता हो सकती है): http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

पी.एस. क्या आप यादृच्छिकता को तुरंत चालू करने से पहले प्रारंभ समय को कम करने का प्रयास कर सकते हैं ?, यह अच्छा होगा कि भिखारी पर एक बार और यादृच्छिक से पहले, और दूसरा, इस आखिरी बार के ठीक बाद और अंत में लूप समाप्त हो गया, विचार यह है कि जब आप इसे देखते हैं तो आपका कोड कहां खर्च कर रहा है, उस पर ब्रेक डाउन करने का प्रयास करना है (लूप, या कैनवास तत्काल)।

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