সি # এর মতো পরিচালিত ভাষার সাথে গেম লেখার সময় সাধারণ সমস্যাগুলি কী কী? [বন্ধ]


66

সি # এর মতো পরিচালিত ভাষার সাথে পিসির জন্য গেমগুলি লেখার সময় আপনি কোন সমস্যার মুখোমুখি হয়েছিলেন এবং কীভাবে আপনি সেগুলি সমাধান করেছেন?


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

31
@ ক্রিস: দৃr়ভাবে একমত নয়: প্রশ্নটিতে গেমগুলির উল্লেখ করা হয়েছে! প্রতি 16 মিনিটে আপনাকে যখন আপডেট আপডেট করতে হয় তখন যে সমস্যার মুখোমুখি হন সেগুলি আপনি বেশিরভাগ ডেস্কটপ অ্যাপ্লিকেশনগুলিতে যা পান তা তার চেয়ে খুব আলাদা।
অ্যান্ড্রু রাসেল

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

@ পোলোকয়োট: কেবল সি # সম্পর্কে জিজ্ঞাসা করার জন্য আমি প্রশ্নে পরিবর্তিত হয়েছি। এছাড়াও, নির্দিষ্ট কোন প্ল্যাটফর্ম উল্লেখ না করায় এটি পিসি সম্পর্কে।
মাইকেল ক্লেমেন্ট

@ মিশেল ধরে নেওয়া প্ল্যাটফর্মটি একটি বিপজ্জনক ধারণা, কারণ তারা বাস্তবায়নে এতটা পৃথক, বিশেষত উইন্ডোজটির উল্লেখ করা ভাল এবং "লাইক" এবং "জাভা" পুরোপুরি বাদ দেওয়া ভাল would
পলিকোয়েট

উত্তর:


69

আমি জাভা সম্পর্কে অনেক কিছু জানি না, সুতরাং এটি একটি নেট নেটওয়ার্কের দৃষ্টিকোণ থেকে।

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

আবর্জনা মোকাবেলার জন্য এখানে কিছু পরামর্শ He বাস্তবে এগুলির বেশিরভাগ সম্পর্কে আপনার চিন্তা করার দরকার নেই, তবে সেগুলি একদিন কার্যকর হতে পারে।

  • বিষয়বস্তু GC.GetTotalMemory()স্ক্রিনে আঁকুন । এটি আপনাকে আপনার গেমের কতগুলি বরাদ্দ করা বাইট দেয় তার একটি আনুমানিক পরিমাণ দেয়। যদি এটি খুব কমই চলে, আপনি ঠিকঠাক করছেন। যদি এটি দ্রুত চলে যায় তবে আপনার সমস্যা আছে।
  • আপনার সমস্ত হিপ অবজেক্টসকে সামনে বরাদ্দ দেওয়ার চেষ্টা করুন । গেমটি শুরুর আগে আপনি যদি সমস্ত কিছু বরাদ্দ না করেন, প্রতিবার আপনি একটি মেগা বরাদ্দ দিয়েছিলেন, আপনার স্টল যাচ্ছে। কোনও বরাদ্দ নেই, কোনও সংগ্রহ নেই। এর মত সহজ.
  • লোড করার পরে, জিসি.কলেক্ট () কল করুন। আপনি যদি জানেন যে আপনার বেশিরভাগ বড় বরাদ্দের উপায় শেষ না হয় তবে সিস্টেমটি আপনাকে জানাতে পারলে খুব ভাল।
  • GC.Collect()প্রতিটি ফ্রেম কল করবেন না । আপনার আবর্জনা এবং এই সমস্ত কিছুর উপরে রেখে এটি একটি ভাল ধারণা বলে মনে হতে পারে, তবে আবর্জনা সংগ্রহের চেয়ে জঞ্জাল সংগ্রহের চেয়ে খারাপ বিষয় কেবল মনে রাখবেন।
  • আপনার আবর্জনা কোথা থেকে আসছে তা দেখুন। কিছু সাধারণ কারণ রয়েছে যেমন ব্যবহারের পরিবর্তে স্ট্রাকটেনেটিং স্ট্রিংগুলি StringBuilder(সাবধান, StringBuilderএকটি যাদুর বুলেট নয়, এবং এখনও বরাদ্দের কারণ হতে পারে! এর অর্থ একটি স্ট্রিংয়ের শেষে একটি সংখ্যার যোগ করার মতো সাধারণ ক্রিয়াকলাপগুলি বিস্ময়কর পরিমাণে আবর্জনা তৈরি করতে পারে) বা ইন্টারফেস foreachব্যবহার করে এমন সংগ্রহগুলির উপরে লুপগুলি ব্যবহার করা IEnumerableআপনাকে জেনেও আবর্জনা তৈরি করতে পারে (উদাহরণস্বরূপ, foreach (EffectPass pass in effect.CurrentTechnique.Passes)একটি সাধারণ)
  • মেমরিটি কোথায় বরাদ্দ করা হচ্ছে তা নির্ধারণের জন্য সিএলআর মেমরি প্রোফাইলারের মতো সরঞ্জামগুলি ব্যবহার করুন । এই সরঞ্জামটি কীভাবে ব্যবহার করবেন সে সম্পর্কে প্রচুর টিউটোরিয়াল রয়েছে।
  • গেমপ্লে চলাকালীন আপনার বরাদ্দ কোথায় তা আপনি যখন জানেন, আপনি বরাদ্দ গণনা কমাতে পুলিং অবজেক্টের মতো কৌশল ব্যবহার করতে পারেন কিনা তা দেখুন।
  • অন্য সমস্ত কিছু যদি ব্যর্থ হয় তবে আপনার সংগ্রহগুলি দ্রুত চালিত করুন! কমপ্যাক্ট ফ্রেমওয়ার্কের জিসি আপনার কোডের প্রতিটি রেফারেন্স অনুসরণ করে কোন বস্তুগুলি আর ব্যবহার করছে না তা নির্ধারণ করতে। আপনার কোডটি কম রেফারেন্স ব্যবহার করুন!
  • IDisposableঅব্যবহৃত সংস্থান আছে এমন ক্লাসে ব্যবহার করতে ভুলবেন না । আপনি এগুলি মেমরি পরিষ্কার করতে ব্যবহার করতে পারেন জিসি নিজেকে মুক্ত করতে পারে না।

