কীভাবে ডেল্টা সংক্ষেপণ নেটওয়ার্কে প্রেরিত ডেটার পরিমাণ হ্রাস করে?


26

প্রেরিত ডেটা লোডকে কম করার জন্য অনেক গেমস ডেল্টা সংকোচনের কৌশল ব্যবহার করে। আমি বুঝতে ব্যর্থ হলাম কীভাবে এই কৌশলটি ডেটা লোডটি আসলে কমায়?

উদাহরণস্বরূপ, ধরা যাক আমি একটি অবস্থান পাঠাতে চাই। ডেল্টা সংক্ষেপণ ছাড়াই আমি vector3সত্তার সঠিক অবস্থান সহ একটি প্রেরণ করি , উদাহরণস্বরূপ (30, 2, 19)। ডেল্টা সংক্ষেপণের সাথে আমি একটি vector3ছোট সংখ্যার সাথে প্রেরণ করি (0.2, 0.1, 0.04)

আমি বুঝতে পারছি না যে এটি যদি ডেটা লোডকে কীভাবে হ্রাস করে তবে উভয় বার্তা vector3- প্রতিটি ফ্লোটের জন্য 32 বিট - 32 * 3 = 96 বিট!

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


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

2
@ লুয়ান বা আপনি প্রায়শই প্রায়শই একটি আংশিক পরম অবস্থা যুক্ত করতে পারেন, উদাহরণস্বরূপ আপনি প্রায়শই প্রায়শই কয়েকটি সত্ত্বা নির্বাচন করতে পারেন এবং পরম অবস্থানটি পাস করতে পারেন, প্লেয়ারের কাছাকাছি সত্তা নির্বাচন করা পছন্দ করতে পারেন।
রাচেট ফ্রিক

একরকম, আমি এই প্রশ্নটি
আরএসআইএনসি-

হাফম্যান কোডিং।
বেন ভয়েগট

মিডল আউট
জন দেমেট্রিও

উত্তর:


41

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

ডেল্টাস সহ, আপনি কখনই ইউনিটগুলির অবস্থানগুলি প্রেরণ করেন না যা মোটেও সরেনি । এটাই এর আত্মা।

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

আপনার প্রদত্ত ক্ষেত্রে, এটি (আপনার কোডবেসের উপর নির্ভর করে) ডেল্টাসকে এনকোড করতে কম সংখ্যক বিট ব্যবহার করতে পারে, পুরো রাষ্ট্র প্রেরণের জন্য প্রয়োজনীয় বিট-রেঞ্জের বিপরীতে depending বলুন যে বিশ্বটি অনেক কিলোমিটার জুড়ে, আপনাকে প্রদত্ত অক্ষটিতে একটি সেন্টিমিটার বলতে সঠিকভাবে অবস্থানগুলি এনকোড করার জন্য একটি 32-বিট ফ্লোটের প্রয়োজন হতে পারে। যাইহোক, সত্তাগুলির ক্ষেত্রে সর্বাধিক বেগ প্রযোজ্য, যা কেবল টিকের জন্য কয়েক মিটার দু'টি হতে পারে, এটি কেবলমাত্র 8 টি বিট (2 ^ 8 = 256 এত বেশি 200 সেন্টিমিটার সঞ্চয় করার পক্ষে যথেষ্ট) হতে পারে। অবশ্যই, যদি আপনি স্থির পয়েন্ট ঝামেলা না চান তবে এটি ভাসমান পয়েন্ট ব্যবহারের চেয়ে ... অথবা ওপেনগিএলের মতো অর্ধেক / কোয়ার্টারের কোনও ধরণের ভাসমানের চেয়ে স্থির করে নেওয়া হয়েছে।


