2011-09-29 9 views
8

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

डेस्कटॉप जावा के लिए जैसा कि मैंने का उपयोग

int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData(); 

जो मुझे पिक्सेल बफर के संदर्भ में हो और (वस्तु कृतियों को कम से कम)

वर्तमान में यह क्या के लिए मेरे एमुलेटर है मक्खी पर इसे अद्यतन करने की अनुमति देते हैं एंड्रॉयड हर फ्रेम

@Override 
public void onDraw(Canvas canvas) 
{ 
    buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565); 
    canvas.drawBitmap(buffer, 0, 0, null); 

} 

pixelsA है एक सरणी पूर्णांक [], pixelsA सभी रंग जानकारियां, इसलिए हर फ्रेम यह एक बिटमैप वस्तु बनाने के लिए होगा शामिल करता है

buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565); 

जो मुझे विश्वास है कि यह काफी महंगा और धीमा है।

कैनवास के साथ कुशलतापूर्वक पिक्सल खींचने का कोई तरीका है?

+0

यह सच है, createBitmap धीमी है, यह स्मृति प्रतिलिपि है, और यहां तक ​​कि आपके मामले में पिक्सेल प्रारूप का रूपांतरण भी है! –

उत्तर

0

प्रत्येक बार बिटमैप को पुन: निर्मित न करें। इस तरह कुछ कोशिश करें:

Bitmap buffer = null; 
@Override 
public void onDraw(Canvas canvas) 
{ 
    if(buffer == null) buffer = Bitmap.createBitmap(256, 192, Bitmap.Config.RGB_565); 
    buffer.copyPixelsFromBuffer(pixelsA); 
    canvas.drawBitmap(buffer, 0, 0, null); 
} 

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

+0

यह काम नहीं करेगा। बिटमैप बिल्डबिटमैप में अपने पिक्सेल बफर को शुरू करता है, कॉल नहीं करता है कि यह बिटमैप के पिक्सेल अपडेट नहीं करेगा। –

10

एक काफी कम स्तर विधि, लेकिन मेरे लिए ठीक काम कर रहा (मूल कोड के साथ):

Bitmap वस्तु, अपने दृश्य स्क्रीन रूप में बड़ा बनाएँ। भी View ऑब्जेक्ट बनाएं और onDraw विधि लागू करें।

फिर देशी कोड में आप libjnigraphics.so देशी लाइब्रेरी, लुकअप फ़ंक्शंस AndroidBitmap_lockPixels और AndroidBitmap_unlockPixels लोड करेंगे। ये फ़ंक्शन बिटमैप.h में एंड्रॉइड स्रोत में परिभाषित किए गए हैं।

फिर आप बिटमैप पर लॉक/अनलॉक कॉल करेंगे, कच्चे पिक्सेल को पता प्राप्त करेंगे। आपको वास्तव में क्या है (16-बिट 565 या 32-बिट 8888) के अनुसार पिक्सल के आरजीबी प्रारूप की व्याख्या करनी चाहिए।

बिटमैप की सामग्री बदलने के बाद, आप इसे स्क्रीन पर प्रस्तुत करना चाहते हैं। अपने View पर View.invalidate() पर कॉल करें। onDraw में, अपने बिटकमैप को Canvas में ब्लाइट करें।

यह विधि बहुत कम स्तर है और एंड्रॉइड के वास्तविक कार्यान्वयन पर निर्भर है, हालांकि यह बहुत तेज है, आपको 60fps कोई समस्या नहीं मिल सकती है।

bitmap.h प्लेटफार्म संस्करण 8 के बाद एंड्रॉइड एनडीके का हिस्सा है, इसलिए यह एंड्रॉइड 2.2 से ऐसा करने का आधिकारिक तरीका है।

4

आप drawBitmap method का उपयोग कर सकते हैं जो प्रत्येक बार बिटमैप बनाने से बचाता है, या अंतिम उपाय के रूप में भी, drawPoint के साथ पिक्सल को एक-एक करके खींचें।

+0

मैंने drawBitmap विधि की कोशिश की जो int [] को इसके पैरामीटर के रूप में लेता है, यह बिटमैप ऑब्जेक्ट सृजन पर अच्छा प्रदर्शन बढ़ावा देता है। देशी कोड का उपयोग किये बिना स्वीकार्य प्रदर्शन प्राप्त करने के लिए यह एकमात्र तरीका (मुझे लगता है) लगता है। – afro100

+1

यह जानकर अच्छा लगा कि यह काम करता है। जैसा कि आप कहते हैं कि देशी जाने के जितना तेज़ नहीं है, लेकिन यह बहुत जटिल है। –

0

अगर pixelsA पहले से ही (जो कि मैं क्या रंग युक्त के बारे में अपने बयान से यह निष्कर्ष निकाल हैं) तो आप सिर्फ उन्हें प्रदान कर सकते हैं पिक्सल की एक सरणी के साथ सीधे परिवर्तित किए बिना है:

canvas.drawBitmap(pixelsA, 0, 256, 0, 0, 256, 192, false, null); 
संबंधित मुद्दे