ডাইরেক্টএক্সে বিভিন্নতা এবং এএর সাথে লাইনগুলি রেন্ডার করার দ্রুততম উপায়


14

সুতরাং আমি। ডানেক্ট নীচে শার্পডএক্স ব্যবহার করে কিছু ডাইরেক্টএক্স বিকাশ করছি (তবে ডাইরেক্টএক্স / সি ++ এপিআই সমাধান প্রযোজ্য)। আমি ডাইরেক্টএক্স ব্যবহার করে অরথোগোনাল প্রজেকশন (উদাহরণস্বরূপ বৈজ্ঞানিক অ্যাপ্লিকেশনগুলির জন্য 2 ডি লাইন অঙ্কন সিমুলেট করে) লাইনগুলি রেন্ডার করার দ্রুততম উপায় খুঁজছি।

আমি যে ধরণের প্লট রেন্ডার করতে চাইছি তার একটি স্ক্রিনশট নীচে: এখানে চিত্র বর্ণনা লিখুন

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

এখন পর্যন্ত আমি চেষ্টা করেছি:

  1. সফ্টওয়্যার রেন্ডারিং, যেমন জিডিআই + আসলে খারাপ পারফরম্যান্স নয় তবে স্পষ্টতই সিপিইউতে ভারী
  2. ডাইরেক্ট 2 ডি এপিআই - জিডিআই এর চেয়ে ধীর গতিতে, বিশেষত অ্যান্টিয়েলাসিং চালু রয়েছে
  3. ডাইরেক্ট 3 ডি 10 এই পদ্ধতিটি ব্যবহার করে এএ অনুকরণ করতে সিপিইউয়ের পাশে ভার্টেক্স রঙ এবং টেসেললেশন ব্যবহার করে । এছাড়াও ধীর গতিতে (আমি এটির প্রোফাইল দিয়েছি এবং ৮০% সময় ভার্টেক্স পজিশনের জন্য ব্যয় করা হয়)

তৃতীয় পদ্ধতির জন্য আমি জিপিইউতে একটি ত্রিভুজ স্ট্রিপ প্রেরণ করতে এবং ভার্টেক্স বুফার্স ব্যবহার করছি এবং প্রতি 200 মিমিগুলিকে নতুন শীর্ষকোনা দিয়ে আপডেট করছি। আমি ১০,০০,০০০ লাইন বিভাগের জন্য প্রায় 5FPS এর রিফ্রেশ রেট পাচ্ছি। আমার আদর্শ লক্ষ লক্ষ দরকার!

এখন আমি ভাবছি যে দ্রুততম উপায়টি জিপিইউতে টেসেলেশন করা যেমন, জ্যামিতি শেডারে। কোয়াডস তৈরি করতে আমি একটি লাইন-তালিকা হিসাবে একটি টেক্সচারে প্যাক এবং জ্যামিতি শেডারে আনপ্যাক হিসাবে পাঠাতে পারি। অথবা, কেবল একটি পিক্সেল শেডারে কাঁচা পয়েন্টগুলি প্রেরণ করুন এবং ব্রেসনহাম লাইন অঙ্কনটি সম্পূর্ণ পিক্সেল শেডারে প্রয়োগ করুন। আমার এইচএলএসএল 2006 থেকে মরিচা, শেডার মডেল 2 যাতে আধুনিক জিপিইউগুলি যে ক্রেজি করতে পারে তা আমি জানি না don't

সুতরাং প্রশ্নটি হ'ল: - এর আগে কি কেউ এই কাজ করেছে, এবং চেষ্টা করার জন্য আপনার কাছে কোনও পরামর্শ আছে? - দ্রুত জ্যামিতি আপডেট করার সাথে কার্যকারিতা উন্নত করার জন্য আপনার কোনও পরামর্শ আছে (উদাহরণস্বরূপ প্রতি 20 মিমিগুলিতে নতুন ভার্টেক্স তালিকা)?

21 শে জানুয়ারী আপডেট করুন

আমি লাইনস্ট্রিপ এবং ডায়নামিক ভার্টেক্স বাফার্স ব্যবহার করে জ্যামিতির শেডার ব্যবহার করে উপরে পদ্ধতি (3) প্রয়োগ করেছি। এখন আমি 100k পয়েন্টে 100FPS এবং 1,000,000 পয়েন্টে 10FPS পাচ্ছি এটি একটি বিশাল উন্নতি তবে এখন আমি ফিল-রেট এবং গণনা সীমাবদ্ধ তাই অন্যান্য কৌশল / ধারণা সম্পর্কে আমি ভাবনা পেয়েছি।

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

আপনার মন্তব্য এবং পরামর্শ অনেক প্রশংসা!


