সিপিইউ - জিপিইউ মেমরি ডেটা প্রবাহ [বন্ধ]


16

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

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

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

সম্পাদনা: আমি একটি পার্থক্য করতে ভুলে গেছি: এখানে জিপিইউতে ডেটা পাঠানো হচ্ছে এবং বাফারগুলিকে বর্তমান হিসাবে সেট / বাঁধাই রয়েছে । পরবর্তী কি কোনও ডেটা প্রবাহ ঘটায়?

সম্পাদনা 2: রক্সওয়ানের পোস্টটি পড়ার পরে আমি কয়েকটি ক্রিয়াটি আলাদা করতে চাই:

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

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

@ পোলার - ঠিক না জিএল প্রকৃতপক্ষে কোন মেমরিটিতে কোনও বাফার অবজেক্টটি সঞ্চিত রয়েছে তা নির্দিষ্ট করে না এবং ব্যবহারের ধরণের ভিত্তিতে রানটাইমে এটিকে প্রায় সরানোর জন্যও নিখরচায়। জিএল ৪.৪ এটিকে কিছুটা সম্বোধন করে, তবে নোট করে যে শেষ পর্যন্ত এটি সবচেয়ে ভাল সরবরাহ করতে পারে "" সেই নির্বোধ ইঙ্গিতগুলির মধ্যে একটি "; দেখতে opengl.org/registry/specs/ARB/buffer_storage.txt এবং বিশেষ করে সমস্যা 2 এবং 9
ম্যাক্সিমাস minimus

1
@ জিমিশেল্টার আহ, ধন্যবাদ - যদি আমাদের "এইসব মূর্খ ইঙ্গিতগুলি" কম থাকে এবং আরও কংক্রিটের বিশদ বিবরণ না হয় তবে এটি ভাল হবে।
পোলার

@ পোলার - কী বিরক্তিকর তা হ'ল এআরবি_ফুফার_ স্টোরেজ অন্য একটি ইঙ্গিত সহ এড়াতে পারত , তবে ডিজাইনাররা সুযোগটি হাতছাড়া করলেন। ওহ ভাল, সম্ভবত 4.5 শেষ পর্যন্ত এটি সঠিক হবে।
ম্যাক্সিমাস মিনিমাস

2
উত্তরগুলি "প্রতিক্রিয়া" দিতে দয়া করে আপনার প্রশ্নগুলি সম্পাদনা করবেন না। পরিবর্তে একটি নতুন প্রশ্ন পোস্ট করুন।

উত্তর:


12

এর ডেটা কি কেবল একবার জিপিইউ মেমরিতে প্রেরণ করে সেখানে চিরতরে বসে থাকে?

সাধারণত হ্যাঁ, তবে ড্রাইভারটি "সর্বোত্তম" যা করতে পারে তা নির্দ্বিধায়, ডেটা ভিআরএএম বা র‍্যামে সঞ্চিত থাকতে পারে বা কেবল এখানে ক্যাশে রাখা যেতে পারে এটি একটি অ্যাট্রিকল যা ব্যাখ্যা করে যে ভিবিও প্রবাহের সাথে আসলে কী ঘটে ।

উদাহরণস্বরূপ, যদি এটি একটি ডায়নামিক ওপেনজিএল বাফার হিসাবে চিহ্নিত করা হয় (যেমন ভিবিও), এটি র‍্যামে সঞ্চিত হওয়ার সম্ভাবনা বেশি। জিপিইউ সিপিইউয়ের হস্তক্ষেপ ছাড়াই সরাসরি র‌্যাম অ্যাক্সেসের জন্য ডাইরেক্ট মেমোরি অ্যাক্সেস (ডিএমএ) ব্যবহার করে, এটি গ্রাফিক্স কার্ড এবং গ্রাফিক্স ড্রাইভারের ডিএমএ নিয়ামক দ্বারা নিয়ন্ত্রিত হয় এবং কার্নেল মোডে কার্যকর করা হয়।

যখন মডেলটি প্রতিটি ফ্রেমে প্রকৃতপক্ষে রেন্ডার হয়ে যায় তখন জিপিইউ প্রসেসরগুলিকে কি জিপিইউ মেমরি থেকে প্রতিটি সময় তার ডেটা আনতে হবে, এমনকি যদি কোনও মডেল একাধিক অনুক্রমিক বার উপস্থাপন করে?

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

স্পষ্টতই গ্রাফিক্স কার্ডগুলিতে সীমিত র‍্যাম রয়েছে - যখন এটি 1 ফ্রেমের রেন্ডারিংয়ের জন্য প্রয়োজনীয় সমস্ত মডেল ডেটা ধরে রাখতে পারে না আমার ধারণা এটি প্রতিটি ফ্রেমে সিপিইউ র্যাম থেকে এটি আনতে (কিছু কিছু) রাখে, এটা কি সঠিক?

