2012-11-20 14 views
6

मैं एक वेब एप्लिकेशन बना रहा हूं जो svg पर निर्भर करता है। संदर्भ के लिए, मैं इसके साथ निपटने के लिए राफेल जेएस लाइब्रेरी का उपयोग कर रहा हूं।एसवीजी टेक्स्ट तत्व गति

इस विशेष मामले में मैंने कुछ ऐसा लागू किया है जो स्क्रॉलबार की नकल करता है और स्क्रीन पर svg सुविधाओं (~ 500 तत्व) का गुच्छा चलाता है। उन सुविधाओं का हिस्सा <text> (~ 100) तत्व हैं। अन्य तत्वों में <rect>, <image> और <path> तत्व शामिल हैं।

तो, मैंने देखा कि मेरा आवेदन वास्तव में मेरे लैपटॉप पर बहुत ही नाराज नहीं है, और गति के कारण आईपैड पर निपटने के लिए सही परेशान है। हालांकि, स्क्रॉलिंग के दौरान जब भी टेक्स्ट तत्व हटा दिए जाते हैं या अनदेखा होते हैं, तो यह तुरंत सभ्य गति तक पहुंच जाता है।

मैं जब <text> तत्वों को शामिल कर रहे हैं कुछ गति परीक्षण कर की कोशिश की (बहुत कच्चे हैं, new Date().getTime() का प्रयोग करके) और कहा कि यह ~ 10 एमएस <text> तत्वों को छोड़कर सभी तत्वों को स्थानांतरित करने के लिए ले जाता है, लेकिन यह लेता है ~ 120 एमएस।

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

क्या टेक्स्ट को एम्बेड करना संभव है, इसलिए पाठ को रास्टर ग्राफ़िक के रूप में प्रस्तुत किया गया है, न कि आकार के रूप में? या किसी भी अन्य तरीके से प्रतिपादन पाठ के प्रदर्शन में सुधार?

मुझे पृष्ठभूमि पारदर्शिता की आवश्यकता नहीं है, और मैं किसी भी फैंसी फोंट का उपयोग नहीं करता हूं।

+0

आप 'paper.print()' या 'paper.text का उपयोग कर()' अपने पाठ तत्वों को बनाने के हैं। एक बेवकूफ भी अच्छा हो सकता है। – Bruno

+0

क्या आप ब्राउज़र के विशिष्ट सेट को लक्षित कर रहे हैं? प्रदर्शन ब्राउज़र के बीच नाटकीय रूप से भिन्न है। – Sebastian

+0

@ ब्रूनो मैं paper.text() का उपयोग कर रहा हूं, जो अभी भी काफी धीमी है। – gintas

उत्तर

3

आप कैनवास और embed images into the SVG का उपयोग करके टेक्स्ट को प्रीरेंडर कर सकते हैं। मुझे नहीं पता कि यह सामान्य रूप से टेक्स्ट तत्व प्रतिपादन की तुलना में कैसे तुलना करता है, लेकिन our demos के लिए यह बहुत अच्छी तरह से काम करता है ("पदानुक्रम" उदाहरण में ड्रॉप छाया देखें - उन्हें पहले कैनवास में प्रस्तुत किया जाता है और फिर एसवीजी के भीतर से दोहराया जाता है और संदर्भित किया जाता है) ।

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

डेमो तत्वों को चारों ओर ले जाने से कहीं अधिक कुछ करते हैं, इसलिए इसे समान या बेहतर प्रदर्शन प्राप्त करना आसान होना चाहिए।

मुझे नहीं पता कि राफेल के साथ ऐसा कैसे करें, लेकिन मुझे विश्वास है कि आप कैनवास छवि से डेटा यूआरएल को एसपीजी में राफेल के साथ भी डाल सकते हैं।

+0

यह एक दिलचस्प समाधान की तरह लगता है। अब कोशिश करूँगा। – gintas

2

Paper.print() राफेल साइट के अनुसार

रास्ता है कि पाठ लिखा दी प्रतिनिधित्व दिए गए आकार के साथ दी गई स्थिति पर दिया फ़ॉन्ट का उपयोग करके

अनिवार्य रूप से अपने पाठ में बदल जाती है बनाता है एक रास्ता। जाहिर है इसमें प्रदर्शन के मुद्दे हैं।

शायद पेपर का उपयोग करने के लिए चिपकने के लिए सबसे अच्छा है।पाठ()

अद्यतन

तो बस सलाह मैं http://www.jsperf.com पर कुछ परीक्षण की स्थापना की है बाहर dishing से संतुष्ट नहीं। इन्हें विभिन्न प्रकार के राफेल ऑब्जेक्ट्स को एनिमेट करने और बदलने के प्रदर्शन में मतभेदों की तुलना करने के लिए इस्तेमाल किया जा सकता है।

यदि आप इन्हें अपने आईपैड पर चलाते हैं तो यह दिखाना चाहिए कि पाठ तत्व वास्तव में स्थानांतरित करने के लिए बहुत धीमे हैं या नहीं। ध्यान देने योग्य एक और बात यह है कि, कम से कम परीक्षणों में मैंने भाग लिया, paper.print() और paper.text() प्रदर्शन के संदर्भ में अलग नहीं थे।

Run the tests on jsperf

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