এই ডকুমেন্টটিতে দেখানো হয়েছে কীভাবে সিপিইউ এবং জিপিইউ-এর প্রতিবন্ধকতা শনাক্ত ও সমাধান করার টুল ব্যবহার করে গেমের পারফরম্যান্স অপ্টিমাইজ করা যায়।
সিপিইউ অপ্টিমাইজেশন
বিশ্লেষণে যদি দেখা যায় গেমটি সিপিইউ-নির্ভর, তবে আরও তদন্ত অপরিহার্য। এর জন্য সেই নির্দিষ্ট থ্রেড বা এপিআইগুলো শনাক্ত করতে হবে, যেগুলো প্রতিবন্ধকতা সৃষ্টি করে এবং এফপিএস কমিয়ে দেয়।
সিপিইউ অপ্টিমাইজেশনের জন্য সাধারণত কোনো সার্বজনীন সমাধান কার্যকর হয় না। এর পরিবর্তে, গেম বা সিন-এর উপর ভিত্তি করে সবচেয়ে বেশি চাহিদাসম্পন্ন ওয়ার্কলোড শনাক্ত করতে হবে এবং তারপর প্রাসঙ্গিক লজিক ও ফাংশনগুলোকে অপ্টিমাইজ করতে হবে।
গেম ইঞ্জিন টাইমিং ট্রেস টুলস
নিম্নলিখিত সরঞ্জামগুলি এই বিশ্লেষণে সহায়তা করতে পারে:
অবাস্তব অন্তর্দৃষ্টি
আনরিয়েল ইঞ্জিন প্রোজেক্টের মধ্যে, আনরিয়েল ইনসাইট টুল একটি ফ্রেম গঠনকারী স্বতন্ত্র থ্রেডগুলির টাইমিং ট্রেস তথ্য বিশ্লেষণ করতে সহায়তা করে।
উদাহরণস্বরূপ, গেমথ্রেড সাধারণত সিপিইউ সময়ের সবচেয়ে বড় অংশ ব্যবহার করে, যার প্রধান কারণ হলো টিক টাইম। এছাড়াও, টিক টাইমের একটি উল্লেখযোগ্য অংশ FActorComponentTickFunction এর সাথে সম্পর্কিত কাজগুলো দ্বারা ব্যয়িত হয়।
FActorComponentTick অপ্টিমাইজ করার জন্য, ক্যামেরার ফিল্ড অফ ভিউ-এর বাইরে অবস্থিত ক্যারেক্টার এবং অবজেক্টগুলোর ক্ষেত্রে গণনা বাদ দেওয়া এবং কালিং (culling) প্রয়োগ করা অপরিহার্য। এছাড়াও, LOD (লেভেল অফ ডিটেইল)-ভিত্তিক অ্যানিমেশন ব্যবহার করলে পারফরম্যান্সে আরও উন্নতি হতে পারে।

ইউনিটি প্রোফাইলার (ইউনিটি)
ইউনিটি প্রোফাইলার ব্যবহার করে করা বিশ্লেষণে দেখা যায় যে, মেইন থ্রেড ৪৫ মিলিসেকেন্ডের বেশি সময় নেয়, যার মধ্যে PostLateUpdate.FinishFrameRendering ১৬.২৩ মিলিসেকেন্ড সময় নেয়, যা এটিকে সবচেয়ে বেশি সময়-সাপেক্ষ অপারেশনে পরিণত করে। এর মধ্যে Inl_RenderCameraStack-এর একাধিক কল লক্ষ্য করা গেছে। সক্রিয় ক্যামেরাগুলোর প্রয়োজনীয়তা যাচাই করে সেই অনুযায়ী সেগুলোকে অপ্টিমাইজ করার পরামর্শ দেওয়া হচ্ছে।

