মাইক্রোসফ্ট গেম ডেভলপমেন্টের জন্য সি # বৈশিষ্ট্য প্রয়োগ করার পরামর্শ দিচ্ছে?


26

আমি পেয়েছি যে কখনও কখনও আপনার সম্পত্তি প্রয়োজন যেমন:

public int[] Transitions { get; set; }

বা:

[SerializeField] private int[] m_Transitions;
public int[] Transitions { get { return m_Transitions; } set { m_Transitions = value; } }

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

আমি কি সর্বদা সার্বজনীন ক্ষেত্রগুলি ব্যবহার না করার জন্য ভিজ্যুয়াল স্টুডিওর পরামর্শগুলিকে অগ্রাহ্য করা ঠিক? (দ্রষ্টব্য যে আমরা int Foo { get; private set; }যেখানে ব্যবহার করি সেখানে লক্ষ্যযুক্ত ব্যবহারগুলি দেখানোর কোনও সুবিধা রয়েছে))

আমি সচেতন যে অকালীন অপটিমাইজেশন খারাপ, তবে আমি যেমন বলেছিলাম, গেমের বিকাশে আপনি যখন কিছুটা ধীরে ধীরে করেন না তখন যখন অনুরূপ প্রচেষ্টা এটি দ্রুত করতে পারে।


34
কোনও কিছু "ধীর" বিশ্বাস করার আগে সর্বদা একজন প্রোফাইলারের সাথে যাচাই করুন। আমাকে কিছু "ধীর" বলে দেওয়া হয়েছিল এবং প্রোফাইলার আমাকে বলেছিলেন যে এটি অর্ধেক সেকেন্ড হারাতে 500,000,000 বার চালানো হয়েছিল। যেহেতু এটি কোনও ফ্রেমে কয়েক শতাধিকবার কখনও চালিত হবে না, তাই আমি সিদ্ধান্ত নিয়েছি এটি অপ্রাসঙ্গিক।
আলমো

5
আমি খুঁজে পেয়েছি যে এখানে কিছুটা বিমূর্ততা রয়েছে এবং সেখানে নিম্ন-স্তরের অপ্টিমাইজেশানগুলি আরও ব্যাপকভাবে প্রয়োগ করতে সহায়তা করে। উদাহরণস্বরূপ, আমি বিভিন্ন ধরণের লিঙ্ক-তালিকাগুলি ব্যবহার করে অসংখ্য সমতল সি প্রকল্প দেখেছি, যা সংকীর্ণ অ্যারেগুলির সাথে তুলনায় ভয়ঙ্করভাবে ধীর হয় (যেমন: সমর্থন ArrayList)। এটি কারণ সি এর কোন জেনেরিকস নেই এবং এই সি প্রোগ্রামাররা সম্ভবত পুনরায় ArrayListsআকার পরিবর্তনকারী অ্যালগরিদমের জন্য একই রকমের চেয়ে বারবার লিঙ্ক-তালিকাগুলি পুনরায় প্রয়োগ করা সহজতর বলে মনে করেছিল । আপনি যদি একটি ভাল নিম্ন-স্তরের অপ্টিমাইজেশান নিয়ে আসেন তবে এটি আবদ্ধ করুন!
হেগেল 5000 5000

3
@ অলমো আপনি কি একই যুক্তি 10,000 টি বিভিন্ন জায়গায় সংযুক্ত অপারেশনগুলিতে প্রয়োগ করেন? কারণ এটি শ্রেণীর সদস্য অ্যাক্সেস। যৌক্তিকভাবে আপনার সেই শ্রেণীর অপ্টিমাইজেশনের সিদ্ধান্ত নেওয়ার আগে 10 কে দ্বারা পারফরম্যান্স ব্যয়টি গুণ করা উচিত। আপনার গেমের পারফরম্যান্স যখন অর্ধ সেকেন্ড নয়, কখন নষ্ট হয়ে যাবে তার জন্য 0.5 মিমি উন্নত নিয়ম। আপনার বক্তব্যটি এখনও দাঁড়িয়ে আছে, যদিও আমি মনে করি না যে সঠিক ক্রিয়াটি আপনি যতটা পরিষ্কার করেছেন তেমন পরিষ্কার।
পিয়োজো

5
আপনার কাছে 2 টি ঘোড়া রয়েছে। তাদের রেস।
মাস্ট