আপনি এটা চান না। তবে তা যদি হয় তবে জিপিইউ র‌্যাম এবং ভিআরএএম (জিপিইউ-তে কমান্ড প্রসেসর এর জন্য দায়ী) এর মধ্যে মেমরি সরিয়ে নেওয়া শুরু করবে যা জিপিইউ স্টল করার জন্য অনেক ধীর রেন্ডারিং করবে, কারণ এটি ডেটার জন্য অপেক্ষা করতে হবে ভি / র‍্যাম থেকে অনুলিপি করতে হবে।

সেখানে জিপিইউতে ডেটা পাঠানো হচ্ছে এবং বাফারগুলিকে বর্তমান হিসাবে সেট / বাঁধাই রয়েছে। পরবর্তী কি কোনও ডেটা প্রবাহ ঘটায়?

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

এটি গ্লোব্যাগিন / গ্ল্যান্ডকে অবমূল্যায়ন করার কারণগুলির মধ্যে একটি, নতুন কমান্ড জমা দেওয়ার জন্য সারি সমন্বয় প্রয়োজন (মেমরি বেড়া / বাধা ব্যবহার করে)।

এখানে চিত্র বর্ণনা লিখুন

আপনার অন্যান্য বিষয় হিসাবে:

সূচনা সহ বাফার সৃষ্টি

আপনি আরম্ভ না করে একটি বাফার বরাদ্দ করতে পারেন এবং এটি পরবর্তী ব্যবহারের জন্য রাখতে পারেন। অথবা আপনি এটিকে একটি বাফার বরাদ্দ করতে পারেন এবং একই সাথে ডেটা অনুলিপি করতে পারেন (এপিআই স্তর সম্পর্কে কথা বলছেন)।

বাফার ডেটা আপডেট

আপনি জিপিইউ সাইডে মেমরি আপডেট করতে glMapBuffer ব্যবহার করতে পারেন। মেমরিটি / র‌্যাম থেকে র‌্যামিতে অনুলিপি করা হবে কিনা তা আসলে স্ট্যান্ডার্ডের তুল্য নয় এবং এটি বিক্রেতা, জিপিইউ টাইপ এবং ড্রাইভারের উপর নির্ভর করে ব্যাপকভাবে পরিবর্তিত হবে।

এপিআই ড্র কল (এখানে আমি আসলে কী ঘটে তা আপনার কাছ থেকে শুনতে চাই)।

মূল প্রশ্নের আমার দ্বিতীয় বিষয়টি এটিকে অন্তর্ভুক্ত করে।

বাফারটিকে সক্রিয় হিসাবে আবদ্ধ করা (এটি কি কেবলমাত্র API কে বলার উপায় যে আমি এই বাফারটিকে> পরবর্তী ড্র কলটিতে রেন্ডার করতে চাই এবং এটি নিজে থেকে কিছু করে না?)

যে thisকোনও অবজেক্ট ওরিয়েন্টেড ভাষায় পয়েন্টার ব্যবহার হিসাবে বাঁধাইয়ের কথা ভাবেন , যদিও কঠোরভাবে একই রকম নয়, যে কোনও এপিআই কলগুলি সেই বাইন্ড বাফারের সাথে সম্পর্কিত।


3

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

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

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

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

জিপিইউতে প্রকৃত ডেটা প্রেরণ করা আপনার ব্যবহৃত এপিআই (ডাইরেক্টেক্স / ওপেনগেল বা অন্যান্য) দ্বারা সম্পন্ন করা হয় এবং বাইন্ডিং এবং এ জাতীয় স্টাফের ধারণাটি কেবল বিমূর্ততা যাতে আপনি কী করতে চান তা API বুঝতে পারে।

সম্পাদনার জন্য সম্পাদনা করুন:

  • buffer creation with initialisation: এটি int এর মধ্যে পার্থক্যের মতো a = new int[10]এবং a[0] = 0,a[1] = 1.... etc যখন আপনি একটি বাফার তৈরি করেন আপনি ডেটা এবং আপনার যখন ডেটা শুরু করেন তখন আপনি নিজের পছন্দসই জিনিসটি রাখেন।

  • buffer data updateযদি এটি সিপিইউ র‌্যামে থাকে তবে আপনার vertex * verticesসাথে এটি খেলতে পারবেন, যদি এটি না থাকে তবে আপনাকে এটি জিপিইউ থেকে সরিয়ে নিতে হবে vertex * vertices = map(buffer_id);(মানচিত্রটি একটি পৌরাণিক ক্রিয়া যা জিপিইউ থেকে সিপিইউ র্যামে ডেটা সরিয়ে নেওয়া উচিত, এটিরও এটি অপোসাইট রয়েছে) buffer_id = create_buffer(vertices);

  • binding the buffer as activeএটি কেবলমাত্র একটি ধারণা যে তারা bindingরেন্ডারিংকে বলে একটি জটিল প্রক্রিয়া এবং এটি 10000 পরামিতি সহ কোনও ফাংশন কল করার মতো। বাইন্ডিংটি কেবলমাত্র একটি শব্দ যা তারা বাফার কোথায় যায় তা জানাতে ব্যবহৃত হয়েছিল। এই পদটির পিছনে কোনও আসল যাদু নেই, এটি রূপান্তর করে না বা সরিয়ে দেয় না বা রিফলোক্ট করে বাফার করে, কেবল ড্রাইভারকে বলে যে পরবর্তী ড্রতে এই বাফারটি ব্যবহার করুন use

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