1
ডাইরেক্ট 3 ডি-তে নেটিভ এএ সম্পর্কে কী?
এপিআই-জন্তু

5
আপনি যে কয়েকটি উদাহরণ বক্ররেখা তৈরি করতে চান তা প্রদর্শন করতে পারেন? আপনি একটি মিলিয়ন উল্লম্ব উল্লেখ করেছেন কিন্তু আপনার পর্দায় সম্ভবত মিলিয়ন পিক্সেলের চেয়ে বেশি কিছু নেই , সেই পরিমাণটি কি আসলেই প্রয়োজন? আমার কাছে মনে হচ্ছে আপনার যে কোথাও পুরো ডেটা ঘনত্বের প্রয়োজন হবে না। আপনি কি এলওডি বিবেচনা করেছেন?
সাম হোচেভার

1
আপনার সংযুক্ত দ্বিতীয় পদ্ধতিরটি ভাল বলে মনে হচ্ছে, আপনি আপডেট করেছেন এমন একটি গতিশীল ভার্টেক্স বাফার ব্যবহার করছেন বা আপনি প্রতিবার একটি নতুন তৈরি করছেন?

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

1
জিপিইউর জন্য যদি উল্লম্বের সংখ্যাটি খুব বড় হয়ে যায় তবে আপনি নিজের ইনপুটগুলি নিখরচায় করার চেষ্টা করতে পারেন - যখন আপনার স্ক্রিন কয়েক হাজার পিক্সেল প্রশস্ত হতে চলেছে তখন আপনাকে একক বক্ররেখার জন্য কয়েক মিলিয়ন লাইন বিভাগের প্রয়োজন নেই really সর্বাধিক হিসাবে.

উত্তর:


16

আপনি যদি Y = f(X)কেবল গ্রাফগুলি সরবরাহ করতে চলেছেন তবে আমি নিম্নলিখিত পদ্ধতিটি চেষ্টা করার পরামর্শ দিচ্ছি।

বক্ররেখা ডেটা টেক্সচার ডেটা হিসাবে পাস করা হয় , এটি অবিরাম করে তোলে এবং glTexSubImage2Dউদাহরণস্বরূপ আংশিক আপডেটের অনুমতি দেয় । আপনার যদি স্ক্রলিংয়ের প্রয়োজন হয় তবে আপনি এমনকি একটি বিজ্ঞপ্তি বাফার বাস্তবায়ন করতে পারেন এবং প্রতি ফ্রেমে কয়েকটি মান আপডেট করতে পারেন। প্রতিটি বক্ররেখাকে ফুলস্ক্রিন কোয়াড হিসাবে উপস্থাপন করা হয় এবং সমস্ত কাজ পিক্সেল শেডার দ্বারা সম্পন্ন হয়।

এক-উপাদান উপাদানের বিষয়বস্তুগুলি এর মতো দেখতে পারে:

+----+----+----+----+
| 12 | 10 |  5 | .. | values for curve #1
+----+----+----+----+
| 55 | 83 | 87 | .. | values for curve #2
+----+----+----+----+

পিক্সেল শেডারটির কাজ নিম্নরূপ:

  • ডেটাসেট স্পেসে বর্তমান টুকরাটির এক্স স্থানাঙ্ক সন্ধান করুন
  • যেমন ধরুন। 4 নিকটতম ডেটা পয়েন্টগুলির কাছে ডেটা রয়েছে; উদাহরণস্বরূপ যদি এক্স মান 41.3এটা চয়ন করবে 40, 41, 42এবং 43
  • 4 ওয়াইয়ের মানগুলির জন্য টেক্সচারটি জিজ্ঞাসা করুন (নিশ্চিত করুন যে নমুনা কোনও প্রকারের কোনও বিভাজন করে না)
  • X,Yজোড়াগুলি স্ক্রিন স্পেসে রূপান্তর করুন
  • বর্তমান খণ্ড থেকে তিনটি বিভাগ এবং চারটি পয়েন্টের প্রত্যেকটির দূরত্ব গণনা করুন
  • বর্তমান খণ্ডটির জন্য একটি আলফা মান হিসাবে দূরত্বটি ব্যবহার করুন

আপনি সম্ভাব্য জুম স্তরের উপর নির্ভর করে বৃহত্তর মান সহ 4 টি বিকল্প দিতে চান।

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

রেখাচিত্র

একটি স্পষ্ট সুবিধা হ'ল স্থানান্তরিত ডেটার পরিমাণ খুব কম, এবং ড্রকলের সংখ্যা কেবল একটি।


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

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

চিয়ারস @ সামহোসেভর - আমি এটি দিয়ে যাব। আমি একটি ওপেনএল উদাহরণ মনের সংকলন করে কিছুক্ষণ হয়ে গেল! :-)
ডাঃ এবিটি