@ পিয়োজো আমি না। কিছু চিন্তা অবশ্যই সবসময় এই জিনিসগুলির মধ্যে .োকা উচিত। আমার ক্ষেত্রে এটি ইউআই কোডের লুপগুলির জন্য ছিল। একটি ইউআই উদাহরণ, কয়েকটি লুপ, কয়েকটি পুনরাবৃত্তি। রেকর্ডের জন্য, আমি আপনার মন্তব্য upvated। :)
অলমো

উত্তর:


44

তবে আমার ধারণাটি হ'ল গেম ডেভলপমেন্টে, অন্যথায় করার কারণ না থাকলে, সবকিছু যত দ্রুত সম্ভব হওয়া উচিত।

অগত্যা। অ্যাপ্লিকেশন সফ্টওয়্যারটির মতোই, একটি গেমের মধ্যে কোড রয়েছে যা পারফরম্যান্স-সমালোচনামূলক এবং কোডটি নয়।

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

কোডটি যদি প্রতি কয়েক সেকেন্ডে একবার কার্যকর করা হয়, তবে পঠনযোগ্যতা এবং রক্ষণাবেক্ষণ দক্ষতার চেয়ে অনেক বেশি গুরুত্বপূর্ণ।

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

শৈলীতে তুচ্ছ বৈশিষ্ট্যগুলির সাথে int Foo { get; private set; }আপনি বেশ নিশ্চিত হতে পারেন যে সংকলক সম্পত্তি র‌্যাপারটিকে অপ্টিমাইজ করবে। কিন্তু:

  • যদি আপনার বাস্তবিক প্রয়োগ থাকে তবে আপনি আর নিশ্চিত হতে পারবেন না। যে বাস্তবায়ন যত জটিল, কম্পাইলার এটিকে ইনলাইন করতে সক্ষম হবে কম likely
  • সম্পত্তি জটিলতা আড়াল করতে পারে। এটি একটি দ্বি-তরোয়াল তরোয়াল। একদিকে এটি আপনার কোডকে আরও পঠনযোগ্য এবং পরিবর্তনযোগ্য করে তোলে। তবে অন্যদিকে, অন্য বিকাশকারী যিনি আপনার শ্রেণীর কোনও সম্পত্তি অ্যাক্সেস করেন তারা হয়ত ভাবেন যে তারা কেবলমাত্র একটি একক ভেরিয়েবল অ্যাক্সেস করছেন এবং বুঝতে পারবেন না যে আপনি আসলে এই সম্পত্তিটির পিছনে কতটা কোড লুকিয়ে রেখেছেন। যখন কোনও সম্পত্তি কম্পিউটারের ব্যয়বহুল ব্যয়বহুল হয়ে উঠতে শুরু করে, তখন আমি এটিকে একটি স্পষ্ট GetFoo()/ SetFoo(value)পদ্ধতিতে রিফ্যাক্টর করি : ইঙ্গিত দেওয়ার জন্য যে পর্দার আড়ালে আরও অনেক কিছু ঘটছে। (বা অন্যদের ইঙ্গিতটি পাওয়া যায় কিনা তা আমার আরও নিশ্চিত হওয়া দরকার: CalculateFoo()/ SwitchFoo(value))

কাঠামোর ধরণের কেবল অ-পঠনযোগ্য পাবলিক ফিল্ডের মধ্যে একটি ক্ষেত্র অ্যাক্সেস করা দ্রুত, এমনকি যদি ক্ষেত্রটি কোনও কাঠামোর মধ্যে থাকা কাঠামোর মধ্যেও থাকে তবে শর্ত থাকে যে শীর্ষ স্তরের অবজেক্টটি হয় কেবল না-পঠন শ্রেণি ক্ষেত্র বা একটি অ-পঠনযোগ্য মুক্ত-স্থায়ী ভেরিয়েবল। যদি এই শর্তগুলি প্রয়োগ হয় তবে কাঠামোগুলি প্রতিকূলতাকে প্রভাবিত না করে যথেষ্ট বড় হতে পারে। এই প্যাটার্নটি ভঙ্গ করা কাঠামোর আকারের সমানুপাতিক কারণ হবে।
supercat

5
"তারপরে আমি এটিকে একটি স্পষ্ট গেটফু () / সেটফু (মান) পদ্ধতিতে রিফ্যাক্টর করতে চাই:" - ভাল কথা, আমি ভারী ক্রিয়াকলাপগুলি সম্পত্তি থেকে বের করে পদ্ধতিগুলিতে স্থানান্তরিত করি।
মার্ক রজার্স

ইউনিটির 3 ডি সংকলকটি আপনার উল্লিখিত অপটিমাইজেশনটি (আইএল 2 সিপিপি এবং মনোতে অ্যান্ড্রয়েডের জন্য তৈরি করে) তা নিশ্চিত করার কোনও উপায় আছে?
পিয়োজো

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

