খাঁটি ক্রিয়ামূলক প্রোগ্রামিং এবং গেমের অবস্থা


12

একটি কার্যকরী প্রোগ্রামিং ভাষায় রাষ্ট্র (সাধারণভাবে) পরিচালনা করার জন্য কি কোনও সাধারণ কৌশল আছে? গ্লোবাল স্টেট পরিচালনা করার জন্য প্রতিটি (ক্রিয়ামূলক) প্রোগ্রামিং ভাষায় সমাধান রয়েছে তবে আমি যতদূর পেরেছি এড়াতে চাই।

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

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

সুতরাং আমার প্রশ্নটি হল আমি কীভাবে একটি কার্যকরী প্রোগ্রামিং ভাষায় বিশেষত গেম বিকাশের জন্য প্রচুর পরিমাণে রাজ্য পরিচালনা করব?

সম্পাদনা: ক্লোজুরে গেমস তৈরির জন্য কয়েকটি গেম ফ্রেমওয়ার্ক রয়েছে। এই সমস্যাটিকে আংশিকভাবে সমাধান করার জন্য গেমের সমস্ত বস্তুকে "সত্তা" হিসাবে থ্রেড করা এবং এটিকে একটি বিশাল ব্যাগে রেখে দেওয়া। একজন gigant প্রধান ফাংশন পর্দা ধারণ করা হয় এবং সত্ত্বা এবং হাতল ইভেন্টগুলি ( :on-key-down, :on-init, ...) এই সত্তার জন্য এবং প্রধান প্রদর্শন লুপ চালানো। তবে এটি পরিষ্কার সমাধান নয় যা আমি অনুসন্ধান করছি।


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

খাঁটি কার্যক্ষমতার সুবিধা হ'ল ফাংশন প্রোটোটাইপগুলি আপনার প্রোগ্রামের সমস্ত নির্ভরতা দেখায়।
tp1

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

উত্তর:


7

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

আমি একটি সি # প্রোগ্রামার, কোনও "ফাংশনাল প্রোগ্রামিং" ব্যাকগ্রাউন্ড ছাড়াই। আমি এই "মোনাড" জিনিসটি কী সম্পর্কে শুনে থাকি এবং এটি আমার কী ব্যবহার?

মনাদে এরিক লিপার্ট

কিছু বিষয় বিবেচনা করা উচিত, যদিও:

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

কিছু চূড়ান্ত চিন্তা:

  • সমান্তরালতা: গেমস যদিও না প্রচন্ডভাবে এটি ব্যবহার, আমি যতদূর জানি তার অধিকাংশই ইতিমধ্যে GPU এর মাধ্যমে যাহাই হউক না কেন এরকম ঘটে।
  • রাষ্ট্রহীনতা: রাষ্ট্রের মিউটেশনগুলি গেমগুলির একটি অবিচ্ছেদ্য অঙ্গ। এগুলি থেকে মুক্তি পাওয়ার চেষ্টা করা কেবল অযথা বিষয়গুলিকে জটিল করে তুলতে পারে।
  • আপনার আগ্রহী হলে, কীভাবে কার্যকরী ভাষা F # নেট .NET এর অবজেক্ট-ভিত্তিক বাস্তুতন্ত্রের সাথে খেলছে তা দেখুন।

সব মিলিয়ে, আমি মনে করি এটি যদি একাডেমিকভাবে আকর্ষণীয়ও হতে পারে তবে আমি সন্দেহ করি যে এই পদ্ধতির ব্যবহারিক এবং প্রচেষ্টাটি মূল্যবান।


আপনার কোনও অভিজ্ঞতা নেই এমন বিষয় সম্পর্কে মন্তব্য কেন পোস্ট করবেন? চিন্তার এক দৃষ্টান্তে আটকা লোকের কাছ থেকে আসা একটি মতামত।
অ্যান্টনি রাইমন্ডো

4

ওওপি থেকে এফআরপি পর্যন্ত পদ্ধতির সাথে আমি এফ # (বহু-দৃষ্টান্ত, অপবিত্র, কার্যকরী-প্রথম ভাষা) ব্যবহার করে কয়েকটি গেম লিখেছি । এটি একটি বিস্তৃত প্রশ্ন, তবে আমি যথাসাধ্য চেষ্টা করব।

