2 ডি গ্রাফিক্স - স্প্রিটশিটগুলি কেন ব্যবহার করবেন?


62

আমি স্প্রিটশিট থেকে স্প্রিট কীভাবে রেন্ডার করব তার অনেকগুলি উদাহরণ আমি দেখেছি তবে আমি বুঝতে পারি না যে এটি 2 ডি গেমগুলিতে স্প্রাইটের সাথে কেন কাজ করার সবচেয়ে সাধারণ উপায়।

আমি কয়েকটি ডেমো অ্যাপ্লিকেশনগুলিতে 2 ডি স্প্রাইট রেন্ডারিং দিয়ে শুরু করেছি যে কোনও নির্দিষ্ট স্প্রাইট টাইপের জন্য প্রতিটি অ্যানিমেশন ফ্রেমের নিজস্ব টেক্সচার হিসাবে ডিল করে আমি তৈরি করেছি - এবং টেক্সচারের এই সংগ্রহটি একটি অভিধানে সঞ্চিত। এটি আমার পক্ষে কাজ করে বলে মনে হয় এবং আমার ওয়ার্কফ্লোটি বেশ ভালভাবে স্যুট করে, কারণ আমি আমার অ্যানিমেশনগুলিকে জিআইএফ / এমএনজি ফাইল হিসাবে তৈরি করি এবং তারপরে ফ্রেমগুলি পৃথক পিএনজিতে বের করি।

স্বতন্ত্র টেক্সচারের পরিবর্তে কোনও একক শীট থেকে রেন্ডারিংয়ের জন্য কোনও লক্ষণীয় পারফরম্যান্স সুবিধা রয়েছে কি? আধুনিক হার্ডওয়্যার যে কয়েক মিলিয়ন বহুভুজ স্ক্রিনে একশত বার স্ক্রিনে আঁকতে সক্ষম, এটি কি আমার 2 ডি গেমগুলির জন্য কী কিছু মাত্র 50 ডজন 100px আয়তক্ষেত্রের সাথে ডিল করে?

গ্রাফিক্স মেমরিতে একটি টেক্সচার লোড করা এবং এটি XNA এ প্রদর্শন করার বাস্তবায়ন বিশদটি বেশ বিমূর্ত বলে মনে হয়। আমি কেবল জানি যে টেক্সচারগুলি লোড হয়ে গেলে গ্রাফিক্স ডিভাইসে আবদ্ধ থাকে, তারপরে গেম লুপ চলাকালীন, ব্যাচগুলিতে টেক্সচারগুলি রেন্ডার হয়ে যায়। সুতরাং আমার পছন্দ পারফরম্যান্সকে প্রভাবিত করে কিনা তা আমার কাছে স্পষ্ট নয়।

আমার সন্দেহ হয় যে বেশিরভাগ 2 ডি গেম ডেভেলপাররা তাদের ব্যবহার করছে বলে মনে করার কিছু খুব ভাল কারণ রয়েছে, কেন আমি তা বুঝতে পারি না।


না এটি আপনার 50 টি বিজোড় স্প্রাইটের জন্য খুব বেশি গুরুত্ব দেয় না। তবে কি হারাতে হবে?
কম্যুনিস্ট হাঁস

উত্তর:


69

স্প্রিটশিট ব্যবহারের জন্য একটি শক্ত যুক্তি হ'ল গ্রাফিক কার্ডে উপলব্ধ টেক্সচারের সংখ্যা সীমাবদ্ধ হতে পারে। অতএব আপনার গ্রাফিক্স গ্রন্থাগারটি ক্রমাগত টেক্সচার সরিয়ে ফেলতে হবে এবং জিপিইউতে টেক্সচার পুনরায় বরাদ্দ করতে হবে। এটি একবারে কেবল একটি বড় টেক্সচার বরাদ্দ করা আরও বেশি দক্ষ।