9

সন্দেহ হলে সেরা অভ্যাস ব্যবহার করুন use

আপনি সন্দেহ হয়।


এটাই ছিল সহজ উত্তর। বাস্তবতা অবশ্যই আরও জটিল।

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

দ্বিতীয়ত, পৌরাণিক কাহিনীটি রয়েছে যে প্রতি একক জিনিসকে যত তাড়াতাড়ি করা সম্ভব তা প্রোগ্রামকে দ্রুত চালিত করে তোলে। বাস্তবে, বাধা চিহ্নিতকরণ এবং অপ্টিমাইজ করা হ'ল যা একটি প্রোগ্রামকে দ্রুত করে তোলে এবং কোডটি বজায় রাখা এবং সংশোধন করা সহজ তবে এটি করা খুব সহজ / সস্তা / দ্রুত কাজ; অত্যন্ত অপ্টিমাইজড কোড বজায় রাখা এবং সংশোধন করা শক্ত। এটা যে অনুসরণ করে চূড়ান্ত অনুকূলিত প্রোগ্রামগুলি লিখতে গেলে আপনাকে চরম কোড অপ্টিমাইজেশন যতবার প্রয়োজন ততবার এবং যত কমই সম্ভব ব্যবহার করতে হবে।

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

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


2

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

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

আমি পেশাদার সি # প্রোগ্রামার হিসাবে আমার 10 বছরে সম্পত্তিগুলি ব্যবহার করার প্রাথমিক কারণটি হ'ল অন্যান্য প্রোগ্রামাররা আমাকে বলেছিল যে আমি কোডিং মানের সাথে রাখছি না stop এটি একটি ভাল ট্রেড অফ ছিল, সম্পত্তি ব্যবহার না করার জন্য খুব কমই খুব ভাল কারণ ছিল।


2

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

তার কারণে, আপনি প্রায়শই ভেক্টর এবং ম্যাট্রিক্স ধরণের বৈশিষ্ট্যযুক্ত নয় তবে নগ্ন ক্ষেত্রগুলি সহ আরও ভাল পারফরম্যান্স পাবেন।


সেরা অনুশীলনগুলি টিকা তৈরি করছে না। কিছু কার্গো ধর্মবিশ্বাস সত্ত্বেও, সাধারণভাবে সর্বোত্তম অনুশীলনগুলি একটি ভাল কারণে রয়েছে।

এই ক্ষেত্রে, আমাদের একটি দম্পতি রয়েছে:

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

  • যদি আপনার ধরণের ক্ষেত্রগুলির সমস্ত সম্ভাব্য মানগুলি বৈধ রাষ্ট্র না হয় তবে আপনি সেগুলি ক্লায়েন্ট কোডে প্রকাশ করতে চাইবেন না যে কোডটি এটি পরিবর্তন করে ify সুতরাং, যদি মানগুলির সংমিশ্রণগুলি অবৈধ হয় তবে আপনি ক্ষেত্রগুলি ব্যক্তিগত (বা অভ্যন্তরীণ) রাখতে চান।

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


হ্যাঁ, আন্তঃ শিল্প কী করা হচ্ছে তা দেখছে done তবে, আপনার কি সেরা অনুশীলনের বিরুদ্ধে যাওয়ার প্রেরণা রয়েছে? বা আপনি কেবল সেরা অভ্যাসের বিরুদ্ধে যাচ্ছেন - কোডটি কারণটিকে আরও শক্ত করে তুলছেন - কারণ অন্য কেউ এটি করেছে? আহ, যাইহোক, "অন্যরা এটি করে" আপনি কীভাবে একটি কার্গো কাল্ট শুরু করেন।


তো ... আপনার খেলা কি ধীর গতিতে চলছে? আপনি কী করতে পারেন তা অনুমান করার পরিবর্তে বাধাটি বের করার জন্য সময় ব্যয় করা এবং এটি সমাধান করা ভাল। আপনি আশ্বস্ত করতে পারেন যে সংকলক প্রচুর পরিমাণে অপ্টিমাইজেশন করবে, কারণ, সম্ভবত আপনি ভুল সমস্যার দিকে তাকাচ্ছেন।

ফ্লিপ দিকে, আপনি কী শুরু করবেন তা সিদ্ধান্ত নিচ্ছেন তবে ক্ষেত্র বনাম বৈশিষ্ট্যগুলির মতো ছোট বিবরণ সম্পর্কে চিন্তা করার পরিবর্তে আপনার প্রথমে কোন অ্যালগরিদম এবং ডেটা স্ট্রাকচার সম্পর্কে চিন্তা করা উচিত।