সিস্টেম-স্তরের প্রোফাইলিং সরঞ্জাম
নিম্নলিখিত প্রোফাইলিং টুলগুলি ব্যবহার করুন:
পারফেট্টো
পারফেটটো ট্রেস ব্যবহার করে, আপনি একটি অ্যান্ড্রয়েড-চালিত ডিভাইসের প্রতিটি থ্রেডের সিপিইউ কোর অ্যাসাইনমেন্ট এবং এক্সিকিউশনের বিবরণ নির্ধারণ করতে পারেন। এটি আপনাকে থ্রেড এক্সিকিউশন ডেটা বিশ্লেষণ করে পারফরম্যান্সের প্রতিবন্ধকতাগুলো শনাক্ত করতে সাহায্য করে।
সিপিইউ ওভারহেড কেস
ট্রেস থেকে বোঝা যাচ্ছে যে, GameThread এবং RenderThread-এর উপর কাজের চাপ RHI থ্রেডের QueuePresent-এ বিলম্ব ঘটাচ্ছে, যার ফলে VSync-এর উপর ভিত্তি করে একটি CPU-বাউন্ড পরিস্থিতি তৈরি হচ্ছে।

জিপিইউ ওভারহেড কেস
ট্রেস থেকে বোঝা যায় যে, জিপিইউ দ্বারা সম্পন্ন হতেই ২৫ মিলিসেকেন্ডের বেশি সময় লাগছে, যা একটি জিপিইউ-বাউন্ড পরিস্থিতি নির্দেশ করে।

সিম্পলপার্ফ
বর্তমানে সর্বোচ্চ সিপিইউ ব্যবহারকারী ফাংশনগুলো শনাক্ত করতে simpleperf ব্যবহার করা যেতে পারে। সর্বোত্তম ফলাফলের জন্য, এই ফাংশনগুলোকে অগ্রাধিকার অনুযায়ী সাজিয়ে সর্বোচ্চ ব্যবহারকারী ফাংশনগুলোকে প্রথমে সমাধান করার পরামর্শ দেওয়া হয়।

Simpleperf আপনাকে সেইসব ফাংশনের ডেটা পরীক্ষা করতে সাহায্য করে যেগুলো সবচেয়ে বেশি সিপিইউ সময় ব্যবহার করে। সিপিইউ ব্যবহার অপ্টিমাইজ করতে, সবচেয়ে বেশি সিপিইউ ব্যবহারকারী ফাংশনগুলো দিয়ে শুরু করুন। এই উদাহরণে, USkeletalMeshComponent , যা ActorComponentTickFunctions এর অ্যানিমেশনের সাথে যুক্ত, সবচেয়ে বেশি সিপিইউ ব্যবহার করে।
জিপিইউ অপ্টিমাইজেশন
বিশ্লেষণে যদি দেখা যায় যে গেমটি জিপিইউ-নির্ভর, তবে আরও তদন্ত অপরিহার্য। এর জন্য জিপিইউ অপ্টিমাইজেশন এবং বিশ্লেষণের বিভিন্ন সরঞ্জাম ও কৌশল ব্যবহার করা প্রয়োজন।
জিপিইউ অপ্টিমাইজ করার জন্য, প্রতিটি সিনের রেন্ডার পাইপলাইন এবং ড্র কল বিশ্লেষণ করতে একটি ফ্রেম ডিবাগার ব্যবহার করুন। এছাড়াও, অপ্রয়োজনীয় অপারেশন বা অপ্টিমাইজ করার ক্ষেত্রগুলো শনাক্ত করতে আপনাকে জিপিইউ আর্কিটেকচার এবং পাইপলাইনের আচরণ পুঙ্খানুপুঙ্খভাবে বুঝতে হবে।
নিম্নলিখিত বিভাগগুলিতে GPU অপ্টিমাইজেশনের পদ্ধতি এবং সরঞ্জামগুলি ব্যাখ্যা করা হয়েছে।
অপ্রয়োজনীয় রেন্ডারপাসগুলি বাদ দিন
রেন্ডারিং পারফরম্যান্স উন্নত করতে এবং জিপিইউ-এর কাজের চাপ কমাতে, অপ্রয়োজনীয় রেন্ডার পাসগুলো বাদ দিন। এর মধ্যে এমন যেকোনো রেন্ডার পাস অন্তর্ভুক্ত, যেটিতে ড্র কল নেই অথবা যার আউটপুট চূড়ান্ত ফ্রেমে ব্যবহৃত হয় না।
রেন্ডারিং পাইপলাইন বিশ্লেষণ করতে এবং অপ্টিমাইজেশনের সুযোগ শনাক্ত করতে RenderDoc এর মতো একটি GPU ডিবাগার ব্যবহার করুন।
কোনো ড্র কল নেই: রেন্ডার পাসে কোনো ড্র কল অন্তর্ভুক্ত আছে কিনা তা পরীক্ষা করুন। যদি এতে কোনো ড্র কল না থাকে, তাহলে পাসটি মুছে ফেলুন।
অব্যবহৃত আউটপুট: পরবর্তী পাসগুলো রেন্ডার পাসের আউটপুট, যেমন রঙ বা গভীরতা, অ্যাক্সেস বা প্রদর্শন করে কিনা তা পরীক্ষা করুন। যদি তা না করে, তাহলে পাসটি সরিয়ে দিন।
মার্জযোগ্য পাস: যে পাসগুলি আপনি মার্জ করতে পারেন সেগুলি শনাক্ত করুন:
- একই ফ্রেমবাফার বা সংযুক্তি
- সামঞ্জস্যপূর্ণ লোড বা স্টোর অপারেশন
- মাঝখানে কোনো নির্ভরশীলতার বাধা নেই