অন্য জিনিসটি ভেবে ভাসমান পয়েন্টের পারফরম্যান্স। .NET JITer প্রসেসর-নির্দিষ্ট অপ্টিমাইজেশনের একটি মোটামুটি পরিমাণ কাজ করে, এটি আপনার ভাসমান পয়েন্ট গণিতের গতি বাড়ানোর জন্য এসএসই বা অন্য কোনও সিমডি নির্দেশিকা সেট ব্যবহার করতে পারে না। এটি গেমসের জন্য সি ++ এবং সি # এর মধ্যে বেশ বড় গতির পার্থক্য দেখা দিতে পারে। যদি আপনি মনো ব্যবহার করেন তবে তাদের কিছু বিশেষ সিমডি গণিতের গ্রন্থাগার রয়েছে যা আপনি নিতে পারেন।


সম্পূর্ণ সম্মত হন। "কম" প্ল্যাটফর্মগুলিতে আবর্জনা সংগ্রহকারী প্রয়োগগুলি সম্পূর্ণ আবর্জনা বলে মনে হচ্ছে।
ক্রিস্ক

"সামনের দিকে হিপ অবজেক্টগুলি বরাদ্দ করা" সম্পর্কে আপনার বক্তব্যটি সম্পর্কে ভাল পোস্ট তবে আমি মান ধরণের সত্যতা
জাস্টিন

সেখানে দুর্দান্ত পয়েন্ট, যখন আপনি কোডটিকে সর্বোত্তম করার জন্য আপনার প্ল্যাটফর্মটি বোঝার জন্য এটি যথার্থ মূল্যবান। মানের ধরণ / রেফারেন্সের ধরণ সম্পর্কে এটি আসলেই কোনও মন্তব্য নয়, কোনও দীর্ঘজীবী বস্তু স্ট্যাকের মধ্যে থাকবে না। এটি আপনার লোড সময়ে যতটা সম্ভব বরাদ্দ করা সম্ভব হয়েছিল তা নিশ্চিত করার বিষয়ে সত্যতা নিশ্চিত করা আপনি গেম খেলার সময় সেই যাদুকরী 1 এমবি বাধাটিকে আঘাত করবেন না। যে সমস্ত। নেট বাস্তবায়ন যেগুলি এক্সএএনএর লক্ষ্যে একটি ঝরঝরে গ্যারান্টি রয়েছে, সময় মতো একসাথে বরাদ্দকৃত বস্তুগুলি স্থানের কাছাকাছি থাকবে, যা পারফেক্ট জন্য দুর্দান্ত হতে পারে।
Cubed2D

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

10

একটি টিপিকাল পারফরম্যান্সের ক্ষতি গেমটির নকশা / বিকাশে আবর্জনা সংগ্রহকারীকে বিবেচনা করছে না। অত্যধিক আবর্জনা উত্পাদনের ফলে গেমটিতে "হিক্কার" সৃষ্টি হতে পারে, যা যখন জিসি যথেষ্ট দীর্ঘ সময় ধরে চালায় তখন ঘটে।

সি # এর জন্য, মান অবজেক্ট এবং "ব্যবহার" স্টেটমেন্ট ব্যবহার করা জিসি থেকে চাপকে হ্রাস করতে পারে।


3
অতিরিক্তভাবে আপনি আবর্জনা / নিখরচায় ভারী লুপ শেষ করেছেন বা যদি আপনি অতিরিক্ত চক্র পেয়ে থাকেন তবে আবর্জনা সংগ্রাহককে স্পষ্টভাবে চলতে বলতে পারেন।
ব্যারেটজে