অবশেষে, আপনি কি সেরা অনুশীলনের বিরুদ্ধে গিয়ে কিছু উপার্জন করেন?

আপনার মামলার বিবরণের জন্য (অ্যান্ড্রয়েডের জন্য ityক্য এবং মনো), )ক্য কি রেফারেন্সের দ্বারা মান গ্রহণ করে? যদি এটি না হয় তবে এটি মানগুলি অনুলিপি করবে, সেখানে কোনও কার্য সম্পাদন হবে না।

যদি তা হয়, আপনি যদি কোনও ডেটা এমন কোনও এপিআই-এ পাঠাচ্ছেন যা রেফ নেয়। ফিল্ডটি সর্বজনীন করে তোলা কি অর্থবোধ করে না আপনি টাইপটি সরাসরি API এ কল করতে সক্ষম করতে পারেন?

হ্যাঁ, অবশ্যই, খালি ক্ষেত্রের সাথে স্ট্রাক্ট ব্যবহার করে আপনি করতে পারেন এমন অপ্টিমাইজেশন হতে পারে। উদাহরণস্বরূপ, আপনি পয়েন্টার Span<T> বা এ জাতীয় দ্বারা তাদের অ্যাক্সেস করতে পারেন । এগুলি মেমোরিতেও কমপ্যাক্ট থাকে, যাতে তাদেরকে নেটওয়ার্কের মাধ্যমে পাঠাতে সিরিয়ালাইজ করা সহজ হয় বা স্থায়ী সঞ্চয়স্থানে রাখা হয় (এবং হ্যাঁ সেগুলি অনুলিপি হয়)।

এখন, আপনি কি সঠিক অ্যালগরিদম এবং কাঠামো বেছে নিয়েছেন, যদি সেগুলি কোনও বাধা হয়ে দাঁড়ায়, তবে আপনি এটি ঠিক করার সর্বোত্তম উপায় কোনটি ... আপনি নগ্ন ক্ষেত্রগুলির সাথে স্ট্রাক্ট হতে পারে এবং নাও তা স্থির করেন। এটি কখন এবং কখন ঘটে তা নিয়ে আপনি উদ্বেগ করতে সক্ষম হবেন। এদিকে আপনি আরও গুরুত্বপূর্ণ বিষয়ে যেমন উদ্বিগ্ন হয়ে উঠতে পারেন যেমন একটি ভাল বা মজাদার গেমটি খেলার যোগ্য।


1

... আমার ধারণাটি হ'ল গেম ডেভলপমেন্টে, অন্যথায় করার কারণ না থাকলে, সবকিছু যত দ্রুত সম্ভব হওয়া উচিত।

:

আমি সচেতন যে অকালীন অপটিমাইজেশন খারাপ, তবে আমি যেমন বলেছিলাম, গেমের বিকাশে আপনি যখন কিছুটা ধীরে ধীরে করেন না তখন যখন অনুরূপ প্রচেষ্টা এটি দ্রুত করতে পারে।

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

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

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


1

এর মতো বেসিক স্টাফগুলির জন্য, সি # অপ্টিমাইজারটি যাইহোক এটি ঠিক এখন পেতে চলেছে। যদি আপনি এটি নিয়ে চিন্তিত হন (এবং আপনি যদি আপনার কোডের 1% এরও বেশি এটি নিয়ে চিন্তা করেন তবে আপনি এটি ভুল করছেন ) আপনার জন্য একটি বৈশিষ্ট্য তৈরি হয়েছিল attrib বৈশিষ্ট্যটি [MethodImpl(MethodImplOptions.AggressiveInlining)]কোনও পদ্ধতিতে অন্তর্ভুক্ত হওয়ার সুযোগটি বাড়িয়ে তোলে (সম্পত্তি প্রাপ্তি এবং সেটটাররা পদ্ধতি) methods


0

ক্ষেত্রের চেয়ে কাঠামোর ধরণের সদস্যদের সম্পত্তি হিসাবে প্রকাশ করার ফলে প্রায়শই দুর্বল কর্মক্ষমতা এবং শব্দার্থবিজ্ঞানের ফল পাওয়া যায়, বিশেষত এমন ক্ষেত্রে যেখানে কাঠামোগুলি বাস্তবে কাঠামোগুলি হিসাবে বিবেচিত হয় "কৌতূহলী বস্তু" হিসাবে না।