লোড বা স্টোর অপারেশন হ্রাস করুন
লোড বা স্টোর অপারেশনগুলো রিসোর্স-ইনটেনসিভ, কারণ এগুলো প্রচুর মেমরি ব্যবহার করে। অপ্রয়োজনীয় লোড-স্টোর অপারেশনগুলো কমিয়ে আনুন। এই কাজগুলো কেবল তখনই করুন যখন একটি RenderPass ভেতরের অ্যাটাচমেন্টগুলোর প্রয়োজন হয়। অন্যথায়, ওভারহেড কমাতে এগুলোর পরিবর্তে Clear বা Don't care অপারেশন ব্যবহার করুন।
কীভাবে অপ্টিমাইজ করবেন
রেন্ডারিং পাইপলাইন বিশ্লেষণ করতে এবং নিম্নলিখিত অপ্টিমাইজেশনের সুযোগগুলি শনাক্ত করতে RenderDoc এর মতো একটি GPU ডিবাগার ব্যবহার করুন:
লোড: যদি কোনো রেন্ডার পাস অ্যাটাচমেন্ট পূর্ববর্তী পাস বা অ্যাটাচমেন্টের ডেটা ব্যবহার না করে, তাহলে লোড অপারেশনের প্রয়োজন হয় না। এই ধরনের ক্ষেত্রে,
Don't careবাClearব্যবহার করে ওভারহেড কমানো যেতে পারে।স্টোর: যদি কোনো রেন্ডার পাস অ্যাটাচমেন্ট বর্তমান রেন্ডার পাসের পরে আর ব্যবহার না করা হয়, তাহলে স্টোর অপারেশনটি অপ্রয়োজনীয়। এমন ক্ষেত্রে,
Don't careঅথবাClearব্যবহার করুন।প্রতিস্থাপন: চূড়ান্ত ফ্রেমকে প্রভাবিত না করে বর্তমান লোড বা স্টোর সেটিংসকে
ClearবাDon't Careদ্বারা প্রতিস্থাপন করা যাবে কিনা তা নির্ধারণ করুন।