একটি কার্যকরী প্রোগ্রামিং ভাষায় রাষ্ট্র (সাধারণভাবে) পরিচালনা করার জন্য কি কোনও সাধারণ কৌশল আছে?

আমার পছন্দসই উপায়টি হ'ল একটি প্রতিরক্ষামূলক টাইপ যা পুরো গেমটি উপস্থাপন করে State। আমার তখন স্রোতের একটি পরিবর্তনীয় রেফারেন্স রয়েছে Stateযা প্রতিটি টিক আপডেট হয়। এটি কঠোরভাবে খাঁটি নয়, তবে এটি পরিবর্তনকে এক জায়গায় সীমাবদ্ধ রাখে।

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

সত্য না. Stateপ্রকারটি অপরিবর্তনীয় হওয়ায় আপনার কোনও পুরানো উপাদান বিশ্বকে খারাপ-সংজ্ঞায়িত উপায়ে পরিবর্তন করতে পারে না। এটি GameObjectপদ্ধতির (ityক্য দ্বারা জনপ্রিয়) সবচেয়ে বড় সমস্যাটি সমাধান করে : Updateকলগুলির ক্রম নিয়ন্ত্রণ করা শক্ত hard

এবং গ্লোবাল ব্যবহারের বিপরীতে, এটি সহজেই ইউনিট-টেস্টেবল এবং সমান্তরাল,

সমস্যাটি ভেঙে ফেলার জন্য আপনাকে সাহায্যকারী ফাংশনগুলিও লিখতে হবে যা রাজ্যের সাব-প্রপার্টি গ্রহণ করে।

উদাহরণ স্বরূপ:

let updateSpaceShip ship = 
  {
    ship with 
      Position = ship.Position + ship.Velocity
  }

let update state = 
  { 
    state with 
      SpaceShips = state.SpaceShips |> map updateSpaceShip 
  }

এখানে updateপুরো রাজ্যে কাজ করে, তবে updateSpaceShipকেবল SpaceShipবিচ্ছিন্ন ব্যক্তির উপর কাজ করে ।

আমি কেবল প্রাসঙ্গিক তথ্য ফাংশনগুলিতে রাখতে পারি এবং প্রদত্ত ইনপুটটির জন্য নেওয়া পদক্ষেপগুলি ফিরিয়ে দিতে পারি।

আমার পরামর্শটি Inputহ'ল এমন একটি প্রকার তৈরি করা হবে যাতে কীবোর্ড, মাউস, গেম-প্যাড ইত্যাদি অবস্থিত holds তারপরে আপনি একটি ফাংশন লিখতে পারেন যা একটি Stateএবং Inputপরবর্তীটিতে ফিরে আসে State:

let applyInput input state = 
  // Something

এটি কীভাবে একসাথে খাপ খায় সে সম্পর্কে আপনাকে ধারণা দেওয়ার জন্য, সামগ্রিক গেমটি দেখতে এমন কিছু দেখাচ্ছে:

let mutable state = initialState ()

// Game loop
while true do
  // Apply user input to the world
  let input = collectInput ()

  state <- applyInput input state

  // Game logic
  let dt = computeDeltaTime ()

  state <- update dt state

  // Draw
  render state

সুতরাং আমার প্রশ্নটি হল আমি কীভাবে একটি কার্যকরী প্রোগ্রামিং ভাষায় বিশেষত গেম বিকাশের জন্য প্রচুর পরিমাণে রাজ্য পরিচালনা করব?

সাধারণ গেমসের জন্য আপনি উপরের পদ্ধতির ব্যবহার করতে পারেন (সহায়ক ফাংশন)। আরও জটিল কিছু জন্য, আপনি " লেন্স " চেষ্টা করতে চাইতে পারেন ।

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

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

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

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

খালি পঠনযোগ্য মূল্য হ'ল পিউলি ফাংশনিয়াল রেট্রোগেমস


1

আপনি যা খুঁজছেন তা এফআরপি গেম ডেভলপমেন্ট।

কিছু ভিডিও সূচনা:

খাঁটি কার্যকরী উপায়ে কোর গেমকে যুক্তিযুক্ত করা 100% সম্ভব এবং পছন্দনীয়, সামগ্রিকভাবে শিল্পটি কেবল পিছনে, চিন্তার এক দৃষ্টান্তে আটকে যায়।

এটি ইউনিটিতেও করা সম্ভব।

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

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