এটিও বিবেচনা করুন যে টেক্সচার মাপগুলি সাধারণত 2 এর শক্তি So এটি কেবল গ্রাফিক্সের স্মৃতি নষ্ট করছে। সমস্ত স্প্রিটকে 1024x1024px টেক্সচারে ভাল প্যাক করুন, যা 20x10 স্প্রিটের অনুমতি দেয় এবং আপনি কেবল অনুভূমিকভাবে এবং উলম্বভাবে 24 পিক্সেল হারাবেন। অনেক সময় এমনকি বিভিন্ন আকারের স্প্রাইটগুলি একটি বিশাল স্প্রাইট-শিটের সাথে সংযুক্ত করে যতটা সম্ভব টেক্সচারটি ব্যবহার করতে পারেন।

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


1
ধন্যবাদ, আমি এই পয়েন্টগুলির মধ্যে কোনটিই বিবেচনা করি নি - আপনি কি জানেন যে উপলব্ধ টেক্সচারের সীমাটি সীমাবদ্ধতার কতটা? গ্রাফিক্সের স্পেসিফিকেশনে উল্লিখিত এই স্ট্যাটাসটি আমি কখনই দেখিনি - গ্রাফিক্স র্যামের পরিমাণটি কি মূলত সমান?
কলম্বো

সাধারণত সীমাটি হ'ল জিপিইউ মেমরি হবে। আমি ভেবেছিলাম পুরানো কার্ডগুলিতে টেক্সচারের সংখ্যার উপর কিছু বিধিনিষেধ ছিল তবে আমি এই পয়েন্টটি প্রমাণ করে এমন কোনও রেফারেন্স খুঁজে পাচ্ছি না।
bummzack

12
পরিমাণের কোনও সীমা না থাকলেও প্রচুর ছোট ছবি সরিয়ে নেওয়ার জন্য বাস-ট্র্যাফিক এক (বা কয়েকটি) বড় স্থানান্তর (গুলি) এর মতো দক্ষ নয়।
মোরদাচাই

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

জমিন সংমিশ্রণ যুক্ত করার ফলে যে কোনও স্ল্যাক স্পেসকে খুব সামান্য পরিমাণে ওভারহেডে পরিণত করা হবে, তার সর্বোপরি
জো প্লান্ট

36

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

এটি স্থান বাঁচাতেও সহায়তা করতে পারে তবে স্প্রিটশিটে প্রথমে আপনার প্যাকিংটি নির্ভর করে।


2
+1 কলগুলি ছোঁয়া। (এমন কিছু যা আমি স্বীকৃত উত্তরে দেখতে পেলাম না)
মাইকেল কলম্যান

11

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


2
এটি অবশ্যই গুরুত্বপূর্ণ। গ্রাফিক্স হার্ডওয়্যারটি অল্প সংখ্যক বিশদ মডেলের (যেমন, অক্ষর) জন্য বহুভুজ টান দেওয়ার দিকে অনুকূলিত হয়েছে কারণ বেশিরভাগ গেমগুলি সেদিকেই ঝুঁকছে। ফলাফলটি হ'ল প্রতিটি মাত্র কয়েক ডজন ড্র কলগুলিতে আপনাকে যথাসময়ে বহু বহুভুজ চাপ দেওয়া দরকার। গেম ইঞ্জিনগুলি যেগুলি শহরের মতো বড় দৃশ্যের রেন্ডার করে কলগুলি হ্রাস করার জন্য প্রায়শই ফ্লাইতে একাধিক টেক্সচার যুক্ত করে।
স্লোগান দিন

আমি স্পষ্টভাবে ভাবছি যে টেক্সচার ইউ, ভি ম্যাপিং অনেকগুলি 3 ডি হার্ডওয়্যারে প্লাস বিট ব্লিটিং অপারেশনগুলি স্প্রাইট শীট থেকে উপকৃত হয়।
জো প্লান্ট

7