আর্লি-জেড (Early-Z) সক্রিয় করতে বাতিল করা এড়িয়ে চলুন।
আর্লি-জেড (Early-Z) মোবাইল প্ল্যাটফর্মে পারফরম্যান্স উন্নত করে। তবে, একটি শেডারের মধ্যে থাকা discard ইনস্ট্রাকশন স্বয়ংক্রিয়ভাবে আর্লি-জেড নিষ্ক্রিয় করে দেয়। যদি discard ইনস্ট্রাকশনটি অপরিহার্য না হয়, তবে সেটি সরিয়ে ফেলুন।
প্রারম্ভিক-জেড ত্বরণ
এই অপ্টিমাইজেশন ফ্র্যাগমেন্ট শেডার অপারেশন উল্লেখযোগ্যভাবে হ্রাস করে এবং জিপিইউ পারফরম্যান্স উন্নত করে।
আর্লি-জেড গভীরতা এবং স্টেনসিল পরীক্ষা

কীভাবে অপ্টিমাইজ করবেন
রেন্ডারিং পাইপলাইন বিশ্লেষণ করতে এবং নিম্নলিখিত অপ্টিমাইজেশনের সুযোগগুলি শনাক্ত করতে RenderDoc এর মতো একটি GPU ডিবাগার ব্যবহার করুন:
ফ্র্যাগমেন্ট শেডারে
discard-এর ব্যবহার:discardকীওয়ার্ডটি GPU-কে আগাম ডেপথ টেস্ট করা থেকে বিরত রাখে, কারণ ফ্র্যাগমেন্টটির ভিজিবিলিটি আগে থেকে জানা থাকে না।gl_FragDepthএর পরিবর্তন: গতিশীলভাবেgl_FragDepthপরিবর্তন করলে একটি ফ্র্যাগমেন্টের গভীরতা পরিবর্তিত হয়, যা আর্লি-জেড (Early-Z) অপ্টিমাইজেশনকে নিষ্ক্রিয় করে দেয়, কারণ ফ্র্যাগমেন্ট প্রক্রিয়াকরণের আগে চূড়ান্ত গভীরতা অজানা থাকে।আলফা-টু-কভারেজ সক্রিয়: যখন আলফা-টু-কভারেজ সক্রিয় করা হয় (যা প্রায়শই MSAA রেন্ডারিং-এ ব্যবহৃত হয়), তখন ফ্র্যাগমেন্ট কভারেজ আলফা মানের উপর নির্ভর করে। এর ফলে ডেপথ টেস্টিং বিলম্বিত হতে পারে এবং আর্লি-জেড (Early-Z) নিষ্ক্রিয় হয়ে যেতে পারে।

