ইউডিপি নন-ব্লকিং বা পাওয়ার জন্য আলাদা থ্রেড?


10

আমি একটি মাল্টিপ্লেয়ার গেম তৈরি করছি 64 আমি ইতিমধ্যে নেটওয়ার্ক লুপের জন্য পৃথক থ্রেড রাখার সিদ্ধান্ত নিয়েছি, তবে আমি ভাবছিলাম যে ইউডিপি গ্রহণের জন্য অতিরিক্ত থ্রেড তৈরি করা বা অ-ব্লকিং (অতিরিক্ত থ্রেড ছাড়াই) প্রাপ্তি সকেট সেট করা ভাল কিনা wond

নাকি অ্যাসিক্রোনাস সকেটের মতো অন্য কোনও পদ্ধতি ব্যবহার করা ভাল? আরও ভাল পদ্ধতি সর্বদা স্বাগত!

উত্তর:


6

ঠিক আছে, সবার আগে, আপনার যদি কিছু থাকে এবং এটি কাজ করে তবে সাধারণত এটি ঠিক রেখে দেওয়া ভাল। কেন ভাঙা হয়নি তা স্থির করবেন?

তবে যদি আপনার সমস্যা হয়, এবং আপনার নেটওয়ার্কিং কোডটি সত্যই আবার লিখতে চান তবে আমার মনে হয় আপনার চারটি প্রধান পছন্দ রয়েছে:

  1. মাল্টিথ্রেডেড ব্লকিং কোড (আপনি এখনই কী করছেন)
  2. স্তর-ট্রিগারযুক্ত বিজ্ঞপ্তি সহ অ-ব্লক করা সকেট
  3. প্রস্তুতি পরিবর্তনের বিজ্ঞপ্তি সহ অ-ব্লক করা সকেট
  4. অ্যাসিঙ্ক্রোনাস সকেট

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

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

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

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

প্রথমটি যা আপনি করতে চান তা হ'ল সকেটটি অ-ব্লক করাতে সেট করা। আপনি এটা দিয়ে fcntl()

এর পর, আগে আপনি কি send(), recv(), sendto(), recvfrom(), accept()( connect()বা অন্যান্য কল থ্রেড ব্লক করতে পারে, আপনি কল একটু ভিন্ন) select()সকেট উপর। select()পরবর্তী পঠন বা লেখার ক্রিয়াকলাপটি ব্লক না করে সকেটে সঞ্চালন করা যায় কিনা তা আপনাকে জানায়। যদি এটি হয় তবে আপনি নিজের পছন্দ মতো অপারেশনটি নিরাপদে করতে পারেন, এবং সকেটটি ব্লক করবে না।

এটি একটি গেমের অন্তর্ভুক্ত করা বেশ সহজ। আপনার যদি ইতিমধ্যে একটি গেম লুপ থাকে তবে উদাহরণস্বরূপ:

while game_is_running do
    poll_input()
    update_world()
    do_sounds()
    draw_world()
end

আপনি এটি দেখতে এটি পরিবর্তন করতে পারে:

while game_is_running do
    poll_input()
    read_network()
    update_world()
    do_sounds()
    write_network()
    draw_world()
end

কোথায়

function read_network()
    while select(socket, READ) do
        game.net_input.enqueue(recv(socket))
    end
end

এবং

function write_network()
    while not game.net_output.empty and select(socket, WRITE) do
        send(socket, game.net_output.dequeue())
    end
end

সম্পদের দিক থেকে, আমি মনে করি যে প্রত্যেকেরই নিজের বইয়ের দোকানগুলিতে অবশ্যই থাকতে হবে, যদিও এটি তাদের একমাত্র বই , এটি প্রয়াত রিচার্ড স্টিভেন্সের " ইউনিক্স নেটওয়ার্ক প্রোগ্রামিং, ভোল্ট ১ " is আপনি উইন্ডোজ বা অন্যান্য ওএস বা ভাষার সকেট প্রোগ্রামিং করে তা বিবেচনা করে না। আপনি এই বইটি না পড়া পর্যন্ত আপনি সকেটগুলি বোঝেন বলে মনে করবেন না।

আরেকটি সংস্থান যেখানে আপনি একাধিক সকেট প্রোগ্রামিং (সার্ভার প্রোগ্রামিংয়ের ক্ষেত্রে বেশিরভাগ প্রাসঙ্গিক) এর ক্ষেত্রে উপলব্ধ সমাধানগুলির একটি সাধারণ ওভারভিউ খুঁজে পেতে পারেন এটি এই পৃষ্ঠা


আমি সবেমাত্র আমার গেম ইঞ্জিন শুরু করেছি, সুতরাং পুনর্লিখন কোনও সমস্যা নয়। এই উত্তরটি সত্যই কার্যকর ছিল এবং বইয়ের সুপারিশের জন্য আপনাকে ধন্যবাদ। আপনি কি এমন কোনও বই জানেন যা গেমগুলিতে নেটওয়ার্কিং সম্পর্কে আরও সুনির্দিষ্ট?
ইয়ানিক ল্যাঞ্জ

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

-1

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

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

সুতরাং আমি আপনাকে অ্যাসিক্রোনাস সকেট ব্যবহার করার পরামর্শ দিচ্ছি।


4
কেন প্রতিটি একক সকেটের জন্য তার থ্রেড দরকার? বিশেষত অ্যাসিঙ্ক সকেট নিয়ে? অনেক হেভিওয়েট সার্ভার সকেট ডেটা প্রক্রিয়াকরণের জন্য একটি "থ্রেড পুল" মডেল ব্যবহার করে, যেখানে প্রতিটি থ্রেড N ক্লায়েন্টকে পরিবেশন করে এবং তারা প্রয়োজন হিসাবে তৈরি হয় বা মারা হয়। এই উত্তরটির উন্নতির প্রয়োজন বলে মনে করুন: ডি
গ্রিমশো

@ গ্রিমশো আমার মনে হয় আপনি আমার উত্তর ভুল বুঝেছেন। আমি মনে করি যে আমি এখন স্পষ্ট করে দিয়েছি যে ব্লকিং সকেটগুলি ব্যবহার করার সময় একটি বহু-থ্রেডযুক্ত মডেলের প্রয়োজন হবে।
ফিলিপ

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

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

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