পারফরম্যান্স বিবেচনার পাশাপাশি, শিল্প তৈরি করার সময় স্প্রাইট শিটগুলি ব্যবহার করা যায়; প্রতিটি অক্ষর তার নিজস্ব শীটে থাকতে পারে এবং আপনি কেবল চারদিকে স্ক্রোল করে সমস্ত ফ্রেম দেখতে পাবেন। এটি আমাকে সমস্ত ফ্রেম জুড়ে ধারাবাহিক চেহারা রাখতে সহায়তা করে।

অতিরিক্তভাবে, আমি AS3 তে কোড করি এবং প্রতিটি চিত্র ফাইলের জন্য পৃথক এম্বেড নির্দেশ প্রয়োজন। আমি পৃথক রিসোর্স ক্লাস ব্যবহার করছি এমনকী, সমস্ত ফ্রেমের জন্য এম্বেডের চেয়ে 24 টি এম্বেডের চেয়ে সম্পূর্ণ স্প্রিটশিটের একক এম্বেড চাইতাম।


1
+1 টি। যদিও ওপি ফ্ল্যাশ ব্যবহার করছে না, এম্বেডিং বা লোড করা স্প্রিটশিটের পক্ষেও একটি বিষয়। এটি ওয়েবসভার থেকে সম্পদগুলি লোড করা হয় এমন ক্ষেত্রেও প্রাসঙ্গিক যেখানে 1 টি অনুরোধ কয়েকশত অনুরোধের (প্রতিটি "ফ্রেমের জন্য") এর চেয়ে বেশি পছন্দ করা হয়।
bummzack

অবশ্যই আপনি একটি অনলাইন গেমের জন্য সার্ভারের অনুরোধগুলি হ্রাস করতে চান। আমরা চিত্রগুলি একটি। এসডাব্লুএফ বা স্প্রিটশিটে রাখাই আরও ভাল কিনা তা বিবেচনা করেছি কারণ উভয়ই এই মূল লক্ষ্য অর্জন করে (আমরা শেষ পর্যন্ত সিদ্ধান্ত নিয়েছি যে স্প্রিটশিটগুলি আমাদের শিল্পীদের জন্য কম শ্রমনির্ভর)।
ধাঁধা দিচ্ছেন

7

এক্সএনএর সাথে স্প্রিটশিটগুলি ব্যবহার করার আরেকটি কারণ হ'ল এক্সবক্স ৩60০ বিকাশের সাথে আপনার প্রকল্পে থাকা ফাইলগুলির সংখ্যার সাথে ধীর মোতায়েন / লোড টাইমের একটি ज्ञিত সমস্যা রয়েছে। সুতরাং প্রচুর ছোট চিত্রের ফাইলকে একটি একক চিত্র ফাইলে একত্রিত করা এই সমস্যাটি মোকাবেলায় সহায়তা করবে।


5

আমি এখানে মেমরি / জিপিইউ উল্লেখ করতে যাচ্ছি না, যেহেতু এর মতো পর্যাপ্ত উত্তর রয়েছে।

পরিবর্তে, আপনি যেমন - এবং পরে কাজ করার সাথে সাথে এটি আপনার শিল্পকে পরিষ্কার করতে পারে। ওয়াক চক্রটি দেখতে 10 টি চিত্রের মধ্যে ঝাঁকুনির পরিবর্তে, আপনি একসাথে সমস্ত ফ্রেম দেখতে পাচ্ছেন। আপনি যদি এটি বিতরণ করতে চান, আপনি 10 এর পরিবর্তে কেবলমাত্র 1 ফাইল পেয়েছেন।

এবং তারপরে এটি আরও পরিষ্কার (একটি সাংগঠনিক দৃষ্টিকোণ থেকে) ক্যারেক্টারওয়াল.০1 এর মাধ্যমে চরিত্রওয়ালক 10 এর মধ্য দিয়ে শত্রু.পিএন, তারপরে ফিচারটিট্যাক0 1 থেকে ফিচারটিট্যাক0, এবং এটি এগিয়ে যায়।


4

