বাংলায় অ্যান্ড্রয়েড সহায়িকা - Bangla Android Guide

হার্ডওয়ার এক্সেলেরেশন ব্যবহার করা

অ্যান্ড্রয়েড ৩.০ এর মতো, অ্যান্ড্রয়েড ২ডি গ্রাফিক্স সিস্টেম GPU (Graphics Processing Unit) এর দ্বারা গতিপ্রাপ্ত হতে পারে, এই হার্ডওয়ার সবচেয়ে নতুন অ্যান্ড্রয়েড ডিভাইসে পাওয়া যায়। GPU হার্ডওয়ার এক্সেলেরেশন অনেক অ্যাপলিকেশনকে পারফর্মেন্স বৃদ্ধিতে একটি ফলাফল এনে দেয়, কিন্তু এটা সকল অ্যাপলিকেশনের জন্য সঠিক পছন্দ নয়। অ্যান্ড্রয়েড ফ্রেমওয়ার্ক আপনাকে সুন্দরভাবে নিয়ন্ত্রন করার সামর্থ দেয়, আপনার অ্যাপলিকেশনের যে অংশ হার্ডওয়ার এক্সেলেরেটেড হতে পারে আবার নাও হতে পারে।

অ্যান্ড্রয়েড ডেভেলপার গাইডে Hardware Acceleration (http://developer.android.com/guide/topics/graphics/hardware-accel.html) দেখুন, এত আপনি জানতে পারবেন কীভাবে অ্যাপলিকেশনে, একটিভিটিতে বা উইন্ডো লেভেলে এটাকে সক্রিয় করতে পারেন। উল্লেখ্য যে ডেভেলপার গাইড অনসারে আপনাকে অবশ্যই আপনার অ্যাপলিকেশনের টার্গেট API কে ১১ বা তদুর্ধ্ব তে সেট করুন, আপনার AndroidManifest.xml ফাইলে < uses-sdk android:targetSdkVersion="11"/> নির্দিষ্ট করার মাধ্যমে।

যখনই আপনি হার্ডওয়ার এক্সেলেরেশন সক্রিয় করবেন, আপনি একটি পারফর্মের বৃদ্ধি দেখতেও পারেন আবার নাও পারেন। মোবাইল GPUs কিছু কাজের জন্য খুব ভালো, যেমন স্কেলিং, রোটেটিং, এবং বিটম্যাপ করা ইমেজ অনুবাদ করা। তারা আবার অন্য কিছু কাজের জন্য ভলো নয়, যেমন লাইন বা কার্ভ ড্র করা। সবচেয়ে ভালো GPU এক্সেলেরেশন পেতে আপনাকে অপারেশনের সংখ্যা বাড়াতে হবে যেটাতে GPU ভলো, এবং অপারেশনের সংখ্যা কমিয়ে দিতে হবে যেটাতে GPU ভালো নয়।

পাইচার্ট নমুনায়, উদাহরণস্বরূপ, পাই ড্র করা অপেক্ষাকৃতভাবে ব্যয়বহুল। প্রতিবার রোটেট করার সময় পাই রিড্র করা ইউআইকে ধীরগতীর অনুভব করার কারন গটায়। সমাধান হচ্ছে একটি চাইল্ড ভিউয়ে পাইটি স্থাপন করা এবং ঐ ভিউয়ের লেয়ার টাউপকে LAYER_TYPE_HARDWARE,এ সেট করুন, যাতে GPU এটাকে একটি স্ট্যাটিক ইমেজ হিসাবে ক্যাশে করতে পারে। নমুনাটি চাইল্ড ভিউকে পাই চার্টের একটি ইনার ক্লাস হিসাবে নির্ধারণ করে, যা কোড পরিবর্তনের সংখ্যাকে কমিয়ে আনে যা এই সমাধানে বাস্তবায়ন করার প্রয়োজন হবে।

   private class PieView extends View {

       public PieView(Context context) {
           super(context);
           if (!isInEditMode()) {
               setLayerType(View.LAYER_TYPE_HARDWARE, null);
           }
       }

       @Override
       protected void onDraw(Canvas canvas) {
           super.onDraw(canvas);

           for (Item it : mData) {
               mPiePaint.setShader(it.mShader);
               canvas.drawArc(mBounds,
                       360 - it.mEndAngle,
                       it.mEndAngle - it.mStartAngle,
                       true, mPiePaint);
           }
       }

       @Override
       protected void onSizeChanged(int w, int h, int oldw, int oldh) {
           mBounds = new RectF(0, 0, w, h);
       }

       RectF mBounds;
   }

এই কোড পরিবর্তনের পর, যখন ভিউ প্রথমে দেখানো হয় তখন PieChart.PieView.onDraw() কে কল করা হয়। অ্যাপলিকেশনের বাকী সময়কালে, পাই চার্ট একটি ইমেজ হিসাবে ক্যাশে হয়, এবং GPU কর্তৃক ভিন্ন রোটেশনে রিড্র করে। GPU হার্ডওয়ার এই সব বিষয়ে খুব ভালো কাজ করে, এবং পারফর্মেন্সের পার্থক্য তাৎক্ষনিকভাবে লক্ষ্য করা যায়।

এখানে একটি ট্রেডধফ আছে, যদিও। হার্ডওয়ার লেয়ার হিসাবে ক্যাশিং ইমেজ ভিডিও মেমরী খরচ করে, যা একটি সীমিত রিসোর্স। এই কারনে PieChart.PieView চুড়ান্ত সংস্করন শুধুমাত্র LAYER_TYPE_NONE এ এর লেয়ার ধরণ সেট করে, যেটা GPU কে ইমেজ ক্যাশে করা বন্ধ করতে দেয়।

চুড়ান্তভাবে আপনার কোড প্রফাইল করতে ভুলবেন না। কৌশল যা একটি ভিউয়ে পারফর্মেন্সে উন্নয়ন ঘটায় সেটা অন্য একটি পারফরমেন্সের উপর নেতিবাচক প্রভাব ফেলতে পারে।