অ্যান্ড্রয়েড 3.0 (API স্তর 11) থেকে শুরু করে, Android 2D রেন্ডারিং পাইপলাইন হার্ডওয়্যার ত্বরণকে সমর্থন করে, যার অর্থ হল View
-এর ক্যানভাসে সঞ্চালিত সমস্ত অঙ্কন ক্রিয়াকলাপগুলি GPU ব্যবহার করে৷ হার্ডওয়্যার ত্বরণ সক্ষম করার জন্য প্রয়োজনীয় বর্ধিত সংস্থানগুলির কারণে, আপনার অ্যাপটি আরও RAM ব্যবহার করবে৷
আপনার টার্গেট এপিআই লেভেল >=14 হলে হার্ডওয়্যার ত্বরণ ডিফল্টরূপে সক্রিয় করা হয়, তবে স্পষ্টভাবে সক্ষম করা যেতে পারে। যদি আপনার অ্যাপ্লিকেশানটি শুধুমাত্র স্ট্যান্ডার্ড ভিউ এবং Drawable
s ব্যবহার করে, তাহলে এটিকে বিশ্বব্যাপী চালু করলে কোনো প্রতিকূল অঙ্কন প্রভাব সৃষ্টি হবে না। যাইহোক, যেহেতু হার্ডওয়্যার ত্বরণ সমস্ত 2D অঙ্কন ক্রিয়াকলাপের জন্য সমর্থিত নয়, এটি চালু করা আপনার কিছু কাস্টম ভিউ বা অঙ্কন কলগুলিকে প্রভাবিত করতে পারে। সমস্যাগুলি সাধারণত অদৃশ্য উপাদান, ব্যতিক্রম বা ভুলভাবে রেন্ডার করা পিক্সেল হিসাবে নিজেকে প্রকাশ করে। এর প্রতিকারের জন্য, Android আপনাকে একাধিক স্তরে হার্ডওয়্যার ত্বরণ সক্ষম বা অক্ষম করার বিকল্প দেয়। কন্ট্রোল হার্ডওয়্যার ত্বরণ দেখুন।
আপনার অ্যাপ্লিকেশান যদি কাস্টম অঙ্কন সঞ্চালন করে, কোন সমস্যা খুঁজে পেতে হার্ডওয়্যার ত্বরণ চালু করে প্রকৃত হার্ডওয়্যার ডিভাইসে আপনার অ্যাপ্লিকেশন পরীক্ষা করুন। অঙ্কন অপারেশন বিভাগে সহায়তা হার্ডওয়্যার ত্বরণ এবং তাদের চারপাশে কীভাবে কাজ করা যায় তার সাথে পরিচিত সমস্যাগুলি বর্ণনা করে।
এছাড়াও ফ্রেমওয়ার্ক API এবং রেন্ডারস্ক্রিপ্ট সহ OpenGL দেখুন
হার্ডওয়্যার ত্বরণ নিয়ন্ত্রণ করুন
আপনি নিম্নলিখিত স্তরে হার্ডওয়্যার ত্বরণ নিয়ন্ত্রণ করতে পারেন:
- আবেদন
- কার্যকলাপ
- জানালা
- দেখুন
আবেদনের স্তর
আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট ফাইলে, আপনার সম্পূর্ণ অ্যাপ্লিকেশনের জন্য হার্ডওয়্যার ত্বরণ সক্ষম করতে <application>
ট্যাগে নিম্নলিখিত বৈশিষ্ট্য যোগ করুন:
<application android:hardwareAccelerated="true" ...>
কার্যকলাপ স্তর
যদি আপনার অ্যাপ্লিকেশনটি বিশ্বব্যাপী হার্ডওয়্যার ত্বরণ চালু করার সাথে সঠিকভাবে আচরণ না করে, তবে আপনি পৃথক কার্যকলাপের জন্যও এটি নিয়ন্ত্রণ করতে পারেন। কার্যকলাপ স্তরে হার্ডওয়্যার ত্বরণ সক্ষম বা অক্ষম করতে, আপনি <activity>
উপাদানটির জন্য android:hardwareAccelerated
বৈশিষ্ট্যটি ব্যবহার করতে পারেন। নিম্নলিখিত উদাহরণটি সম্পূর্ণ অ্যাপ্লিকেশনের জন্য হার্ডওয়্যার ত্বরণ সক্ষম করে কিন্তু একটি কার্যকলাপের জন্য এটি নিষ্ক্রিয় করে:
<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /> </application>
জানালার স্তর
আপনার যদি আরও সূক্ষ্ম নিয়ন্ত্রণের প্রয়োজন হয়, আপনি নিম্নলিখিত কোড সহ একটি প্রদত্ত উইন্ডোর জন্য হার্ডওয়্যার ত্বরণ সক্ষম করতে পারেন:
কোটলিন
window.setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED )
জাভা
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
দ্রষ্টব্য : আপনি বর্তমানে উইন্ডো স্তরে হার্ডওয়্যার ত্বরণ অক্ষম করতে পারবেন না।
স্তর দেখুন
আপনি নিম্নলিখিত কোড সহ রানটাইমে একটি পৃথক দৃশ্যের জন্য হার্ডওয়্যার ত্বরণ অক্ষম করতে পারেন:
কোটলিন
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
জাভা
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
দ্রষ্টব্য : আপনি বর্তমানে ভিউ লেভেলে হার্ডওয়্যার ত্বরণ সক্ষম করতে পারবেন না। হার্ডওয়্যার ত্বরণ অক্ষম করার পাশাপাশি ভিউ লেয়ারগুলির অন্যান্য ফাংশন রয়েছে। তাদের ব্যবহার সম্পর্কে আরও তথ্যের জন্য স্তর দেখুন দেখুন।
একটি ভিউ হার্ডওয়্যার ত্বরান্বিত কিনা তা নির্ধারণ করুন
এটি বর্তমানে হার্ডওয়্যার ত্বরান্বিত কিনা তা জানতে একটি অ্যাপ্লিকেশনের জন্য এটি কখনও কখনও দরকারী, বিশেষ করে কাস্টম ভিউগুলির মতো জিনিসগুলির জন্য৷ এটি বিশেষভাবে কার্যকর যদি আপনার অ্যাপ্লিকেশনটি প্রচুর কাস্টম অঙ্কন করে এবং সমস্ত ক্রিয়াকলাপ নতুন রেন্ডারিং পাইপলাইন দ্বারা সঠিকভাবে সমর্থিত না হয়।
অ্যাপ্লিকেশনটি হার্ডওয়্যার ত্বরিত কিনা তা পরীক্ষা করার দুটি ভিন্ন উপায় রয়েছে:
-
View.isHardwareAccelerated()
true
রিটার্ন করে যদিView
একটি হার্ডওয়্যার এক্সিলারেটেড উইন্ডোতে সংযুক্ত থাকে। -
Canvas.isHardwareAccelerated()
true
ফেরত দেয় যদিCanvas
হার্ডওয়্যার ত্বরিত হয়
আপনি যদি আপনার অঙ্কন কোডে এই পরীক্ষাটি করতে চান, সম্ভব হলে View.isHardwareAccelerated()
Canvas.isHardwareAccelerated()
) ব্যবহার করুন। যখন একটি ভিউ একটি হার্ডওয়্যার এক্সিলারেটেড উইন্ডোতে সংযুক্ত থাকে, তখনও এটি একটি নন-হার্ডওয়্যার এক্সিলারেটেড ক্যানভাস ব্যবহার করে আঁকা যায়। এটি ঘটে, উদাহরণস্বরূপ, ক্যাশিং উদ্দেশ্যে একটি বিটম্যাপে একটি দৃশ্য আঁকার সময়।
অ্যান্ড্রয়েড অঙ্কন মডেল
যখন হার্ডওয়্যার ত্বরণ সক্ষম করা হয়, তখন Android ফ্রেমওয়ার্ক একটি নতুন অঙ্কন মডেল ব্যবহার করে যা আপনার অ্যাপ্লিকেশনটিকে স্ক্রিনে রেন্ডার করতে প্রদর্শন তালিকা ব্যবহার করে। ডিসপ্লে তালিকাগুলিকে সম্পূর্ণরূপে বোঝার জন্য এবং সেগুলি কীভাবে আপনার অ্যাপ্লিকেশনকে প্রভাবিত করতে পারে, এটি বোঝার জন্য এটি দরকারী যে Android কীভাবে হার্ডওয়্যার ত্বরণ ছাড়াই দৃশ্যগুলি আঁকে৷ নিম্নলিখিত বিভাগগুলি সফ্টওয়্যার-ভিত্তিক এবং হার্ডওয়্যার-ত্বরিত অঙ্কন মডেলগুলি বর্ণনা করে।
সফ্টওয়্যার-ভিত্তিক অঙ্কন মডেল
সফ্টওয়্যার অঙ্কন মডেলে, নিম্নলিখিত দুটি ধাপে ভিউ আঁকা হয়:
- অনুক্রমটি বাতিল করুন
- শ্রেণিবিন্যাস আঁকুন
যখনই একটি অ্যাপ্লিকেশনকে তার UI-এর একটি অংশ আপডেট করার প্রয়োজন হয়, এটি সামগ্রী পরিবর্তন করা যেকোন ভিউতে invalidate()
(বা এর একটি রূপ) আহ্বান করে। স্ক্রীনের যে অঞ্চলগুলিকে পুনরায় আঁকতে হবে (নোংরা অঞ্চল) সেগুলি গণনা করতে অকার্যকর বার্তাগুলি ভিউ হায়ারার্কির উপরে প্রচারিত হয়৷ তারপরে অ্যান্ড্রয়েড সিস্টেম নোংরা অঞ্চলের সাথে ছেদ করে এমন শ্রেণিবিন্যাসের যে কোনও দৃশ্য আঁকে। দুর্ভাগ্যবশত, এই অঙ্কন মডেলের দুটি ত্রুটি রয়েছে:
- প্রথমত, এই মডেলটির প্রতিটি ড্র পাসে প্রচুর কোড প্রয়োগ করতে হবে। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটি একটি বোতামে
invalidate()
কল করে এবং সেই বোতামটি অন্য একটি ভিউয়ের উপরে বসে থাকে, তবে Android সিস্টেমটি পরিবর্তন না হওয়া সত্ত্বেও ভিউটিকে পুনরায় আঁকে। - দ্বিতীয় সমস্যা হল যে অঙ্কন মডেল আপনার অ্যাপ্লিকেশনে বাগ লুকাতে পারে। যেহেতু অ্যান্ড্রয়েড সিস্টেম নোংরা অঞ্চলকে ছেদ করার সময় দৃশ্যগুলিকে পুনরায় অঙ্কন করে, তাই একটি ভিউ যার বিষয়বস্তু আপনি পরিবর্তন করেছেন তা পুনরায় আঁকা হতে পারে যদিও এটিতে
invalidate()
বলা হয়নি৷ যখন এটি ঘটবে, আপনি সঠিক আচরণ পাওয়ার জন্য অন্য একটি দৃষ্টিভঙ্গির উপর নির্ভর করছেন যা অবৈধ হয়ে গেছে। আপনি যখনই আপনার অ্যাপ্লিকেশনটি পরিবর্তন করবেন তখন এই আচরণটি পরিবর্তন হতে পারে। এই কারণে, যখনই আপনি ডেটা পরিবর্তন করেন বা দৃশ্যের অঙ্কন কোডকে প্রভাবিত করে এমন অবস্থার কথা বলেন তখন আপনার কাস্টম ভিউতেinvalidate()
কল করা উচিত।
দ্রষ্টব্য : অ্যান্ড্রয়েড ভিউ স্বয়ংক্রিয়ভাবে invalidate()
কল করে যখন তাদের বৈশিষ্ট্য পরিবর্তন হয়, যেমন ব্যাকগ্রাউন্ডের রঙ বা TextView
এ পাঠ্য।
হার্ডওয়্যার ত্বরিত অঙ্কন মডেল
অ্যান্ড্রয়েড সিস্টেম এখনও স্ক্রীন আপডেটের অনুরোধ করতে এবং ভিউ রেন্ডার করতে invalidate()
এবং draw()
ব্যবহার করে, কিন্তু প্রকৃত অঙ্কন ভিন্নভাবে পরিচালনা করে। অঙ্কন কমান্ডগুলি অবিলম্বে কার্যকর করার পরিবর্তে, অ্যান্ড্রয়েড সিস্টেম সেগুলিকে প্রদর্শন তালিকার ভিতরে রেকর্ড করে, যা ভিউ হায়ারার্কির অঙ্কন কোডের আউটপুট ধারণ করে। আরেকটি অপ্টিমাইজেশান হল যে অ্যান্ড্রয়েড সিস্টেমকে শুধুমাত্র একটি invalidate()
কল দ্বারা নোংরা চিহ্নিত ভিউগুলির জন্য প্রদর্শন তালিকা রেকর্ড এবং আপডেট করতে হবে৷ যে ভিউগুলিকে অবৈধ করা হয়নি সেগুলিকে শুধুমাত্র পূর্বে রেকর্ড করা ডিসপ্লে তালিকা পুনরায় জারি করে পুনরায় অঙ্কন করা যেতে পারে৷ নতুন অঙ্কন মডেল তিনটি পর্যায় রয়েছে:
- অনুক্রমটি বাতিল করুন
- প্রদর্শন তালিকা রেকর্ড এবং আপডেট করুন
- প্রদর্শন তালিকা আঁকুন
এই মডেলের সাথে, আপনি নোংরা অঞ্চলকে ছেদ করে এমন একটি দৃশ্যের উপর নির্ভর করতে পারবেন না যাতে এটির draw()
পদ্ধতি কার্যকর হয়। অ্যান্ড্রয়েড সিস্টেম একটি দৃশ্যের প্রদর্শন তালিকা রেকর্ড করে তা নিশ্চিত করতে, আপনাকে অবশ্যই invalidate()
কল করতে হবে। এটি করতে ভুলে যাওয়ার কারণে একটি দৃশ্য পরিবর্তন হওয়ার পরেও একই রকম দেখায়।
ডিসপ্লে লিস্ট ব্যবহার করলে অ্যানিমেশন পারফরম্যান্সেরও সুবিধা হয় কারণ আলফা বা ঘূর্ণনের মতো নির্দিষ্ট বৈশিষ্ট্য সেট করার জন্য লক্ষ্যযুক্ত ভিউ বাতিল করার প্রয়োজন হয় না (এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হয়)। এই অপ্টিমাইজেশানটি ডিসপ্লে তালিকা সহ ভিউয়ের ক্ষেত্রেও প্রযোজ্য (যেকোন ভিউ যখন আপনার অ্যাপ্লিকেশন হার্ডওয়্যার ত্বরান্বিত হয়।) উদাহরণস্বরূপ, ধরুন একটি LinearLayout
রয়েছে যাতে একটি Button
উপরে একটি ListView
রয়েছে। LinearLayout
জন্য প্রদর্শন তালিকাটি এইরকম দেখাচ্ছে:
- ড্র ডিসপ্লেলিস্ট(লিস্টভিউ)
- ড্র ডিসপ্লেলিস্ট (বোতাম)
এখন ধরে নিন যে আপনি ListView
এর অস্বচ্ছতা পরিবর্তন করতে চান। ListView
এ setAlpha(0.5f)
চালু করার পরে, প্রদর্শন তালিকায় এখন এটি রয়েছে:
- SaveLayerAlpha(0.5)
- ড্র ডিসপ্লেলিস্ট(লিস্টভিউ)
- পুনরুদ্ধার করুন
- ড্র ডিসপ্লেলিস্ট (বোতাম)
ListView
এর জটিল অঙ্কন কোডটি কার্যকর করা হয়নি। পরিবর্তে, সিস্টেমটি শুধুমাত্র অনেক সহজ LinearLayout
প্রদর্শন তালিকা আপডেট করে। হার্ডওয়্যার ত্বরণ সক্ষম ছাড়াই একটি অ্যাপ্লিকেশনে, তালিকা এবং এর অভিভাবক উভয়ের অঙ্কন কোড আবার কার্যকর করা হয়।
অঙ্কন অপারেশন জন্য সমর্থন
যখন হার্ডওয়্যার ত্বরান্বিত হয়, 2D রেন্ডারিং পাইপলাইন সর্বাধিক ব্যবহৃত Canvas
অঙ্কন অপারেশনগুলির পাশাপাশি অনেক কম-ব্যবহৃত ক্রিয়াকলাপগুলিকে সমর্থন করে৷ অ্যানড্রয়েড, ডিফল্ট উইজেট এবং লেআউট, এবং প্রতিফলন এবং টাইল্ড টেক্সচারের মতো সাধারণ উন্নত ভিজ্যুয়াল এফেক্টের সাথে পাঠানো অ্যাপ্লিকেশনগুলিকে রেন্ডার করতে ব্যবহৃত সমস্ত অঙ্কন ক্রিয়াকলাপগুলি সমর্থিত।
নিম্নলিখিত সারণী API স্তর জুড়ে বিভিন্ন ক্রিয়াকলাপের সমর্থন স্তর বর্ণনা করে:
প্রথম সমর্থিত API স্তর | ||||
ক্যানভাস | ||||
drawBitmapMesh() (রঙ অ্যারে) | 18 | |||
ছবি আঁকা() | 23 | |||
drawPosText() | 16 | |||
drawTextOnPath() | 16 | |||
ড্রভার্টিস() | 29 | |||
setDrawFilter() | 16 | |||
ক্লিপপথ() | 18 | |||
ক্লিপ অঞ্চল() | 18 | |||
clipRect(Region.Op.XOR) | 18 | |||
clipRect(Region.Op.Difference) | 18 | |||
clipRect(Region.Op.Reverse Difference) | 18 | |||
ঘূর্ণন/দৃষ্টিকোণ সহ clipRect() | 18 | |||
পেইন্ট | ||||
setAntiAlias() (পাঠ্যের জন্য) | 18 | |||
setAntiAlias() (লাইনের জন্য) | 16 | |||
সেট ফিল্টারবিটম্যাপ() | 17 | |||
সেট লিনিয়ার টেক্সট() | ✗ | |||
সেটমাস্কফিল্টার() | ✗ | |||
setPathEffect() (লাইনের জন্য) | 28 | |||
setShadowLayer() (পাঠ্য ছাড়া) | 28 | |||
setStrokeCap() (লাইনের জন্য) | 18 | |||
setStrokeCap() (পয়েন্টের জন্য) | 19 | |||
সেট সাবপিক্সেল টেক্সট() | 28 | |||
Xfermode | ||||
PorterDuff.Mode.DARKEN (ফ্রেমবাফার) | 28 | |||
PorterDuff.Mode.LIGHTEN (ফ্রেমবাফার) | 28 | |||
PorterDuff.Mode.OVERLAY (ফ্রেমবাফার) | 28 | |||
শেডর | ||||
ComposeShader ভিতরে ComposeShader | 28 | |||
ComposeShader-এর ভিতরে একই ধরনের শেডার | 28 | |||
কম্পোজশেডারে স্থানীয় ম্যাট্রিক্স | 18 |
ক্যানভাস স্কেলিং
হার্ডওয়্যার ত্বরান্বিত 2D রেন্ডারিং পাইপলাইনটি প্রথমে তৈরি করা হয়েছিল আনস্কেলড ড্রয়িংকে সমর্থন করার জন্য, কিছু অঙ্কন অপারেশন উচ্চ স্কেল মানগুলিতে গুণমানকে উল্লেখযোগ্যভাবে হ্রাস করে। এই ক্রিয়াকলাপগুলি GPU দ্বারা রূপান্তরিত স্কেল 1.0 এ আঁকা টেক্সচার হিসাবে প্রয়োগ করা হয়। API স্তর 28 থেকে শুরু করে, সমস্ত অঙ্কন অপারেশন সমস্যা ছাড়াই স্কেল করতে পারে।
নিচের সারণীটি দেখায় যখন বাস্তবায়ন পরিবর্তন করা হয়েছিল সঠিকভাবে বড় স্কেল পরিচালনা করার জন্য:অঙ্কন অপারেশন স্কেল করা হবে | প্রথম সমর্থিত API স্তর |
আঁকা পাঠ্য() | 18 |
drawPosText() | 28 |
drawTextOnPath() | 28 |
সরল আকার* | 17 |
জটিল আকার* | 28 |
drawPath() | 28 |
ছায়া স্তর | 28 |
দ্রষ্টব্য : 'সাধারণ' আকারগুলি হল drawRect()
, drawCircle()
, drawOval()
, drawRoundRect()
, এবং drawArc()
(useCenter=false সহ) একটি পেইন্টের সাথে জারি করা কমান্ড যার কোনো PathEffect নেই, এবং নেই। অ-ডিফল্ট যোগদান রয়েছে ( setStrokeJoin()
/ setStrokeMiter()
এর মাধ্যমে)। এই ড্র কমান্ডের অন্যান্য উদাহরণ উপরের চার্টে 'কমপ্লেক্স'-এর অধীনে পড়ে।
যদি আপনার অ্যাপ্লিকেশন এই অনুপস্থিত বৈশিষ্ট্য বা সীমাবদ্ধতার কোনো দ্বারা প্রভাবিত হয়, আপনি setLayerType(View.LAYER_TYPE_SOFTWARE, null)
কল করে আপনার অ্যাপ্লিকেশনের প্রভাবিত অংশের জন্য হার্ডওয়্যার ত্বরণ বন্ধ করতে পারেন। এইভাবে, আপনি এখনও অন্য সব জায়গায় হার্ডওয়্যার ত্বরণের সুবিধা নিতে পারেন। আপনার অ্যাপ্লিকেশনের বিভিন্ন স্তরে হার্ডওয়্যার ত্বরণ কীভাবে সক্ষম এবং অক্ষম করবেন সে সম্পর্কে আরও তথ্যের জন্য নিয়ন্ত্রণ হার্ডওয়্যার ত্বরণ দেখুন৷
স্তরগুলি দেখুন
অ্যান্ড্রয়েডের সমস্ত সংস্করণে, ভিউগুলির অঙ্কন ক্যাশে ব্যবহার করে বা Canvas.saveLayer()
ব্যবহার করে অফ-স্ক্রিন বাফারগুলিতে রেন্ডার করার ক্ষমতা রয়েছে৷ অফ-স্ক্রিন বাফার বা স্তরগুলির বেশ কয়েকটি ব্যবহার রয়েছে। জটিল ভিউ অ্যানিমেট করার সময় বা কম্পোজিশন ইফেক্ট প্রয়োগ করার জন্য আপনি এগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি অস্থায়ীভাবে একটি স্তরে একটি দৃশ্য রেন্ডার করতে Canvas.saveLayer()
ব্যবহার করে ফেইড প্রভাব প্রয়োগ করতে পারেন এবং তারপরে একটি অস্বচ্ছতা ফ্যাক্টর সহ স্ক্রিনে এটিকে আবার কম্পোজিট করতে পারেন।
অ্যান্ড্রয়েড 3.0 (API স্তর 11) থেকে শুরু করে, View.setLayerType()
পদ্ধতিতে কীভাবে এবং কখন স্তরগুলি ব্যবহার করবেন তার উপর আপনার আরও নিয়ন্ত্রণ রয়েছে৷ এই APIটি দুটি পরামিতি নেয়: আপনি যে স্তরটি ব্যবহার করতে চান তার ধরন এবং একটি ঐচ্ছিক Paint
অবজেক্ট যা বর্ণনা করে যে স্তরটি কীভাবে সংমিশ্রিত হবে। আপনি রঙের ফিল্টার, বিশেষ মিশ্রন মোড, বা একটি স্তরে অস্বচ্ছতা প্রয়োগ করতে Paint
প্যারামিটার ব্যবহার করতে পারেন। একটি দৃশ্য তিনটি স্তর প্রকারের একটি ব্যবহার করতে পারে:
-
LAYER_TYPE_NONE
: ভিউটি সাধারণত রেন্ডার করা হয় এবং একটি অফ-স্ক্রিন বাফার দ্বারা ব্যাক করা হয় না৷ এটি ডিফল্ট আচরণ। -
LAYER_TYPE_HARDWARE
: ভিউটি হার্ডওয়্যারে একটি হার্ডওয়্যার টেক্সচারে রেন্ডার করা হয় যদি অ্যাপ্লিকেশনটি হার্ডওয়্যার ত্বরিত হয়। যদি অ্যাপ্লিকেশনটি হার্ডওয়্যার ত্বরান্বিত না হয়, তাহলে এই স্তরের প্রকারটিLAYER_TYPE_SOFTWARE
এর মতোই আচরণ করে। -
LAYER_TYPE_SOFTWARE
: ভিউটি সফ্টওয়্যারে একটি বিটম্যাপে রেন্ডার করা হয়।
আপনি যে স্তরটি ব্যবহার করেন তা আপনার লক্ষ্যের উপর নির্ভর করে:
- কর্মক্ষমতা : একটি হার্ডওয়্যার টেক্সচারে একটি ভিউ রেন্ডার করতে একটি হার্ডওয়্যার স্তরের ধরন ব্যবহার করুন। একবার একটি ভিউ একটি স্তরে রেন্ডার করা হলে, ভিউ কল
invalidate()
না হওয়া পর্যন্ত এর অঙ্কন কোডটি কার্যকর করতে হবে না। কিছু অ্যানিমেশন, যেমন আলফা অ্যানিমেশন, তারপর সরাসরি স্তরে প্রয়োগ করা যেতে পারে, যা GPU-এর জন্য খুবই কার্যকর। - ভিজ্যুয়াল এফেক্ট : একটি দৃশ্যে বিশেষ ভিজ্যুয়াল ট্রিটমেন্ট প্রয়োগ করতে একটি হার্ডওয়্যার বা সফ্টওয়্যার স্তরের ধরন এবং একটি
Paint
ব্যবহার করুন। উদাহরণস্বরূপ, আপনি একটিColorMatrixColorFilter
ব্যবহার করে কালো এবং সাদাতে একটি দৃশ্য আঁকতে পারেন। - সামঞ্জস্যতা : সফ্টওয়্যারে রেন্ডার করার জন্য একটি দৃশ্য জোর করতে একটি সফ্টওয়্যার স্তর প্রকার ব্যবহার করুন৷ যদি একটি ভিউ যা হার্ডওয়্যার ত্বরান্বিত হয় (উদাহরণস্বরূপ, যদি আপনার পুরো অ্যাপ্লিকেশনটি হার্ডওয়্যার ত্বরান্বিত হয়), তাহলে রেন্ডারিং সমস্যা হচ্ছে, এটি হার্ডওয়্যার রেন্ডারিং পাইপলাইনের সীমাবদ্ধতার কাছাকাছি কাজ করার একটি সহজ উপায়।
স্তর এবং অ্যানিমেশন দেখুন
আপনার অ্যাপ্লিকেশন হার্ডওয়্যার ত্বরান্বিত হলে হার্ডওয়্যার স্তরগুলি দ্রুত এবং মসৃণ অ্যানিমেশন সরবরাহ করতে পারে। প্রতি সেকেন্ডে 60 ফ্রেমে একটি অ্যানিমেশন চালানো সবসময় সম্ভব হয় না যখন জটিল ভিউ অ্যানিমেট করা হয় যা প্রচুর অঙ্কন ক্রিয়াকলাপ জারি করে। হার্ডওয়্যার টেক্সচারে ভিউ রেন্ডার করার জন্য হার্ডওয়্যার স্তরগুলি ব্যবহার করে এটি হ্রাস করা যেতে পারে। হার্ডওয়্যার টেক্সচারটি তখন ভিউটিকে অ্যানিমেট করতে ব্যবহার করা যেতে পারে, যখন এটি অ্যানিমেটেড করা হচ্ছে তখন ভিউটিকে ক্রমাগত পুনরায় আঁকার প্রয়োজনীয়তা দূর করে। ভিউটি পুনরায় আঁকা হয় না যদি না আপনি ভিউটির বৈশিষ্ট্য পরিবর্তন করেন, যা invalidate()
কল করে, অথবা যদি আপনি ম্যানুয়ালি invalidate()
কল করেন। আপনি যদি আপনার অ্যাপ্লিকেশনে একটি অ্যানিমেশন চালান এবং আপনার পছন্দসই মসৃণ ফলাফলগুলি না পান, তাহলে আপনার অ্যানিমেটেড ভিউগুলিতে হার্ডওয়্যার স্তরগুলি সক্ষম করার কথা বিবেচনা করুন৷
যখন একটি ভিউ একটি হার্ডওয়্যার স্তর দ্বারা সমর্থিত হয়, তখন এর কিছু বৈশিষ্ট্য স্ক্রীনে স্তরটি যেভাবে সংমিশ্রিত হয় তার দ্বারা পরিচালিত হয়। এই বৈশিষ্ট্যগুলি সেট করা কার্যকর হবে কারণ তাদের ভিউটি অবৈধ এবং পুনরায় আঁকার প্রয়োজন নেই৷ বৈশিষ্ট্যের নিম্নলিখিত তালিকা স্তরটি সংমিশ্রিত হওয়ার পদ্ধতিকে প্রভাবিত করে। এই বৈশিষ্ট্যগুলির যেকোনটির জন্য সেটারকে কল করার ফলে সর্বোত্তম অবৈধ হয়ে যায় এবং লক্ষ্যযুক্ত দৃশ্যের কোন পুনর্নবীকরণ হয় না:
-
alpha
: স্তরের অস্বচ্ছতা পরিবর্তন করে -
x
,y
,translationX
,translationY
: স্তরের অবস্থান পরিবর্তন করে -
scaleX
,scaleY
: স্তরের আকার পরিবর্তন করে -
rotation
,rotationX
,rotationY
: 3D স্পেসে স্তরের অভিযোজন পরিবর্তন করে -
pivotX
,pivotY
: স্তরের রূপান্তরের উত্স পরিবর্তন করে৷
এই বৈশিষ্ট্যগুলি হল একটি ObjectAnimator
দিয়ে একটি ভিউ অ্যানিমেট করার সময় ব্যবহৃত নাম। আপনি যদি এই বৈশিষ্ট্যগুলি অ্যাক্সেস করতে চান তবে উপযুক্ত সেটার বা গেটারকে কল করুন। উদাহরণস্বরূপ, আলফা বৈশিষ্ট্য পরিবর্তন করতে, setAlpha()
কল করুন। নিম্নলিখিত কোড স্নিপেটটি Y-অক্ষের চারপাশে 3D তে ভিউ ঘুরানোর সবচেয়ে কার্যকর উপায় দেখায়:
কোটলিন
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();
যেহেতু হার্ডওয়্যার স্তরগুলি ভিডিও মেমরি ব্যবহার করে, এটি অত্যন্ত সুপারিশ করা হয় যে আপনি শুধুমাত্র অ্যানিমেশনের সময়কালের জন্য সেগুলি সক্ষম করুন এবং তারপর অ্যানিমেশন সম্পন্ন হওয়ার পরে সেগুলিকে অক্ষম করুন৷ আপনি অ্যানিমেশন শ্রোতা ব্যবহার করে এটি সম্পন্ন করতে পারেন:
কোটলিন
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 অপ্টিমাইজ করার সবচেয়ে সহজ উপায়গুলির মধ্যে একটি।
- ওভারড্র এড়িয়ে চলুন
- একে অপরের উপরে অনেকগুলি স্তর আঁকবেন না। এর উপরে থাকা অন্যান্য অস্বচ্ছ দৃষ্টিভঙ্গি দ্বারা সম্পূর্ণরূপে অস্পষ্ট যে কোনও দৃশ্য সরান। আপনি যদি একে অপরের উপরে মিশ্রিত বেশ কয়েকটি স্তর আঁকতে চান তবে সেগুলিকে একক স্তরে একত্রিত করার কথা বিবেচনা করুন। বর্তমান হার্ডওয়্যারের সাথে একটি ভাল নিয়ম হল প্রতি ফ্রেমে স্ক্রিনে পিক্সেলের সংখ্যার 2.5 গুণের বেশি আঁকবেন না (একটি বিটম্যাপের গণনায় স্বচ্ছ পিক্সেল!)।
- ড্র পদ্ধতিতে রেন্ডার অবজেক্ট তৈরি করবেন না
- একটি সাধারণ ভুল হল একটি নতুন
Paint
বা একটি নতুনPath
তৈরি করা যখনই একটি রেন্ডারিং পদ্ধতি চালু করা হয়। এটি আবর্জনা সংগ্রহকারীকে প্রায়শই চালাতে বাধ্য করে এবং হার্ডওয়্যার পাইপলাইনে ক্যাশে এবং অপ্টিমাইজেশনকে বাইপাস করে। - খুব ঘন ঘন আকার পরিবর্তন করবেন না
- টেক্সচার মাস্ক ব্যবহার করে জটিল আকার, পথ এবং চেনাশোনাগুলিকে রেন্ডার করা হয়। আপনি যখনই একটি পথ তৈরি করেন বা পরিবর্তন করেন, হার্ডওয়্যার পাইপলাইন একটি নতুন মুখোশ তৈরি করে, যা ব্যয়বহুল হতে পারে।
- খুব ঘন ঘন বিটম্যাপ পরিবর্তন করবেন না
- প্রতিবার আপনি একটি বিটম্যাপের বিষয়বস্তু পরিবর্তন করলে, পরের বার যখন আপনি এটি আঁকবেন তখন এটি আবার একটি GPU টেক্সচার হিসাবে আপলোড হবে।
- সাবধানে আলফা ব্যবহার করুন
- আপনি যখন
setAlpha()
,AlphaAnimation
, বাObjectAnimator
ব্যবহার করে একটি দৃশ্যকে স্বচ্ছ করেন, তখন এটি একটি অফ-স্ক্রিন বাফারে রেন্ডার করা হয় যা প্রয়োজনীয় ফিল-রেটকে দ্বিগুণ করে। খুব বড় ভিউতে আলফা প্রয়োগ করার সময়, ভিউয়ের লেয়ার টাইপকেLAYER_TYPE_HARDWARE
এ সেট করার কথা বিবেচনা করুন।