গ্রাফিক্সের মেমরিটিতে ডিস্কে ফাইল সিস্টেমের মতো একটি ব্লাট আপ মেমরি পরিচালনা নেই ; ওপোসাইটটি হ'ল এটি সহজ এবং দ্রুত রাখা হয় ।

এ জাতীয় একটি সহজ এবং দ্রুত মেমরির ম্যানেজমেন্ট কেবল একটি একক দৈত্য 4096x4096 স্প্রাইট থাকার মতো হতে পারে যা এর প্রস্থ এবং / বা উচ্চতা অর্ধেক করে একাধিক ছোট স্প্রিটে কাটা হয়। (একই ধরণের 1-মাত্রিক মেমরি-পরিচালনা কৌশল রয়েছে তবে আমি নামটি ভুলে গিয়েছি)) অবশেষে, Defragmentation করাতে হবে।

রান-টাইমে এ জাতীয় মেমরি পরিচালনা এড়াতে , বিকাশকারীরা সংকলন সময়ে বা গ্রাফিক্সের ডেসিং-প্রক্রিয়া চলাকালীন স্বয়ংক্রিয়ভাবে একাধিক ছোট স্প্রিটের সাথে একক বৃহত স্প্রিটগুলি পূরণ করে।


3

এছাড়াও I / O অপারেশনগুলি ভুলে যাবেন না এটি সূচনা করার সময় আপনাকে রক্ষা করতে পারে। আপনি যদি কোনও সিডি ড্রাইভ থেকে লোড করছেন, প্রতিটি ফাইল অতিরিক্ত আই / ও কল, এবং এটি পেতে কিছুটা সময় নিতে পারে (আধুনিক এইচডিডি ফাইলটিতে প্রায় 15 এমএস, সিডি সম্ভবত 50-100 মিমি?)। কেবলমাত্র একটি ফাইল আনতে হবে এটি এটি আপনাকে প্রচুর আরম্ভের সময় সাশ্রয় করতে পারে। এটি যদি আপনার অ্যাপ্লিকেশন অন্য কিছু করে (যেমন জিপিইউর অপেক্ষায় থাকে) এর ক্ষেত্রে আপনার ওএসকে এই আই / ও ক্রিয়াকলাপগুলি ক্যাশে করার অনুমতি দেয়।


1
অন্য প্রান্তে আপনি যদি ফাইল সন্ধানের সমস্যার সমাধান করতে চান তবে আপনার সমস্ত স্প্রাইটগুলি কাস্টম ফর্ম্যাট ব্যবহার করে একটি একক ফাইলে প্যাক করতে পারে। বেশিরভাগ গেমস তা করে।
tigrou

0

অধিকতর পারফরম্যান্স দক্ষ হওয়া ব্যতীত আমি এটিকে আরও সহজ মনে করি। আর্ট তৈরির সময় আপনার চিত্রগুলি সর্বদা তাদের সীমার মধ্যে থাকে তা নিশ্চিত করার জন্য এটি অতিরিক্ত অতিরিক্ত কাজ প্রয়োজন তবে আপনি এই মুহুর্তে যে সমস্ত চিত্র নিয়ে কাজ করছেন তা দেখতে সক্ষম হওয়া অনেক সহজ।

আমার মতে এটি কোড করাও সহজ। আমার কাছে কেবল এই জাতীয় বস্তুর অ্যারে রয়েছে:

sheet = {
    img: (the actual image),
    rects: [
        {x:0, y:0, w:32, h:32},
        {x:32, y:0, w:32, h:32},
        {x:64, y:0, w:32, h:32}
    ]
};

sheets.push(sheet);

তারপরে প্রতিটি আইটেমের জন্য আমি এটিকে দুটি মান, পত্রক এবং রেকর্ড দেব। শীটটি বস্তুর অ্যারেতে সূচক হবে এবং সেই শিটটির পুনরায় সংস্থার অ্যারেতে রেকটটি সূচক হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.