উত্তর হিসাবে চিহ্নিত করা, যদিও আমি টেক্সচার লোড ব্যবহার করছি না, আপনি একটি বাস্তব ওপেনএল উদাহরণ উপস্থাপন করেছেন যা একটি পিক্সেল শেডাররে লাইন আঁকতে পারে এবং আমাদের সঠিক দিকে নিয়ে যেতে পারে !! :)
ডাঃ এবিটি

4

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

এর অর্থ গ্রাফের প্রতিটি লাইন বিভাগকে আলাদা কোয়াড হিসাবে অঙ্কন করা উচিত, তবে ডি 3 ডি 11-এ আপনি অবশ্যই জ্যামিতি শেডার ব্যবহার করতে পারেন এবং / অথবা কোয়াডগুলি উত্পন্ন করতে ইনস্ট্যান্সিং করতে পারেন, জিপিইউতে ডেটা পরিমাণ হ্রাস করে কেবল ডেটা পয়েন্টে স্থানান্তরিত করতে পারে নিজেদের. আমি সম্ভবত ভার্টেক্স / জ্যামিতি শেডার দ্বারা পড়ার জন্য স্ট্রাকচারড বাফার হিসাবে ডেটা পয়েন্টগুলি সেট আপ করব, তারপরে একটি অঙ্ক কল করব যাতে অংশগুলি আঁকতে হবে spec কোনও আসল ভারটেক্স বাফার থাকবে না; ভার্টেক্স শ্যাডারটি কোন ডেটা পয়েন্টটি দেখতে হবে তা নির্ধারণ করতে কেবল এসভি_ ভারটেক্সিড বা এসভি_আইন্সট্যান্সআইডি ব্যবহার করবে।


আরে ধন্যবাদ - হ্যাঁ আমি এই নিবন্ধটি সম্পর্কে অবগত রয়েছি, দুর্ভাগ্যক্রমে এর সাথে কোনও উত্স কোড নেই :-( জিওশাডার + ফ্রেগশ্যাডারের ভিত্তি এই ধরণের কাজের জন্য বিজয়ী বলে মনে হচ্ছে the জিপিইউতে দক্ষতার সাথে ডেটা প্রাপ্ত করা হবে কৌতুকপূর্ণ অংশ!
ডাঃ এবিটি

আরে @ নাথনরিড এদিকে ফিরে যাচ্ছি - আমি যদি জ্যামিতি শেডার বা কোয়াডগুলি আঁকার জন্য ইনস্ট্যান্সিং ব্যবহার করি তবে পয়েন্ট 1 / পয়েন্ট 2 কোয়াডের বিপরীত কোণে, পিক্সেল শ্যাডারে কীভাবে আমি পিটি 1 এবং পিটি 2 এর মধ্যবর্তী লাইনের দূরত্ব গণনা করতে পারি? পিক্সেল শেডারটির কি ইনপুট জ্যামিতির জ্ঞান আছে?
ডাঃ এবিটি

@ ড্যাবএবিটি গাণিতিক লাইনের প্যারামিটারগুলি ইন্টারপোলটারগুলির মাধ্যমে পিক্সেল শেডারে নামিয়ে দিতে হবে। পিক্সেল শেডারটির জ্যামিতিতে সরাসরি অ্যাক্সেস নেই।
নাথান রেড

আমি দেখছি, জ্যামিতি শেডার থেকে আউটপুট পাঠিয়ে বা ইনস্ট্যান্সিং করে এটি করা যায়? অতিরিক্ত credit ণের
ডাঃ এবিটি

@ ডাবিএবিটি ঠিক একইভাবে টেক্সচারের স্থানাঙ্ক, সাধারণ ভেক্টর এবং সমস্ত ধরণের জিনিস সাধারণত পিক্সেল শেডারকে প্রেরণ করা হয় - ভার্টেক্স / জ্যামিতি শেডার থেকে আউটপুট লিখে পিক্সেল শেডারকে ইনপুট দেয়।
নাথন রিড

0

@ ডাবিএবিটি - এর জন্য ক্ষমা প্রার্থনা একটি উত্তর, উত্তর নয়। আমি উপরের স্যাম হোসেভারের উত্তরটির মধ্যে এটি জিজ্ঞাসার কোনও উপায় খুঁজে পাইনি।

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


যেহেতু আপনি এটির উত্তর জানেন না দয়া করে সম্পাদনা করুন এবং একটি মন্তব্য হিসাবে রাখুন
মফিস্টনএক্স

আমি এটি করার চেষ্টা করছিলাম তবে আসল পোস্টে কোনও "মন্তব্য মন্তব্য" বাটন নেই।
এর্কগীক

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

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

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