ধারণা ও Jetpack Compose-এর প্রয়োগ
Android 3.0 (API লেভেল ১১) থেকে শুরু করে, Android 2D রেন্ডারিং পাইপলাইন
হার্ডওয়্যার অ্যাক্সিলারেশন সাপোর্ট করে, যার অর্থ হল View-এর ক্যানভাসে
সম্পন্ন করা সমস্ত ড্রয়িং অপারেশন GPU ব্যবহার করে।
হার্ডওয়্যার অ্যাক্সিলারেশন চালু করার জন্য প্রয়োজনীয় রিসোর্স বেড়ে যাওয়ার কারণে,
আপনার অ্যাপ আরও বেশি RAM ব্যবহার করবে।
আপনার টার্গেট API লেভেল >=১৪ হলে, হার্ডওয়্যার অ্যাক্সিলারেশন ডিফল্ট হিসেবে চালু করা থাকে, তবে এটি স্পষ্টভাবেও চালু করা যেতে পারে। আপনার অ্যাপ্লিকেশন যদি শুধুমাত্র
স্ট্যান্ডার্ড ভিউ এবং Drawable ব্যবহার করে, তাহলে এটি গ্লোবালি চালু করলে
কোনও বিরূপ ড্রয়িং এফেক্ট হওয়ার কথা নয়। তবে, সব 2D ড্রয়িং অপারেশনের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন
কাজ করে না বলে, এটি চালু করলে আপনার কিছু কাস্টম ভিউ বা ড্রয়িং কল
প্রভাবিত হতে পারে। সমস্যাগুলি সাধারণত অদৃশ্য এলিমেন্ট, ব্যতিক্রম বা ভুলভাবে রেন্ডার করা পিক্সেল হিসাবে
প্রকাশ পায়। এই সমস্যার সমাধান করতে,
Android আপনাকে একাধিক লেভেলে হার্ডওয়্যার অ্যাক্সিলারেশন চালু বা বন্ধ করার
বিকল্প দেয়। হার্ডওয়্যার অ্যাক্সিলারেশন কন্ট্রোল করুন বিকল্প দেখুন।
আপনার অ্যাপ্লিকেশন কাস্টম ড্রয়িং পারফর্ম করলে, কোনও সমস্যা খুঁজে পেতে হার্ডওয়্যার অ্যাক্সিলারেশন চালু করে আসল হার্ডওয়্যার ডিভাইসে আপনার অ্যাপ্লিকেশন টেস্ট করুন। ড্রয়িং অপারেশনের জন্য সহায়তা বিভাগে হার্ডওয়্যার অ্যাক্সিলারেশন সংক্রান্ত পরিচিত সমস্যা এবং সেগুলি কীভাবে সমাধান করা যায় তা বর্ণনা করা হয়েছে।
এছাড়াও, ফ্রেমওয়ার্ক API-এর সাথে OpenGL এবং Renderscript দেখুন।
হার্ডওয়্যার অ্যাক্সিলারেশন কন্ট্রোল করুন
আপনি নিম্নলিখিত লেভেলে হার্ডওয়্যার অ্যাক্সিলারেশন নিয়ন্ত্রণ করতে পারবেন:
- অ্যাপ্লিকেশন
- অ্যাক্টিভিটি
- উইন্ডো
- দেখুন
অ্যাপ্লিকেশন লেভেল
আপনার Android ম্যানিফেস্ট ফাইলে, সম্পূর্ণ অ্যাপ্লিকেশনের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন চালু করতে
<application> ট্যাগে নিম্নলিখিত অ্যাট্রিবিউট যোগ করুন:
<application android:hardwareAccelerated="true" ...>
অ্যাক্টিভিটি লেভেল
হার্ডওয়্যার অ্যাক্সিলারেশন গ্লোবালি চালু করার পরে আপনার অ্যাপ্লিকেশন সঠিকভাবে কাজ না করলে, আপনি স্বতন্ত্র অ্যাক্টিভিটির জন্যও এটি নিয়ন্ত্রণ করতে পারেন। অ্যাক্টিভিটি লেভেলে হার্ডওয়্যার অ্যাক্সিলারেশন চালু বা
বন্ধ করতে, আপনি <activity> এলিমেন্টের জন্য
android:hardwareAccelerated অ্যাট্রিবিউট ব্যবহার করতে পারেন। নিম্নলিখিত
উদাহরণটি সম্পূর্ণ অ্যাপ্লিকেশনের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন চালু করে কিন্তু
একটি অ্যাক্টিভিটির জন্য এটি বন্ধ করে:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
উইন্ডো লেভেল
আপনার যদি আরও সূক্ষ্ম কন্ট্রোলের প্রয়োজন হয়, তাহলে নিম্নলিখিত কোড ব্যবহার করে নির্দিষ্ট উইন্ডোর জন্য হার্ডওয়্যার অ্যাক্সিলারেশন চালু করতে পারেন:
Kotlin
window.setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED )
জাভা
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
লেভেল দেখুন
আপনি রানটাইমে নিম্নলিখিত কোড ব্যবহার করে কোনও স্বতন্ত্র ভিউয়ের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন বন্ধ করতে পারেন:
Kotlin
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
জাভা
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
কোনও ভিউ হার্ডওয়্যার অ্যাক্সিলারেটেড কিনা তা নির্ধারণ করুন
কোনও অ্যাপ্লিকেশন বর্তমানে হার্ডওয়্যার অ্যাক্সিলারেটেড কিনা তা জানা কখনও কখনও উপযোগী, বিশেষ করে কাস্টম ভিউয়ের মতো জিনিসের জন্য। আপনার অ্যাপ্লিকেশন যদি অনেক কাস্টম ড্রয়িং করে এবং নতুন রেন্ডারিং পাইপলাইন দ্বারা সব অপারেশন সঠিকভাবে সমর্থিত না হয়, তাহলে এটি বিশেষভাবে কার্যকর।
অ্যাপ্লিকেশনটি হার্ডওয়্যার অ্যাক্সিলারেটেড কিনা তা চেক করার দুটি ভিন্ন উপায় রয়েছে:
Viewহার্ডওয়্যার অ্যাক্সিলারেটেড উইন্ডোর সাথে অ্যাটাচ করা থাকলে,View.isHardwareAcceleratedtrueরিটার্ন করে।Canvasহার্ডওয়্যার অ্যাক্সিলারেটেড হলে,Canvas.isHardwareAcceleratedtrueরিটার্ন করে।
আপনার ড্রয়িং কোডে এই চেকটি করতে হলে, সম্ভব হলে
View.isHardwareAccelerated-এর পরিবর্তে
Canvas.isHardwareAccelerated ব্যবহার করুন। হার্ডওয়্যার অ্যাক্সিলারেটেড উইন্ডোতে কোনও ভিউ অ্যাটাচ করা থাকলে, এটি এখনও নন-হার্ডওয়্যার অ্যাক্সিলারেটেড ক্যানভাস ব্যবহার করে
আঁকা যেতে পারে। এটি ঘটে, উদাহরণস্বরূপ, ক্যাশিংয়ের উদ্দেশ্যে বিটম্যাপে একটি ভিউ আঁকার সময়।
Android ড্রয়িং মডেল
হার্ডওয়্যার অ্যাক্সিলারেশন চালু করা হলে, Android ফ্রেমওয়ার্ক একটি নতুন ড্রয়িং মডেল ব্যবহার করে যা স্ক্রিনে আপনার অ্যাপ্লিকেশন রেন্ডার করার জন্য ডিসপ্লে তালিকা ব্যবহার করে। ডিসপ্লে তালিকা এবং সেগুলি আপনার অ্যাপ্লিকেশনে কীভাবে প্রভাব ফেলতে পারে তা সম্পূর্ণভাবে বুঝতে, হার্ডওয়্যার অ্যাক্সিলারেশন ছাড়াই Android কীভাবে ভিউ আঁকে তা বোঝা দরকার। নিম্নলিখিত বিভাগে সফ্টওয়্যার-ভিত্তিক এবং হার্ডওয়্যার-অ্যাক্সিলারেটেড ড্রয়িং মডেল বর্ণনা করা হয়েছে।
সফ্টওয়্যার-ভিত্তিক ড্রয়িং মডেল
সফ্টওয়্যার ড্রয়িং মডেলে, নিম্নলিখিত দুটি ধাপের মাধ্যমে ভিউ আঁকা হয়:
- হায়ারার্কি বাতিল করুন
- হায়ারার্কি আঁকো
কোনও অ্যাপ্লিকেশনকে তার UI-এর কোনও অংশ আপডেট করতে হলে, এটি পরিবর্তিত কন্টেন্ট সহ যেকোনও ভিউতে
invalidate() (বা এর কোনও একটি ভেরিয়েন্ট)
ইনভোক করে। স্ক্রিনের যে অংশটি আবার আঁকতে হবে (ডার্টি রিজিয়ন) সেটি গণনা করার জন্য ভিউ হায়ারার্কির
একেবারে উপরের স্তর পর্যন্ত ইনভ্যালিডেশন মেসেজ পাঠানো হয়। Android সিস্টেম তখন হায়ারার্কিতে এমন যেকোনও ভিউ আঁকে যা
ডার্টি রিজিয়নের সাথে ইন্টারসেক্ট করে। তবে, এই ড্রয়িং মডেলের
দুটি অসুবিধা আছে:
প্রথমত, এই মডেলের ক্ষেত্রে প্রতিটি ড্র পাসে অনেক কোড এক্সিকিউট করতে হয়। যেমন, আপনার অ্যাপ্লিকেশন কোনও বোতামে
invalidateকল করলে এবং সেই বোতামটি অন্য ভিউয়ের উপরে থাকলে, Android সিস্টেম ভিউটি পরিবর্তন না হলেও আবার আঁকে।দ্বিতীয় সমস্যা হল, ড্রয়িং মডেল আপনার অ্যাপ্লিকেশনে বাগ লুকিয়ে রাখতে পারে। যেহেতু Android সিস্টেম ভিউগুলিকে পুনরায় আঁকে যখন তারা ডার্টি অঞ্চলকে ছেদ করে, এমন একটি ভিউ যার কন্টেন্ট আপনি পরিবর্তন করেছেন সেটি পুনরায় আঁকা হতে পারে যদিও এতে
invalidateকল করা হয়নি। এটি হলে, সঠিক আচরণ পেতে আপনি অন্য ভিউ বাতিল হওয়ার উপর নির্ভর করছেন। আপনি যতবার অ্যাপ্লিকেশন পরিবর্তন করবেন, ততবারই এই আচরণ পরিবর্তিত হতে পারে। এই কারণে, ডেটা বা স্ট্যাটাস পরিবর্তন করার সময় আপনাকে সবসময় কাস্টম ভিউতেinvalidateকল করতে হবে যা ভিউয়ের ড্রয়িং কোডকে প্রভাবিত করে।
হার্ডওয়্যার অ্যাক্সিলারেটেড ড্রয়িং মডেল
Android সিস্টেম এখনও স্ক্রিন আপডেট করার অনুরোধ করতে এবং ভিউ রেন্ডার করতে invalidate এবং draw ব্যবহার করে, তবে প্রকৃত ড্রয়িং আলাদাভাবে ম্যানেজ করে।
ড্রয়িং কমান্ড অবিলম্বে এক্সিকিউট করার পরিবর্তে, Android সিস্টেম
সেগুলিকে ডিসপ্লে তালিকার মধ্যে রেকর্ড করে, যার মধ্যে ভিউ
হায়ারার্কির ড্রয়িং কোডের আউটপুট থাকে। আরেকটি অপ্টিমাইজেশন হল, Android সিস্টেমকে শুধুমাত্র
invalidate কলের মাধ্যমে ডার্টি হিসেবে চিহ্নিত ভিউয়ের জন্য ডিসপ্লে তালিকা রেকর্ড ও আপডেট
করতে হয়। যেসব ভিউ বাতিল করা হয়নি সেগুলি আগে রেকর্ড করা ডিসপ্লে তালিকা
আবার ইস্যু করার মাধ্যমে রিড্র করা যেতে পারে। নতুন ড্রয়িং মডেলে
তিনটি ধাপ আছে:
হায়ারার্কি বাতিল করুন
ডিসপ্লে তালিকা রেকর্ড ও আপডেট করুন
ডিসপ্লে তালিকা আঁকুন
এই মডেলের ক্ষেত্রে, আপনি ডার্টি রিজিয়নের সাথে ইন্টারসেক্ট করা ভিউয়ের উপর নির্ভর করতে পারবেন না, যাতে
এর draw পদ্ধতি কার্যকর করা যায়। Android সিস্টেম যাতে কোনও ভিউয়ের ডিসপ্লে লিস্ট রেকর্ড করে তা নিশ্চিত করতে, আপনাকে অবশ্যই invalidate কল করতে হবে। এটি করতে ভুলে গেলে,
ভিউ পরিবর্তন করার পরেও সেটি একই রকম দেখায়।
ডিসপ্লে লিস্ট ব্যবহার করলে অ্যানিমেশনের পারফর্ম্যান্সও ভালো হয় কারণ আলফা বা রোটেশনের মতো নির্দিষ্ট প্রপার্টি সেট করার জন্য টার্গেট করা ভিউকে ইনভ্যালিডেট করতে হয় না (এটি অটোমেটিক হয়ে যায়)। এই অপ্টিমাইজেশন ডিসপ্লে তালিকা সহ ভিউয়ের ক্ষেত্রেও প্রযোজ্য (আপনার অ্যাপ্লিকেশন হার্ডওয়্যার অ্যাক্সিলারেটেড হলে যেকোনও ভিউ)। যেমন, ধরুন একটি LinearLayout আছে যার মধ্যে
Button-এর উপরে একটি ListView আছে। LinearLayout-এর
ডিসপ্লে তালিকা এইরকম দেখতে:
DrawDisplayList(ListView)DrawDisplayList(Button)
ধরে নিন, আপনি এখন ListView-এর অস্বচ্ছতা পরিবর্তন করতে চান। ListView-এ
setAlpha(0.5f) চালু করার পরে, ডিসপ্লে তালিকায় এখন
এটি রয়েছে:
SaveLayerAlpha(0.5)DrawDisplayList(ListView)RestoreDrawDisplayList(Button)
ListView-এর জটিল ড্রয়িং কোড এক্সিকিউট করা হয়নি। পরিবর্তে, সিস্টেমটি শুধুমাত্র অনেক সহজ LinearLayout-এর ডিসপ্লে তালিকা আপডেট করেছে।
হার্ডওয়্যার অ্যাক্সিলারেশন চালু না থাকা অ্যাপ্লিকেশনে, তালিকা এবং তার পেরেন্ট,
উভয়েরই ড্রয়িং কোড আবার এক্সিকিউট করা হয়।
আঁকার অপারেশন সংক্রান্ত সহায়তা
হার্ডওয়্যার অ্যাক্সিলারেট করা হলে, 2D রেন্ডারিং পাইপলাইন সবচেয়ে বেশি ব্যবহৃত Canvas ড্রয়িং অপারেশন এবং কম ব্যবহৃত অনেক অপারেশনকে সাপোর্ট করে। Android-এর সাথে
শিপ করা অ্যাপ্লিকেশন, ডিফল্ট উইজেট ও লেআউট এবং প্রতিফলন ও টাইল করা টেক্সচারের মতো সাধারণ উন্নত ভিজ্যুয়াল এফেক্ট রেন্ডার করার জন্য ব্যবহৃত
সব ড্রয়িং অপারেশন কাজ করে।
নিম্নলিখিত সারণীতে API লেভেল জুড়ে বিভিন্ন অপারেশনের সাপোর্ট লেভেল বর্ণনা করা হয়েছে:
| প্রথম কাজ করা API লেভেল | ||||
| Canvas | ||||
| drawBitmapMesh() (রঙের অ্যারে) | 18 | |||
| drawPicture() | 23 | |||
| drawPosText() | 16 | |||
| drawTextOnPath() | 16 | |||
| drawVertices() | ২৯ | |||
| setDrawFilter() | 16 | |||
| clipPath() | 18 | |||
| clipRegion() | 18 | |||
| clipRect(Region.Op.XOR) | 18 | |||
| clipRect(Region.Op.Difference) | 18 | |||
| clipRect(Region.Op.ReverseDifference) | 18 | |||
| রোটেশন/পার্সপেক্টিভ সহ clipRect() | 18 | |||
| রঙ | ||||
| setAntiAlias() (টেক্সটের জন্য) | 18 | |||
| setAntiAlias() (লাইনের জন্য) | 16 | |||
| setFilterBitmap() | 17 | |||
| setLinearText() | ✗ | |||
| setMaskFilter() | ✗ | |||
| setPathEffect() (লাইনের জন্য) | ২৮ | |||
| setShadowLayer() (টেক্সট ছাড়া অন্য কিছু) | ২৮ | |||
| setStrokeCap() (লাইনের জন্য) | 18 | |||
| setStrokeCap() (পয়েন্টের জন্য) | 19 | |||
| setSubpixelText() | ২৮ | |||
| Xfermode | ||||
| PorterDuff.Mode.DARKEN (ফ্রেমবাফার) | ২৮ | |||
| PorterDuff.Mode.LIGHTEN (framebuffer) | ২৮ | |||
| PorterDuff.Mode.OVERLAY (framebuffer) | ২৮ | |||
| শেডার | ||||
| ComposeShader-এর মধ্যে ComposeShader | ২৮ | |||
| ComposeShader-এর মধ্যে একই ধরনের শেডার | ২৮ | |||
| ComposeShader-এ লোকাল ম্যাট্রিক্স | 18 | |||
ক্যানভাস স্কেলিং
হার্ডওয়্যার অ্যাক্সিলারেটেড 2D রেন্ডারিং পাইপলাইন প্রথমে আনস্কেলড ড্রয়িংকে সাপোর্ট করার জন্য তৈরি করা হয়েছিল, কিছু ড্রয়িং অপারেশন উচ্চ স্কেল ভ্যালুতে কোয়ালিটি উল্লেখযোগ্যভাবে হ্রাস করে। এইসব অপারেশন GPU-এর মাধ্যমে ট্রান্সফর্ম করা ১.০ স্কেলে আঁকা টেক্সচার হিসেবে প্রয়োগ করা হয়। API লেভেল ২৮ থেকে শুরু করে, সব ড্রয়িং অপারেশন কোনও সমস্যা ছাড়াই স্কেল করতে পারে।
নিচের সারণীতে দেখানো হয়েছে যে বড় স্কেল সঠিকভাবে ম্যানেজ করার জন্য কখন প্রয়োগ করার পদ্ধতি পরিবর্তন করা হয়েছে:
| ড্রয়িং অপারেশন স্কেল করা হবে | প্রথম কাজ করা API লেভেল |
| drawText() | 18 |
| drawPosText() | ২৮ |
| drawTextOnPath() | ২৮ |
| সাধারণ শেপ | 17 |
| জটিল আকার | ২৮ |
| drawPath() | ২৮ |
| শ্যাডো লেয়ার | ২৮ |
এইসব অনুপস্থিত ফিচার বা সীমাবদ্ধতার কারণে আপনার অ্যাপ্লিকেশন প্রভাবিত হলে,
setLayerType(View.LAYER_TYPE_SOFTWARE, null) কল করে আপনার অ্যাপ্লিকেশনের শুধুমাত্র প্রভাবিত অংশের জন্য
হার্ডওয়্যার অ্যাক্সিলারেশন বন্ধ করতে পারবেন।
এইভাবে, আপনি এখনও অন্য সব জায়গায় হার্ডওয়্যার অ্যাক্সিলারেশনের সুবিধা নিতে পারবেন।
আপনার অ্যাপ্লিকেশনের বিভিন্ন লেভেলে কীভাবে হার্ডওয়্যার অ্যাক্সিলারেশন চালু ও বন্ধ করবেন সেই সম্পর্কে আরও তথ্যের জন্য হার্ডওয়্যার অ্যাক্সিলারেশন নিয়ন্ত্রণ করুন দেখুন।
লেয়ার দেখুন
Android-এর সব ভার্সনে, ভিউয়ের ড্রয়িং ক্যাশে বা
Canvas.saveLayer ব্যবহার করে, ভিউ অফ-স্ক্রিন বাফারে রেন্ডার করার
সুবিধা আছে। অফ-স্ক্রিন বাফার বা লেয়ারের একাধিক ব্যবহার আছে। জটিল ভিউ অ্যানিমেট করার সময় বা কম্পোজিশন এফেক্ট প্রয়োগ করার সময় আরও ভালো পারফর্ম্যান্স পেতে আপনি
এগুলি ব্যবহার করতে পারেন। যেমন, আপনি
Canvas.saveLayer ব্যবহার করে ফেড এফেক্ট প্রয়োগ করতে পারেন যাতে সাময়িকভাবে কোনও ভিউকে লেয়ারে রেন্ডার করা যায় এবং তারপর
স্ক্রিনে সেটিকে অস্বচ্ছতা ফ্যাক্টর সহ কম্পোজিট করা যায়।
Android 3.0 (API লেভেল ১১) থেকে শুরু করে, View.setLayerType পদ্ধতির মাধ্যমে কীভাবে এবং কখন লেয়ার ব্যবহার করতে হবে তার উপর আপনার আরও নিয়ন্ত্রণ আছে। এই API-তে দুটি প্যারামিটার
থাকে: আপনি যে ধরনের লেয়ার ব্যবহার করতে চান এবং একটি ঐচ্ছিক Paint
অবজেক্ট যা লেয়ারটি কীভাবে কম্পোজিট করা উচিত তা বর্ণনা করে। আপনি
Paint প্যারামিটার ব্যবহার করে কোনও লেয়ারে কালার ফিল্টার, বিশেষ ব্লেন্ডিং মোড বা
অস্বচ্ছতা প্রয়োগ করতে পারবেন। একটি ভিউতে তিন ধরনের লেয়ারের মধ্যে একটি ব্যবহার করা যেতে পারে:
LAYER_TYPE_NONE: ভিউটি স্বাভাবিকভাবে রেন্ডার করা হয় এবং অফ-স্ক্রিন বাফার দ্বারা ব্যাক আপ করা হয় না। এটি হল ডিফল্ট অ্যাকশন।LAYER_TYPE_HARDWARE: অ্যাপ্লিকেশনটি হার্ডওয়্যার অ্যাক্সিলারেটেড হলে, ভিউটি হার্ডওয়্যারে একটি হার্ডওয়্যার টেক্সচারে রেন্ডার করা হয়। অ্যাপ্লিকেশনটি হার্ডওয়্যার অ্যাক্সিলারেটেড না হলে, এই লেয়ারের ধরনটিLAYER_TYPE_SOFTWARE-এর মতোই কাজ করে।LAYER_TYPE_SOFTWARE: সফ্টওয়্যারে ভিউটি বিটম্যাপে রেন্ডার করা হয়।
আপনি কোন ধরনের লেয়ার ব্যবহার করবেন তা আপনার লক্ষ্যের উপর নির্ভর করে:
পারফর্ম্যান্স: হার্ডওয়্যার টেক্সচারে ভিউ রেন্ডার করতে হার্ডওয়্যার লেয়ারের ধরন ব্যবহার করুন। কোনও ভিউ লেয়ারে রেন্ডার করা হয়ে গেলে, ভিউ
invalidateকল না করা পর্যন্ত তার ড্রয়িং কোড এক্সিকিউট করতে হয় না। কিছু অ্যানিমেশন, যেমন আলফা অ্যানিমেশন, সরাসরি লেয়ারে প্রয়োগ করা যেতে পারে, যা GPU-এর জন্য খুবই কার্যকর।ভিজ্যুয়াল এফেক্ট: কোনও ভিউতে বিশেষ ভিজ্যুয়াল ট্রিটমেন্ট প্রয়োগ করতে হার্ডওয়্যার বা সফ্টওয়্যার লেয়ারের ধরন এবং
Paintব্যবহার করুন। যেমন, আপনিColorMatrixColorFilterব্যবহার করে সাদা-কালোতে একটি দৃশ্য আঁকতে পারেন।মানানসই: সফ্টওয়্যারে কোনও ভিউ রেন্ডার করার জন্য সফ্টওয়্যার লেয়ারের ধরন ব্যবহার করুন। হার্ডওয়্যার অ্যাক্সিলারেটেড (যেমন, আপনার পুরো অ্যাপ্লিকেশন হার্ডওয়্যার অ্যাক্সিলারেটেড হলে) ভিউতে রেন্ডারিং সংক্রান্ত সমস্যা হলে, হার্ডওয়্যার রেন্ডারিং পাইপলাইনের সীমাবদ্ধতা এড়ানোর এটি একটি সহজ উপায়।
লেয়ার ও অ্যানিমেশন দেখুন
আপনার অ্যাপ্লিকেশন হার্ডওয়্যার অ্যাক্সিলারেটেড হলে, হার্ডওয়্যার লেয়ার আরও দ্রুত ও মসৃণ অ্যানিমেশন
ডেলিভার করতে পারে। জটিল ভিউ অ্যানিমেট করার সময় প্রতি সেকেন্ডে ৬০ ফ্রেমের অ্যানিমেশন চালানো
সবসময় সম্ভব হয় না, কারণ এতে অনেক ড্রয়িং অপারেশন
করতে হয়। হার্ডওয়্যার টেক্সচারে ভিউ রেন্ডার করার জন্য হার্ডওয়্যার লেয়ার ব্যবহার করে
এই সমস্যা কমানো যেতে পারে। হার্ডওয়্যার টেক্সচার তারপর ভিউ অ্যানিমেট করতে ব্যবহার করা যেতে পারে, অ্যানিমেট করার সময় ভিউকে ক্রমাগত রিড্র করার প্রয়োজনীয়তা
দূর করে। ভিউয়ের প্রপার্টি পরিবর্তন না করলে, ভিউ আবার আঁকা হয় না, যা invalidate কল করে অথবা আপনি ম্যানুয়ালি invalidate কল করলে। আপনি
যদি আপনার অ্যাপ্লিকেশনে কোনও অ্যানিমেশন চালান এবং আপনার কাঙ্ক্ষিত মসৃণ
ফলাফল না পান, তাহলে আপনার অ্যানিমেটেড ভিউতে হার্ডওয়্যার লেয়ার চালু করার কথা বিবেচনা করুন।
কোনও ভিউ হার্ডওয়্যার লেয়ারের মাধ্যমে ব্যাক-আপ করা হলে, স্ক্রিনে লেয়ারটি যেভাবে কম্পোজিট করা হয়, তার উপর ভিত্তি করে এর কিছু প্রপার্টি ম্যানেজ করা হয়। এইসব প্রপার্টি সেট করা দক্ষ হবে কারণ এগুলির জন্য ভিউ বাতিল এবং আবার আঁকার প্রয়োজন হয় না। নিচে এমন কিছু প্রপার্টির তালিকা দেওয়া হল যা লেয়ার কম্পোজিট করার পদ্ধতিকে প্রভাবিত করে। এইসব প্রপার্টির যেকোনও একটির জন্য সেটার কল করলে, টার্গেট করা ভিউয়ের অপ্টিমাল ইনভ্যালিডেশন হয় এবং সেটি আবার আঁকা হয় না:
alpha: লেয়ারের অস্বচ্ছতা পরিবর্তন করেx,y,translationX,translationY: লেয়ারের পজিশন পরিবর্তন করেscaleX,scaleY: লেয়ারের সাইজ পরিবর্তন করেrotation,rotationX,rotationY: 3D স্পেসে লেয়ারের ওরিয়েন্টেশন পরিবর্তন করেpivotX,pivotY: লেয়ারের ট্রান্সফর্মেশন অরিজিন পরিবর্তন করে
ObjectAnimator-এর সাহায্যে কোনও ভিউ অ্যানিমেট করার সময় এইসব প্রপার্টি ব্যবহার করা হয়। আপনি যদি এইসব প্রপার্টি অ্যাক্সেস করতে চান, তাহলে
উপযুক্ত সেটার বা গেটার কল করুন। যেমন, আলফা প্রপার্টি পরিবর্তন করতে, setAlpha কল করুন। নিম্নলিখিত কোড স্নিপেট Y-অক্ষের চারপাশে 3D-তে ভিউ ঘোরানোর
সবচেয়ে কার্যকর উপায় দেখায়:
Kotlin
view.setLayerType(View.LAYER_TYPE_HARDWARE, null) ObjectAnimator.ofFloat(view, "rotationY", 180f).start()
জাভা
view.setLayerType(View.LAYER_TYPE_HARDWARE, null); ObjectAnimator.ofFloat(view, "rotationY", 180).start();
হার্ডওয়্যার লেয়ার ভিডিও মেমরি ব্যবহার করে, তাই আমরা সাজেস্ট করি যে আপনি শুধুমাত্র অ্যানিমেশন চলাকালীন এটি চালু করুন এবং অ্যানিমেশন শেষ হয়ে গেলে বন্ধ করে দিন। আপনি অ্যানিমেশন লিসেনার ব্যবহার করে এটি করতে পারেন:
Kotlin
view.setLayerType(View.LAYER_TYPE_HARDWARE, null) ObjectAnimator.ofFloat(view, "rotationY", 180f).apply { addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { view.setLayerType(View.LAYER_TYPE_NONE, null) } }) start() }
জাভা
view.setLayerType(View.LAYER_TYPE_HARDWARE, null); ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { view.setLayerType(View.LAYER_TYPE_NONE, null); } }); animator.start();
প্রপার্টি অ্যানিমেশন সম্পর্কে আরও তথ্যের জন্য, প্রপার্টি অ্যানিমেশন দেখুন।
পরামর্শ এবং উপায়
হার্ডওয়্যার অ্যাক্সিলারেটেড 2D গ্রাফিক্সে পরিবর্তন করলে তা তৎক্ষণাৎ পারফর্ম্যান্স বাড়িয়ে দিতে পারে, তবে আপনাকে এখনও GPU কার্যকরভাবে ব্যবহার করার জন্য এইসব সাজেশন অনুসরণ করে আপনার অ্যাপ্লিকেশন ডিজাইন করতে হবে:
- আপনার অ্যাপ্লিকেশনে ভিউয়ের সংখ্যা কমান
- সিস্টেমকে যত বেশি ভিউ আঁকতে হবে, এটি তত ধীর হবে। এটি সফ্টওয়্যার রেন্ডারিং পাইপলাইনের ক্ষেত্রেও প্রযোজ্য। আপনার UI অপ্টিমাইজ করার অন্যতম সহজ উপায় হল ভিউয়ের সংখ্যা কমানো।
- ওভারড্র করা এড়িয়ে চলুন
- একটির উপর আরেকটি, এইভাবে অনেক লেয়ার আঁকবেন না। এমন যেকোনও ভিউ সরিয়ে দিন যা সম্পূর্ণভাবে অন্য কোনও অস্বচ্ছ ভিউয়ের নিচে ঢাকা পড়ে গেছে। আপনাকে যদি একটির উপর আরেকটি ব্লেন্ড করা একাধিক লেয়ার আঁকতে হয়, তাহলে সেগুলিকে একটি লেয়ারে মার্জ করার কথা বিবেচনা করুন। বর্তমান হার্ডওয়্যারের ক্ষেত্রে একটি ভালো নিয়ম হল, প্রতি ফ্রেমে স্ক্রিনে পিক্সেলের সংখ্যার ২.৫ গুণের বেশি আঁকবেন না (বিটম্যাপে ট্রান্সপারেন্ট পিক্সেল গণনা করা হয়!)।
- ড্র মেথডে রেন্ডার অবজেক্ট তৈরি করবেন না
- একটি সাধারণ ভুল হল, প্রতিবার রেন্ডারিং পদ্ধতি চালু করার সময় একটি নতুন
Paintবা একটি নতুনPathতৈরি করা। এটি গার্বেজ কালেক্টরকে আরও ঘন ঘন রান করতে বাধ্য করে এবং হার্ডওয়্যার পাইপলাইনে ক্যাশে ও অপ্টিমাইজেশন বাইপাস করে। - ঘন ঘন আকার পরিবর্তন করবেন না
- উদাহরণস্বরূপ, জটিল আকার, পাথ এবং বৃত্ত টেক্সচার মাস্ক ব্যবহার করে রেন্ডার করা হয়। আপনি যতবার কোনও পাথ তৈরি বা পরিবর্তন করেন, হার্ডওয়্যার পাইপলাইন একটি নতুন মাস্ক তৈরি করে, যা ব্যয়বহুল হতে পারে।
- বিটম্যাপ খুব ঘন ঘন পরিবর্তন করবেন না
- বিটম্যাপের কন্টেন্ট পরিবর্তন করার সময়, আপনি পরের বার এটি আঁকলে, এটি আবার GPU টেক্সচার হিসেবে আপলোড করা হয়।
- সাবধানতার সাথে আলফা ব্যবহার করুন
- আপনি যখন
setAlpha,AlphaAnimation, বাObjectAnimatorব্যবহার করে কোনও ভিউ ট্রান্সলুসেন্ট করেন, তখন এটি একটি অফ-স্ক্রিন বাফারে রেন্ডার করা হয় যা প্রয়োজনীয় ফিল-রেট দ্বিগুণ করে। খুব বড় ভিউতে আলফা প্রয়োগ করার সময়, ভিউয়ের লেয়ারের ধরনLAYER_TYPE_HARDWARE-এ সেট করার কথা বিবেচনা করুন।