7
আপনার উত্তর আমার কাছে পরিষ্কার নয়। আমার মনে হয় যে নড়াচড়া করা অবজেক্টের তথ্য না পাঠানো ডেল্টা এনকোডিংয়ের একটি পার্শ্ব প্রতিক্রিয়া এবং "এর আত্মা" নয়। ডেল্টা এনকোডিং ব্যবহারের আসল কারণটি রাচেট ফ্রিকের উত্তরটি আরও ভালভাবে হাইলাইট করা মনে হয়েছে।
এএসিটপাব নিওলিভ

14
@ এশিয়াটপাবনিওলিভ "দ্য স্পিরিট" হ'ল "আপনার যা যা করবেন না তা প্রেরণ করবেন না"। এটি বিট স্তরে নামানো যেতে পারে - "তারের উপর দিয়ে প্রয়োজনীয় বার্তাটি পাওয়ার জন্য কেবল তত ব্যান্ডউইথ ব্যবহার করুন"। এই উত্তর স্পষ্টতই অন্য সবার কাছে যথেষ্ট পরিষ্কার বলে মনে হচ্ছে। ধন্যবাদ।
ইঞ্জিনিয়ার

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

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

22

আপনার কাছে ভুল বদ্বীপ রয়েছে। আপনি পৃথক উপাদানগুলির ব-দ্বীপের দিকে তাকিয়ে আছেন। আপনাকে পুরো দৃশ্যের ব-দ্বীপের কথা ভাবতে হবে।

মনে করুন আপনার দৃশ্যে আপনার 100 টি উপাদান রয়েছে তবে তাদের মধ্যে কেবল 1 টি সরানো হয়েছে। আপনি যদি 100 টি উপাদান ভেক্টর প্রেরণ করেন তবে তাদের মধ্যে 99 টি অপচয় হয়। আপনার কেবলমাত্র 1 টি প্রেরণ করতে হবে।

এখন, ধরা যাক আপনার কাছে একটি JSON অবজেক্ট রয়েছে যা আপনার সমস্ত উপাদান ভেক্টরগুলিকে সঞ্চয় করে। এই অবজেক্টটি আপনার সার্ভার এবং আপনার ক্লায়েন্টের মধ্যে সিঙ্ক্রোনাইজ হয়েছে। সিদ্ধান্ত নেওয়ার পরিবর্তে "কি তাই করল?" আপনি কেবলমাত্র আপনার পরবর্তী গেমের টিকটি জেএসএন অবজেক্টে তৈরি করতে পারেন, এটি তৈরি করতে পারেন diff tick100.json tick101.jsonএবং তার থেকে আলাদা করতে পারেন। ক্লায়েন্টের পক্ষ থেকে, আপনি আপনার বর্তমান টিকের ভেক্টরটিতে পৃথকটি প্রয়োগ করেন এবং আপনি প্রস্তুত।

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


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

8
@ গ্রনোস্টাজ পয়েন্টটি পেতে এটি একটি উদাহরণ। আমি আসলে জেএসএনের জন্য ডিফ ব্যবহার করে উকিল করি না - এজন্যই "ধরুন" বলুন।
কর্সিকা

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

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

9

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

সম্ভাব্য মানগুলি পূর্বাভাসের সাথে একত্রিত করা হলে এই সংক্ষেপণ প্রকল্পগুলি আরও ভাল কাজ করে। ডেল্টা এনকোডিং প্রায় 0 টি মানকে গ্রুপ করবে group


1
আর একটি উদাহরণ: আপনার নিজের অবস্থানের সাথে যদি 100 টি স্পেসশিপ থাকে তবে একই গতিবেগের ভেক্টরটিতে ভ্রমণ করেন তবে আপনাকে কেবল একবার বেগ পাঠাতে হবে (বা কমপক্ষে এটি সত্যিই সংকুচিত করতে হবে ); অন্যথায়, এর পরিবর্তে আপনার 100 টি অবস্থান পাঠানো দরকার। অন্যদের যোগ করতে দিন। আপনি যদি ভাগ করা-রাষ্ট্রের লক-স্টেপ সিমুলেশনগুলি ডেল্টা-সংকোচনের আক্রমণাত্মক রূপ হিসাবে বিবেচনা করেন, আপনি এমনকি গতিও প্রেরণ করেন না - কেবল প্লেয়ার থেকে আসা কমান্ড। আবার, প্রত্যেককে তাদের নিজস্ব সংযোজন করতে দিন।
লুয়ান