টেক্সচার ফরম্যাট অপ্টিমাইজ করুন
সর্বোত্তম টেক্সচার ফরম্যাট নির্বাচন করলে মেমরি খরচ কমে, ব্যান্ডউইথের কার্যকারিতা বাড়ে এবং রেন্ডারিং পারফরম্যান্স উন্নত হয়। অতিরিক্ত উচ্চ-প্রিসিশন ফরম্যাট ব্যবহার করলে তা কোনো ভিজ্যুয়াল সুবিধা না দিয়েই জিপিইউ রিসোর্সের অপচয় করতে পারে।
কীভাবে অপ্টিমাইজ করবেন
রেন্ডারিং পাইপলাইন বিশ্লেষণ করতে এবং নিম্নলিখিত অপ্টিমাইজেশনের সুযোগগুলি শনাক্ত করতে RenderDoc এর মতো একটি GPU ডিবাগার ব্যবহার করুন:
- ডেপথ-স্টেনসিল বাফারের জন্য
D32S8এর পরিবর্তেD24S8ব্যবহার করুন: ডেপথ-স্টেনসিল বাফারের জন্যD24S8ব্যবহার করলেD32S8তুলনায় মেমরি ব্যবহার ২০% কমে যায়, এবং বেশিরভাগ অ্যাপ্লিকেশনে ভিজ্যুয়াল কোয়ালিটিতে তেমন কোনো লক্ষণীয় পার্থক্য দেখা যায় না। - রঙিন টেক্সচারের জন্য
ASTCকম্প্রেশন ব্যবহার করুন:ASTCকম্প্রেশন উচ্চ ভিজ্যুয়াল কোয়ালিটি বজায় রেখে টেক্সচারের মেমরি ব্যবহার উল্লেখযোগ্যভাবে হ্রাস করে—অসংকুচিত ফরম্যাটের তুলনায় ৮ গুণ পর্যন্ত। - ফুল-ফ্লোটের পরিবর্তে হাফ-ফ্লোট ফরম্যাট ব্যবহার করুন: মেমরি ব্যান্ডউইথ এবং স্টোরেজ ব্যবহার কমাতে
R16FবাRG16Fব্যবহার করুন। এই ফরম্যাটগুলো পোস্ট-প্রসেসিং বাফারের জন্য বিশেষভাবে উপযুক্ত।
জ্যামিতিক জটিলতা অপ্টিমাইজ করুন
জ্যামিতিক জটিলতা কমালে রেন্ডারিং পারফরম্যান্স উন্নত হয়, বিশেষ করে সীমিত জিপিইউ ক্ষমতাসম্পন্ন মোবাইল ডিভাইসগুলোতে। এর জন্য ভার্টেক্স ও ট্রায়াঙ্গেলের সংখ্যা কমানো, ড্র কল কমানোর জন্য অবজেক্ট একত্রিত করা এবং রেন্ডার না হওয়া বা অপ্রয়োজনীয় জ্যামিতি বাদ দেওয়া প্রয়োজন। মেশ সিম্পলিফিকেশন, লেভেল অফ ডিটেইল (LOD), এবং ফ্রাস্টাম বা অক্লুশন কালিং-এর মতো কৌশলগুলো জিপিইউ-এর কাজের চাপ উল্লেখযোগ্যভাবে কমাতে এবং ফ্রেম রেট বাড়াতে পারে।
কীভাবে অপ্টিমাইজ করবেন
জ্যামিতি-সম্পর্কিত পারফরম্যান্সের প্রতিবন্ধকতা শনাক্ত করতে RenderDoc , Android GPU Inspector বা অন্যান্য পারফরম্যান্স অ্যানালাইজারের মতো প্রোফাইলিং টুল এবং জিপিইউ ডিবাগার ব্যবহার করুন।
ত্রিভুজের সংখ্যা হ্রাস করুন: বিশেষ করে ছোট বা দূরবর্তী বস্তুর ক্ষেত্রে বহুভুজের ব্যবহার কমান।
লেভেল অফ ডিটেইল (LOD) ব্যবহার করুন: ক্যামেরার দূরত্বের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে সরলতর মেশ ব্যবহার করা হয়।
ছোট মেশগুলো একত্রিত করুন: ড্র কল এবং সিপিইউ ওভারহেড কমাতে স্ট্যাটিক অবজেক্টগুলোকে একীভূত করুন।
ফ্রাস্টাম এবং অক্লুশন কালিং: দৃশ্যের বাইরে থাকা বা অন্য উপাদান দ্বারা আবৃত বস্তু রেন্ডার করা এড়িয়ে চলুন।
অপ্রয়োজনীয় সংযুক্তিগুলি সরিয়ে ফেলুন
রেন্ডার পাস অ্যাটাচমেন্টগুলো (যেমন, রঙ, ডেপথ, স্টেনসিল) ব্যবহৃত না হলেও মেমরি ব্যান্ডউইথ এবং জিপিইউ রিসোর্স খরচ করে। অপ্রয়োজনীয় বা অতিরিক্ত অ্যাটাচমেন্টগুলো সরিয়ে দিলে পারফরম্যান্স উন্নত হয় এবং বিদ্যুৎ খরচ কমে, বিশেষ করে মোবাইল প্ল্যাটফর্মগুলোতে।
কীভাবে অপ্টিমাইজ করবেন
জ্যামিতি-সম্পর্কিত পারফরম্যান্সের প্রতিবন্ধকতা শনাক্ত করতে RenderDoc , Android GPU Inspector বা অন্যান্য পারফরম্যান্স অ্যানালাইজারের মতো প্রোফাইলিং টুল এবং জিপিইউ ডিবাগার ব্যবহার করুন।
- প্রকৃত ব্যবহার যাচাই করুন: এমন কোনো ড্র কল বা শেডার আছে কি যা অ্যাটাচমেন্টে লিখছে বা সেখান থেকে পড়ছে?
- ফ্রেম আউটপুট বিশ্লেষণ করুন: সংযুক্তিটি চূড়ান্ত ছবিতে অবদান রাখছে কিনা তা নির্ধারণ করতে
RenderDocবা তুলনীয় ইউটিলিটি ব্যবহার করুন। - ক্ষণস্থায়ী বা ডামি সংযুক্তি বিবেচনা করুন: যে অস্থায়ী ডেটার জন্য স্থায়ী সংরক্ষণের প্রয়োজন নেই, তার জন্য ক্ষণস্থায়ী সংযুক্তি বা 'ডোন্ট কেয়ার' স্টোর অপারেশন ব্যবহার করা উচিত।
শেডার নির্ভুলতা অপ্টিমাইজ করুন
শেডারের মধ্যে অতিরিক্ত উচ্চ প্রিসিশন (যেমন, mediump বা lowp- এর পরিবর্তে highp ) ব্যবহার করলে জিপিইউ-এর কাজের চাপ, বিদ্যুৎ খরচ এবং রেজিস্টারের উপর চাপ বাড়ে, বিশেষ করে মোবাইল জিপিইউ-এর ক্ষেত্রে। ভ্যারিয়েবলগুলোর (যেমন, পজিশন, কালার, ইউভি) জন্য সর্বনিম্ন উপযুক্ত প্রিসিশন ব্যবহার করে, আপনি দৃশ্যমান কোনো প্রভাব ছাড়াই পারফরম্যান্স উন্নত করতে পারেন।