16
usingবিবৃতি গার্বেজ কালেকশন সঙ্গে কিছুই করার আছে! এটি IDisposableঅবজেক্টগুলির জন্য - যা নিয়ন্ত্রণহীন সংস্থানগুলি মুক্ত করার জন্য (যেমন: যা আবর্জনা সংগ্রহকারী দ্বারা পরিচালিত হয় না )।
অ্যান্ড্রু রাসেল

9

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

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


এটি সি # এবং জাভা ব্যাখ্যা করার পরিবর্তে পরিচালিত হওয়া সম্পর্কে একটি ভাল বিষয় ... এটি আরও নির্ভুল করতে আমার প্রশ্ন সম্পাদনা করেছে :)
মাইকেল ক্লিমেন্ট

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


4

সি # এবং জাভা ব্যাখ্যা করা হয় না। তারা একটি অন্তর্বর্তী বাইটকোড যা পরে কম্পাইল করছি জে আই টি JIT রূপান্তরিত হবে শুধু হিসাবে দ্রুত নেটিভ কোড (অথবা যথেষ্ট কাছাকাছি তুচ্ছ হতে) হিসেবে

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

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


হ্যাঁ, দ্রষ্টব্যটির জন্য ধন্যবাদ, ইতিমধ্যে ব্যাখ্যা / পরিচালিত জিনিসটিকে সংশোধন করেছেন;) এছাড়াও, দৃশ্যটির বিষয়ে ভাসমান মেসগুলি নিয়ে ভাল বক্তব্য। জিসি সমস্যাগুলি নিয়ে ভাবতে ভাবতে
ভাবেনি

1
IDisposableসময়-সমালোচনামূলক এবং নিয়ন্ত্রণহীন সংস্থানসমূহের নির্বিচারে পরিষ্কারের অনুমতি দেয় তবে চূড়ান্তকরণ বা আবর্জনা সংগ্রহকারীকে সরাসরি প্রভাবিত করে না।
স্যাম হারওয়েল

4

জাভা বা সি # উভয়ই ব্যাখ্যা করা হয় না। উভয়ই দেশীয় মেশিন কোডে সংকলিত হয়।

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


কমপক্ষে সি # তে জঞ্জাল সংগ্রহের সাথে মোকাবেলা করা যেতে পারে, যুক্তিসঙ্গতভাবে ভাল, তাই আমি এটি বলব না যে এটি একটি চুক্তি-বিভক্তকারী। প্রোগ্রামের স্থিতির যথাযথ থ্রেডিং এবং সচেতনতার সাথে আপনি কার্য সম্পাদনের সমস্যাগুলি এড়াতে পারবেন। এটি আপনার সম্পর্কে ভাবতে হবে এমন আরও একটি জিনিস এবং এটি পরিচালিত ভাষাটিকে কিছুটা কম পরিচালিত করে।
কারান্টজা

4
এটি লক্ষণীয় যে, নেট 4 এ, আবর্জনা সংগ্রহকারী তিনটি প্রজন্মের অবজেক্টের জন্য পটভূমি সংগ্রহকে সমর্থন করে। এটি গেমগুলিতে আবর্জনা সংগ্রহের কার্যকারিতা প্রভাবকে কার্যকরভাবে হ্রাস করতে হবে। প্রাসঙ্গিক লিঙ্ক: geekswithblogs.net/sdorman/archive/2008/11/07/…
মাইক স্ট্রোবেল

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

2
সি # বা জাভা উভয়ই দেশীয় মেশিন কোডে সংকলিত হয় না। সি # এমএসআইএল এবং জাভা বাইকোডে সংকলন করে। আবর্জনা সংগ্রহ কোনও "দীর্ঘ" বিরতি দেয় না, তবে এটি "হিচাপগুলি" দিতে পারে।
ক্লাউডাঙ্গার

2

এইগুলির মতো ভাষা (বা এক্সএনএ, টর্কএক্সএক্স ইঞ্জিন ইত্যাদির মতো সরঞ্জামগুলি ব্যবহার করে) গেম তৈরি করা থেকে আমি দেখতে পাচ্ছি যে একটি বড় সমস্যাটি হ'ল আপনি কী সমতুল্য গেম তৈরি করতে প্রয়োজনীয় দক্ষতার সাথে ভাল লোকদের একটি দল খুঁজে পেতে খুব চাপ পাবেন? সি ++ এবং ওপেনজিএল / ডাইরেক্টএক্স-এ লোক খুঁজে পাওয়া মোটামুটি সহজ।

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

আপনি যদি এখনই কনসোলগুলির জন্য গেমগুলি বিকাশ করতে চান তবে আপনি এক্সবক্সে এক্সএনএ এবং সি # পেতে এবং তারপরে কেবল এক্সবক্স লাইভ ইন্ডি গেমস নামে গেমস লাইব্রেরির পাশের অংশে পাবেন। প্রতিযোগিতা ইত্যাদিতে জয়যুক্ত কিছু যারা তাদের গেমটি রিয়েল এক্সবক্স লাইভ আরকেডে নিয়ে যায়। পিসির জন্য একটি গেম তৈরির পরিকল্পনা ছাড়া অন্য।

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