আমি রাজী. উত্তেজনা প্রাসঙ্গিক।
লিওপোলোডো সান্জিক

8

আপনি বিস্তৃতভাবে সঠিক, তবে একটি গুরুত্বপূর্ণ বিষয় অনুপস্থিত।

একটি গেমের সত্তা অনেক গুণাবলী দ্বারা বর্ণিত হয়, যার অবস্থান কেবল একটি

কি ধরনের গুণাবলী? খুব শক্ত চিন্তা না করে, একটি নেটওয়ার্ক গেম এ এগুলি অন্তর্ভুক্ত করতে পারে:

  • অবস্থান।
  • স্থিতিবিন্যাস।
  • বর্তমান ফ্রেম নম্বর।
  • রঙ / আলো সম্পর্কিত তথ্য।
  • স্বচ্ছতা.
  • মডেল ব্যবহার করার জন্য।
  • টেক্সচার ব্যবহার করার জন্য।
  • বিশেষ প্রভাব.
  • প্রভৃতি

আপনি যদি এগুলির প্রতিটি বিচ্ছিন্নভাবে বেছে নেন তবে আপনি অবশ্যই কেসটি তৈরি করতে পারবেন যে কোনও প্রদত্ত ফ্রেমে যদি এটি পরিবর্তন করার প্রয়োজন হয় তবে অবশ্যই এটি পুরোপুরি পুনঃপ্রেরণ করা উচিত।

তবে এই সমস্ত বৈশিষ্ট্য একই হারে পরিবর্তিত হয় না

মডেল বদলায় না? ডেল্টা সংকোচন ছাড়াই এটি অবশ্যই যাইহোক পুনঃপ্রেরণ করা উচিত। ডেল্টা সংকলনের সাথে এটির দরকার নেই।

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


8

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

তবে, ডেল্টাসের উপর ভিত্তি করে একটি সু-নকশিত সিস্টেম ট্র্যাফিককে বাঁচাতে পারে এমন দুটি উপায় রয়েছে are

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

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


6

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

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

উদাহরণস্বরূপ, আপনি যদি ভেক্টরটি এনকোড করতে চান {68923, 69012, 69013, 69015}তবে আপনি সেই হিসাবে ব-দ্বীপ-এনকোড করতে পারেন {68923, 89, 1, 2}। তুচ্ছ ভেরিয়েবল-বাইট এনকোডিং ব্যবহার করে যেখানে আপনি প্রতি বাইটে b বিট ডেটা সঞ্চয় করেন এবং একটি বিট ব্যবহার করে তা নির্দেশ করে যে অন্য বাইট আসছে, অ্যারেতে পৃথক উপাদানগুলির প্রত্যেকেরই এটি প্রেরণ করতে 3 বাইট লাগবে, তবে ডেল্টা-এনকোড সংস্করণ প্রথম উপাদানটির জন্য কেবল 3 বাইট এবং বাকী উপাদানগুলির জন্য 1 বাইট প্রয়োজন হবে; যে ধরণের ডেটা আপনি সিরিয়াল করছেন তার উপর নির্ভর করে এটি কিছু চমত্কার চিত্তাকর্ষক সঞ্চয় করতে পারে।

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


4

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

পাইথনের উদাহরণ এখানে:

import numpy as np
import zlib
import json
import array


state1 = np.random.random(int(1e6))

diff12 = np.r_[np.random.random(int(0.1e6)), np.zeros(int(0.9e6))]
np.random.shuffle(diff12) # shuffle so we don't cheat by having all 0s one after another
state2 = state1 + diff12

state3 = state2 + np.random.random(int(1e6)) * 1e-6
diff23 = state3 - state2