কীভাবে অপ্টিমাইজ করবেন
জ্যামিতি-সম্পর্কিত পারফরম্যান্সের প্রতিবন্ধকতা শনাক্ত করতে RenderDoc, Android GPU Inspector বা অন্যান্য পারফরম্যান্স অ্যানালাইজারের মতো প্রোফাইলিং টুল এবং জিপিইউ ডিবাগার ব্যবহার করুন।
শেডার কোড পর্যালোচনা করুন: শেডার ভেরিয়েবলগুলো মূল্যায়ন করুন এবং নিশ্চিত করুন যে উচ্চ প্রিসিশন শুধুমাত্র প্রয়োজনের ক্ষেত্রেই ব্যবহৃত হয়, যেমন ডেপথ বা স্ক্রিন-স্পেস গণনার জন্য। রঙ, ইউভি কোঅর্ডিনেট বা যেসব মানের জন্য উচ্চ প্রিসিশনের প্রয়োজন নেই, সেগুলোর জন্য মাঝারি বা নিম্ন প্রিসিশন ব্যবহার করুন।
জিপিইউ ডিবাগার ব্যবহার করুন: রেন্ডারডক (RenderDoc) বা মোবাইল জিপিইউ প্রোফাইলার (যেমন, এজিআই, মালি/জিপিইউ ইন্সপেক্টর)-এর মতো ডায়াগনস্টিক ইউটিলিটিগুলো প্রিসিশন সমস্যার সাথে সম্পর্কিত রেজিস্টারের অতিরিক্ত ব্যবহার বা শেডার স্টল শনাক্ত করে।

ব্যাক-ফেস কালিং সক্রিয় করুন
কঠিন বস্তুর ক্ষেত্রে, ক্যামেরার বিপরীত দিকে থাকা ত্রিভুজগুলো (পেছনের দিক) রেন্ডার করা প্রায়শই অপ্রয়োজনীয়।
কীভাবে অপ্টিমাইজ করবেন
VK_CULL_MODE_NONE ব্যবহার করলে তা পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে, কারণ এটি GPU-কে সামনের এবং পেছনের উভয় পৃষ্ঠ রেন্ডার করতে বাধ্য করে, যা রেন্ডারিংয়ের কাজের চাপ বাড়িয়ে দেয়।

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