.NET- এর একটি কাঠামো হ'ল নল-টেপযুক্ত ক্ষেত্রগুলির সংগ্রহ এবং এটি কোনও উদ্দেশ্যে ইউনিট হিসাবে বিবেচনা করা যেতে পারে। .NET ফ্রেমওয়ার্কটি কাঠামোগত শ্রেণীর অবজেক্টগুলির মতো একইভাবে ব্যবহার করার মঞ্জুরি দেওয়ার জন্য ডিজাইন করা হয়েছে এবং এটি সুবিধাজনক হতে পারে এমন সময় রয়েছে।

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

কাঠামোগত ব্যবহার করার সময় মনে রাখা সবচেয়ে বড় নীতিগুলি হ'ল:

  1. মান অনুসারে কাঠামো পাস বা ফিরিয়ে দেবেন না অন্যথায় তাদের অকারণে অনুলিপি করার কারণ হবে না।

  2. # 1 নীতিটি মেনে চললে বড় স্ট্রাকচারগুলি ছোট ছোটগুলির পাশাপাশি সঞ্চালন করবে।

যদি অ্যাজ নামের Alphablob২ public টি সর্বজনীন intক্ষেত্র সমন্বিত একটি স্ট্রাকচার এবং কোনও সম্পত্তি প্রাপ্তি abযা এর aএবং bক্ষেত্রগুলির যোগফল প্রদান করে , তবে প্রদত্ত Alphablob[] arr; List<Alphablob> list;, কোডটি int foo = arr[0].ab + list[0].ab;ক্ষেত্রগুলি aএবং bএর arr[0]পড়তে হবে, list[0]তবে এটি সমস্ত 26 টি ক্ষেত্র পড়তে হবে যদিও এটি হবে তাদের দু'টি বাদে সব উপেক্ষা করুন। যদি কোনও জেনেরিক তালিকার মতো সংগ্রহ থাকতে চায় যা কোনও কাঠামোর সাথে দক্ষতার সাথে কাজ করতে পারে alphaBlobতবে একটিকে সূচীদিত গেটরটি একটি পদ্ধতির সাথে প্রতিস্থাপন করা উচিত:

delegate ActByRef<T1,T2>(ref T1 p1, ref T2 p2);
actOnItem<TParam>(int index, ActByRef<T, TParam> proc, ref TParam param);

যা তখন প্রার্থনা করবে proc(ref backingArray[index], ref param);। এমন একটি সংকলন দেওয়া হয়েছে, যদি কেউ এর sum = myCollection[0].ab;সাথে প্রতিস্থাপন করে

int result;
myCollection.actOnItem<int>(0, 
  ref (ref alphaBlob item, ref int dest)=>dest = item,
  ref result);

যা alphaBlobসম্পত্তি প্রাপ্তিতে ব্যবহৃত হবে না এমন অংশগুলির অনুলিপি করার প্রয়োজন এড়াবে। যেহেতু পাস হওয়া প্রতিনিধি তার refপরামিতিগুলি ব্যতীত অন্য কোনও কিছু অ্যাক্সেস করতে পারে না , সংকলক স্থির প্রতিনিধি পাস করতে পারে।

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


হাই, আপনি কি ভুল উত্তরটিতে উত্তর পোস্ট করেছেন?
পিয়োজো

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

@ পিজিও: আমার সম্পাদনা কি বিষয়গুলিকে আরও পরিষ্কার করে দেয়?
সুপারকেট

"তালিকার সমস্ত 26 টি ক্ষেত্র [0] পড়তে হবে যদিও এটি তাদের দুটি ব্যতীত অন্যকে উপেক্ষা করবে।" কি? তুমি কি নিশ্চিত? আপনি কি এমএসআইএল পরীক্ষা করেছেন? সি # প্রায় সবসময় রেফারেন্সের মাধ্যমে শ্রেণির ধরণের পাস করে।
pjc50

@ পিজেসি 50: কোনও সম্পত্তি পড়লে মান দ্বারা ফলাফল পাওয়া যায়। যদি এর জন্য সূচকযুক্ত প্রাপ্ত listএবং সম্পত্তি প্রাপ্তকারী abউভয়ই ইন-লাইনেড থাকে তবে একজন জেআইটারের পক্ষে এটি সনাক্ত করা সম্ভব যে কেবল সদস্য aএবং bপ্রয়োজনীয়, তবে আমি জেআইটারের কোনও সংস্করণ আসলে এ জাতীয় কাজগুলি সম্পর্কে অবগত নই।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.