def compressed_size(nrs):
    serialized = zlib.compress(array.array("d", nrs).tostring())
    return len(serialized)/(1024**2)


print("Only 10% of elements change for state2")
print("Compressed size of diff12: {:.2f}MB".format(compressed_size(diff12)))
print("Compressed size of state2: {:.2f}MB".format(compressed_size(state2)))

print("All elements change by a small value for state3")
print("Compressed size of diff23: {:.2f}MB".format(compressed_size(diff23)))
print("Compressed size of state3: {:.2f}MB".format(compressed_size(state3)))

যা আমাকে দেয়:

Only 10% of elements change for state2
Compressed size of diff12: 0.90MB
Compressed size of state2: 7.20MB
All elements change by a small value for state3
Compressed size of diff23: 5.28MB
Compressed size of state3: 7.20MB

চমৎকার উদাহরণ। সংক্ষেপণ এখানে একটি ভূমিকা পালন করে।
লিওপোলোডো সান্জিক

0

যদি আপনার অবস্থান ভেক্টর 3 এ সঞ্চিত থাকে তবে প্রকৃত সত্তা একবারে কয়েকটি সংখ্যার পূর্ণসংখ্যার স্থানান্তর করতে পারে। তারপরে এটি বেল্টে ডেল্টা পাঠান এটি পূর্ণসংখ্যায় প্রেরণের চেয়ে ভাল।

বর্তমান অবস্থান: 23009.0, 1.0, 2342.0 (3 ফ্লোট)
নতুন অবস্থান: 23010.0, 1.0, 2341.0 (3 ফ্লোট)
ডেল্টা: 1, 0, -1 (3 বাইট)

প্রতিবার সঠিক অবস্থানটি প্রেরণের পরিবর্তে আমরা ব-দ্বীপটি প্রেরণ করি।


0

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

ধরা যাক আপনার 2D তে 100 টি সত্তা রয়েছে। একটি বড় গ্রিডে, 512 x 512. উদাহরণ হিসাবে কেবলমাত্র পূর্ণসংখ্যার বিবেচনা করা। এটি সত্তা হিসাবে দুটি পূর্ণসংখ্যার সংখ্যা বা 200 সংখ্যা।

দুটি আপডেটের মধ্যে, আমাদের সমস্ত অবস্থানের হয় 0, 1, -1, 2 বা -2 দ্বারা পরিবর্তন হয়। 0 এর 100 টি উদাহরণ, 1 এবং -1 এর 33 টি উদাহরণ এবং কেবল 2 এবং -2 এর 17 টি উদাহরণ রয়েছে। এটি বেশ সাধারণ বিষয়। আমরা সংকোচনের জন্য হাফম্যান কোডিং চয়ন করি।

এর জন্য হাফম্যান গাছটি হ'ল:

 0  0
-1  100
 1  101
 2  110
-2  1110

আপনার 0 টি সমস্ত একক হিসাবে এনকোড হবে। এটি কেবল 100 বিট। 66 টি মান 3 বিট হিসাবে এবং কেবল 34 বিট হিসাবে 4 বিট হিসাবে এনকোড হবে। এটি 434 বিট বা 55 বাইট। গাছটি ছোট হওয়ায় আমাদের ম্যাপিং গাছটি সংরক্ষণ করার জন্য কিছু ছোট ওভারহেড প্লাস করুন। নোট করুন যে 5 নম্বর এনকোড করতে আপনার 3 টি বিট লাগবে। আমরা এখানে '-2' এর জন্য 4 বিট ব্যবহারের প্রয়োজনের জন্য '0' এর জন্য 1 বিট ব্যবহারের ক্ষমতা নিয়ে ব্যবসা করেছি।

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

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


নোট করুন যে ডেল্টা এনকোডিং এবং সংক্ষেপণ অন্যান্য পরিস্থিতিতেও অন্য রূপান্তরগুলির সাথে ব্যবহৃত হয়।

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

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