2

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

এর ডেটা কি কেবল একবার জিপিইউ মেমরিতে প্রেরণ করে সেখানে চিরতরে বসে থাকে?

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

আপনার বিল্ডিংয়ের ক্ষেত্রে, ভার্টেক্স তথ্য কেবল সেখানে বসে থাকবে এবং পরিবর্তিত হওয়া একমাত্র জিনিসটি আপনার ম্যাট্রিক (মডেল / ওয়ার্ল্ড, প্রজেকশন এবং দেখুন) view

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

যখন মডেলটি প্রতিটি ফ্রেমে প্রকৃতপক্ষে রেন্ডার হয়ে যায় তখন জিপিইউ মেমরি থেকে জিপিইউ প্রসেসরগুলিকে প্রতিবার তার ডেটা আনতে হবে? আমার অর্থটি হ'ল - যদি আমি প্রতিটি 2 টি মডেল প্রতি একাধিকবার রেন্ডার করতাম - তবে আমি প্রথমে প্রথম একাধিকবার এবং তারপরে দ্বিতীয়টি একাধিকবার উপস্থাপন করলাম তা বিবেচনা করবে বা আমি যদি প্রথমটি কেবল একবার একবার উপস্থাপন করি তবে দ্বিতীয়টি কেবল একবার এবং এভাবে ইন্টারলিভ করে রেখেছি?

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

স্পষ্টতই গ্রাফিক্স কার্ডগুলিতে সীমিত র‍্যাম রয়েছে - যখন এটি 1 ফ্রেমের রেন্ডারিংয়ের জন্য প্রয়োজনীয় সমস্ত মডেল ডেটা ধরে রাখতে পারে না আমার ধারণা এটি প্রতিটি ফ্রেমে সিপিইউ র্যাম থেকে এটি আনতে (কিছু কিছু) রাখে, এটা কি সঠিক?

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

আমি একটি পার্থক্য করতে ভুলে গেছি: এখানে জিপিইউতে ডেটা পাঠানো হচ্ছে এবং বাফারগুলিকে বর্তমান হিসাবে সেট / বাঁধাই রয়েছে। পরবর্তী কি কোনও ডেটা প্রবাহ ঘটায়?

কোনও উল্লেখযোগ্য ডেটা প্রবাহ নয়, না। এটির জন্য কিছু ব্যয় রয়েছে, তবে আপনার লেখার কোডের প্রতিটি লাইনের জন্য এটি সত্য। আপনার কতটা ব্যয় হয় তা আবার খুঁজে বের করা, আবার কোনটি প্রোফাইলিংয়ের জন্য।

সূচনা সহ বাফার সৃষ্টি

রাকসওয়ানের উত্তর ভাল লাগছে, তবে এটি মোটেও সঠিক নয়। ওপেনজিএলে, বাফার তৈরি করা কোনও স্থান সংরক্ষণ করে না । আপনি যদি কোনও ডেটা ছাড়াই স্থান সংরক্ষণ করতে চান তবে আপনি glBufferData কল করতে পারেন এবং কেবল নাল পাস করতে পারেন। ( এখানে নোট বিভাগ দেখুন ।)

বাফার ডেটা আপডেট

আমি অনুমান করছি আপনার মানে গ্লুফারডাটা, বা এর মতো অন্যান্য ফাংশন, তাই না? এখানেই আসল ডেটা স্থানান্তর ঘটে। (যদি আপনি নাল পাস না করেন, যেমন আমি কেবল শেষ অনুচ্ছেদে বলেছি))

বাফারটিকে সক্রিয় হিসাবে আবদ্ধ করা (এটি কি কেবলমাত্র API কে বলার উপায় যে আমি চাইছি যে এই বাফারটি পরবর্তী ড্র কলটিতে রেন্ডার করা হবে এবং এটি নিজে থেকে কিছুই করে না?)

হ্যাঁ, তবে এটি এর চেয়ে আরও কিছু বেশি করতে পারে। উদাহরণস্বরূপ, আপনি যদি কোনও ভিএও (ভার্টেক্স অ্যারে অবজেক্ট) আবদ্ধ করেন, তবে একটি ভিবিওকে আবদ্ধ করুন, যা ভিবিও ভিএও-তে আবদ্ধ হয়ে যায়। পরে, আপনি যদি সেই ভিএও কে আবার বেঁধে রাখেন এবং glDrawArrays কল করেন, তবে ভিবিও কী আঁকতে হবে তা তা জানতে পারবে।

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

এপিআই ড্র কল

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


"তারপরে সমস্যার সমাধান হয়েছে" হ্যাঁ, তাত্ক্ষণিকতা অনেক সাহায্য করবে তবে এটি না করেই প্রতিটি অবজেক্টের জন্য আমাকে ড্র কল করতে হবে। উভয় ক্ষেত্রে একই amout। সুতরাং আমি বিস্মিত যদি আদেশ বিবেচনা করে।
এনপিএস

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