2 ডি ভেক্টর শ্রেণির জন্য ভাসমান, ডাবল বা উভয়ই?


11

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

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

  • ডাবল ও কল-বাই রেফারেন্স। যদি আমি উপরের নিবন্ধটি সঠিকভাবে বুঝতে পারি তবে আমি 4 টি ফ্লোট সংখ্যার পরিবর্তে 2 ডাবল নির্ভুলতা ভেরিয়েবলগুলিও ব্যবহার করতে পারি। উপরের থ্রেড অনুযায়ী ডাবলটি ভাসমানের থেকে এখনও ধীর।

  • ডাবল এবং ফ্লোটের জন্য টেমপ্লেট: বহুল প্রচলিত বই " গেম ইঞ্জিন আর্কিটেকচার " টেমপ্লেটগুলি ব্যবহার করে এটি প্রয়োজন অনুযায়ী ভাসা এবং দ্বিগুণ ব্যবহার সম্ভব করে তোলে। সুস্পষ্ট ডাউনসাইড হ'ল কোড ব্লাট। এছাড়াও, আমি সন্দেহ করি যে মূলত যাইহোক, দুটি ক্লাস না লিখে কোডটি অনুকূলিত করা যেতে পারে।

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


ধীরে কোথায় ? যদি আপনি কোনও নির্দিষ্ট স্থাপত্যের সাথে আবদ্ধ না হন তবে আপনি গতি সম্পর্কে কথা বলতে পারবেন না।
o0 '

2
@ লো'রিস: আমি এমন কোনও স্থাপত্য জানি না যেখানে ভাসমানের চেয়ে দ্বিগুণ দ্রুত।

আপনার নিজের ভেক্টর ক্লাসটি লেখার পরিবর্তে সোনির ( বুলেটফিজিক্স.আর . / বুলেট / ফিলিপবিবি 3 / ২ ) ব্যবহার বিবেচনা করুন । এটি একটি সহজ ড্রপ-ইন কেবলমাত্র শিরোনামযুক্ত "গ্রন্থাগার" যা ইতিমধ্যে মাইক্রো-অনুকূলিত হয়েছে এবং সমস্ত ভেক্টর লাইব্রেরি মূলত একই বাহ্যিক ইন্টারফেস যাহাই হউক না কেন।

@ জো: 4 ফ্লোটের পরিবর্তে 2 ডাবল?
o0 '

@ লো'রিস: প্রশ্নটি কিছুটা অদ্ভুতভাবে বোঝানো হয়েছে, আমি জানি না যে প্রশ্নকারী বিভ্রান্ত হয়েছে বা কেবল আপনি - আপনি সিমডের সাথে ডিল করার সময় "চার ভাসা" এর পরিবর্তে দুটি ডাবল ব্যবহার করেন, কারণ নিবন্ধকটি 128 বিট প্রশস্ত। আপনার এখনও সমান সংখ্যক প্রক্রিয়া করা দরকার এবং আপনি এটি অর্ধগতিতে করছেন।

উত্তর:


9

আমার ডাবল ব্যবহারের কারণ না থাকলে আমি সর্বদা ভাসা ব্যবহার করি, যতক্ষণ না আমার কাছে int64_t ব্যবহারের কারণ না থাকে int

2 24 অবধি নির্ভুল পূর্ণসংখ্যার গাণিতিক কাজ করতে ফ্লোটগুলির কোনও সমস্যা নেই , যা বেশিরভাগ লোকই (বেশিরভাগ অযৌক্তিকভাবে) ভয় পান। ডাবলগুলি সাধারণ মানগুলি হুবহু উপস্থাপনযোগ্য হওয়ার সমস্যা সমাধান করে না - আপনি 0.10000001 বা 0.10000000000000001 পান কিনা, আপনার অবশ্যই অবশ্যই কোডটি 0.09999999 এর সাথে "সমান" হিসাবে বিবেচিত হয়েছে তা নিশ্চিত করতে হবে।

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

সি / সি ++ পাশ এবং অভ্যন্তরের শেডার উভয় ক্ষেত্রেই সিঙ্গল-স্পষ্টতা ভাসমানগুলি হার্ডওয়্যার গ্রাফিক্স ইন্টারফেসের জন্য স্ট্যান্ডার্ড থেকে যায়।

আপনার সম্ভবত কোনও সময়ে ডাবল ভেক্টর লাগবে, তবে এটি ডিফল্টরূপে নয়, প্রয়োজনে ব্যবহার করা উচিত।

টেম্পলেট করার ক্ষেত্রে - আপনি ঠিক বলেছেন, সর্বোচ্চ পারফরম্যান্সের জন্য আপনি যেকোনোভাবে টেমপ্লেটগুলিকে ম্যানুয়ালি বিশেষায়িত করতে চাইবেন। এর বাইরে, আমি উইকএন্ডে কিছু টেম্প্লেটেড কোডের জন্য কিছু পরীক্ষা চালিয়েছি (একটি 4-প্লিজ ইন্টারট্র্যাক্ট এবং ফ্লোটরেক্ট তৈরি করা), এবং দেখেছি যে টেম্প্লেটেড সংস্করণটি কেবল কোডটি পুনরাবৃত্তি করার চেয়ে প্রায় 20x বেশি সময় নিয়েছে, যা প্রায় 15 লাইনের পরিমাণ ছিল । পুনরাবৃত্তি চুষে যায়, তবে সংকলনের জন্য অপেক্ষা করা আরও বেশি স্তন্যপান করে - এবং এটির মতো নয় যে আমার কখনও স্ট্রিংরেক্ট বা FooRect প্রয়োজন হবে।


" প্রতিটি প্ল্যাটফর্মের উপর দ্বিগুণ ধীর হয় […] " - উদ্ধৃতি প্রয়োজন।
জেনিথ

3

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

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


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

আমি ধরলাম সেখানে একটা ক্যাচ আছে was আপনার মন্তব্য করা উচিত যাতে এসও উত্তর, আমি এটি upvote।
রিকিট 16

এটি ইতিমধ্যে একটি মন্তব্য হিসাবে আছে।

1
যেহেতু আপনি এক্সএনএ নিয়ে এসেছেন, তাই আমি পাশাপাশি উল্লেখ করতে পারি যে ডাইরেক্ট 2 ডি একক-নির্ভুলতা ফ্লোটও ব্যবহার করে।
মাইক স্ট্রোবেল

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