2012-04-25 12 views
5

मैंने एक जावास्क्रिप्ट फ़ंक्शन का आह्वान करने के लिए "बाहरी इंटरफेस.call()" का उपयोग करने का प्रयास किया है जो कैनवास की सामग्री देता है। हालांकि, अपेक्षाकृत छोटे कैनवास (256x256) के लिए यह तर्कसंगत/वापसी मूल्य के मार्शलिंग की वजह से बहुत धीमा (लगभग 2 सेकंड) है।फ्लैश में एचटीएमएल 5 कैनवास की सामग्री को कुशलता से आयात करने के लिए कैसे?

भले ही मैं कैनवास डेटा को छोटे हिस्सों में तोड़ दूं, जैसा कि ब्रैड न्यूबर्गे द्वारा एक पुरानी पोस्ट (2006 से) में सुझाया गया है: http://codinginparadise.org/weblog/2006/02/how-to-speed-up-flash-8s.html, मुझे अभी भी खराब प्रदर्शन मिलता है। किसी भी तरह से फ्लैश 9 के रूप में भाग का आकार कोई मुद्दा नहीं होना चाहिए।

मुझे लगता है कि मैं फ्लैश जावास्क्रिप्ट फ़ंक्शंस को ओवरराइट करने का प्रयास कर सकता हूं जो मापदंडों के मार्शलिंग/मूल्यांकन करते हैं, लेकिन यह बहुत शामिल है और मैं जानना चाहता था कि ऐसा करने से पहले मुझे कुछ आसान याद आ रहा था या नहीं।

मैं भी ऐसा करने से फ्लैश और जावास्क्रिप्ट संवाद करने के लिए पुराने तरीके से करने की कोशिश की:

var req : URLRequest = new URLRequest("javascript:getImage()"); 
var loader : Loader = new Loader(); 
loader.load(req); 

जहां "getImage()" एक जावास्क्रिप्ट समारोह है कि एक छवि के रूप कैनवास की सामग्री देता है। लेकिन यह किसी प्रकार की सुरक्षा उल्लंघन त्रुटि को फेंकता है क्योंकि किसी भी ब्राउज़र स्क्रिप्ट को लक्ष्य URL के रूप में उपयोग करने की अनुमति नहीं है, जब तक कि कोई "लोडर.लोड()" फ़ंक्शन के विपरीत "navigateToURL()" का उपयोग न करे। दुर्भाग्य से पूर्व एक मूल्य वापस नहीं करता है।

मैं भी "com.macromedia.javascript.JavaScriptProxy" वर्ग का उपयोग कर कुछ पुराने कोड को देखा है, लेकिन मैं इसे परीक्षण नहीं किया है और यह फ्लैश में उपलब्ध हो प्रतीत नहीं होता है 11.

किसी भी विचार होगा बहुत सराहना कीजिए। धन्यवाद!

+2

कुछ समय पहले मैंने फ्लैश पर वेबकैम वीडियो कैप्चर करने के लिए [फ्लैशकैम] (http://code.google.com/p/flashcam/) लिखा था और जावास्क्रिप्ट का उपयोग कर एचटीएमएल 5 कैनवास पर इसे खींच लिया था। कुछ परीक्षणों के बाद, मैं अंत में आधार 36 का उपयोग करके एन्कोड किए गए लगातार पिक्सेल मतभेदों के अल्पविराम से अलग मूल्यों के स्ट्रिंग के साथ एक जटिल जटिल स्कीमा का उपयोग करता हूं। कोड की जांच करें, प्रक्रिया को बहुत कठिन नहीं होना चाहिए। –

+1

@ जुआनमेलडो, संकेत के लिए धन्यवाद। निश्चित रूप से, जिस तरीके से आप छवि डेटा को एन्कोड करते हैं, वह एक बड़ा अंतर बनाता है, और स्ट्रिंग जाने का तरीका है क्योंकि अंत में सब कुछ एक्सएमएल प्रारूप में पारित किया जाता है। मैं एक पीएनजी संपीड़न + बेस 64 एन्कोडिंग का उपयोग कर समाप्त हुआ जिसे कैनवास फ़ंक्शन 'canvas.toDataURL (' image/png ') के माध्यम से बहुत कुशलता से किया जा सकता है। छवि डेटा को पिक्सेल या बाइट सरणी के रूप में पारित करने की तुलना में आयाम के कुछ आदेशों द्वारा यह बेहतर प्रदर्शन, जिसमें क्लाइंट साइड पर __flash__toXML() कॉल प्रति पिक्सेल शामिल है। शायद मुझे इसे एक उत्तर के रूप में पोस्ट करना चाहिए, यकीन नहीं है, मैं SO के लिए नया हूं। – elyuro

+0

ग्रेट। और हाँ, फिर अपने प्रश्न का उत्तर दें। –

उत्तर

1

मैं 2 विकल्पों के बारे में सोच सकता हूं: एक आसान, एक कठिन।

1) राउंड इसे सर्वर पर ले जाएं। यह धीमा हो सकता है लेकिन यह फ्लैश लॉक करने या स्क्रिप्ट टाइमआउट के कारण होने की संभावना नहीं होगी।

2) देखें कि क्या आप एक HTML5 वेबसाकेट लिख सकते हैं जो फ़्लैश के स्थानीय कनेक्शन से कनेक्ट हो सकता है। यह कोई छोटी सी काम नहीं है। This guy ने सी में उस अखरोट को तोड़ दिया है। उसने एक ऐप बनाया जो स्थानीय कनेक्शन को "बोल" सकता है।

+0

आपके उत्तर के लिए धन्यवाद। 1) ब्राउज़र पक्ष पर सबकुछ संभालने से निश्चित रूप से अधिक अक्षम है, इसलिए यह इस मामले में सवाल से बाहर है। 2) मैंने एक त्वरित रूप से देखा और यह जेएस में किसी भी टीसीपी संचार करने का कोई वास्तविक तरीका प्रतीत नहीं होता है। जो कुछ भी मैंने पाया वह या तो http के शीर्ष पर टीसीपी या आपके द्वारा दिए गए लिंक की तरह कुछ हैक की तरह है। पूर्व बाहरी इंटरफेस फ्लैश ऑब्जेक्ट के समान ओवरहेड से जुड़ा हुआ है, बाद में, मैं यह भी कल्पना नहीं कर सकता कि वह सभी प्लेटफॉर्म पर काम करने के लिए सिरदर्द देता है। फिर भी, सुझावों के लिए धन्यवाद। – elyuro

+0

वेबसाइटों को जेएस से किया जा सकता है, यह स्पष्टीकरण http: //www.html5rocks देखें।कॉम/एन/ट्यूटोरियल/websockets/मूल बातें /, लेकिन मुझे नहीं लगता कि websockets आपके उपयोग के मामले से अच्छी तरह से मेल खाते हैं, जो एक बार कनेक्शन की तरह लगता है, बल्कि लंबे समय तक चलने वाले खुले कनेक्शन सॉकेट का इरादा है। – Eddie

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