গ্রাফিকের অবস্থা এবং উপাদানগুলি পরিচালনা করছেন?


11

গ্রাফিক্সের সাথে ডিল করার সময় আমি প্রায়শই অকালমালিকল্পিত অপটিম্যাজেশন করি। আমি সর্বদা কয়েকটি নীতি অনুসরণ করার চেষ্টা করি:

  • ডি 3 ডি উপাদানগুলির সংখ্যা সর্বনিম্ন রাখুন। (রেন্ডার স্টেটস, বাফার, শেডার ইত্যাদি)
  • একেবারে প্রয়োজনীয় হলে কেবল উপাদানগুলি আবদ্ধ করুন। (ইতিমধ্যে আবদ্ধ নয়)
  • যতটা সম্ভব উপাদানগুলি বিশেষজ্ঞ করুন। (কেবলমাত্র প্রয়োজনীয় বাইন্ডফ্লাগগুলি সেট করুন)

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

এবং সবচেয়ে খারাপ: আমি জানি না যে এটি সমস্ত সমস্যার জন্য মূল্যবান।

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

সুতরাং আমার প্রশ্নগুলি হ'ল:

  1. উপরোক্ত দিকনির্দেশগুলির মধ্যে কোনটি বৈধ এবং আমার কতটা পরিমাণে সেগুলি অনুসরণ করা উচিত?
  2. জিপিইউ হ্যান্ডেল রাষ্ট্রের পরিবর্তন কীভাবে হয়?
  3. যদি আমি এমন কোনও রাষ্ট্র পরিবর্তন করি যা কখনই ব্যবহৃত হয় না? (এটি সক্রিয় থাকাকালীন কোনও কল কল করা হচ্ছে না))
  4. বিভিন্ন বিভিন্ন উপাদানকে বাঁধাই করার জন্য প্রকৃত পারফরম্যান্সের জরিমানাগুলি কী কী?
  5. অন্যান্য কোন পারফরম্যান্স বিবেচনা করা উচিত?

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

উপাদান পরিচালনা করা

আমি বর্তমানে পরিচালিত মোড়ক হিসাবে স্লিমডিএক্স ব্যবহার করে সি # তে ডাইরেক্টএক্স 11 অ্যাপ্লিকেশন লিখছি। এটি খুব নিম্ন স্তরের মোড়ক এবং আমার বর্তমান বিমূর্তি এটির উপরে নির্মিত।

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

  1. আপনি সাধারণত সমস্ত গ্রাফিক্স উপাদান এবং সংস্থানগুলি কীভাবে পরিচালনা করেন?
  2. আপনি কি নীচের আমার উদাহরণের অনুরূপ কিছু পরিচালিত মোড়ক দেওয়ার পরামর্শ দিতে পারেন?

আমার বর্তমান প্রয়োগের একটি উদাহরণ এখানে is ইন্টারফেসটি নিয়ে আমি বেশ খুশি। এটিতে আমার প্রয়োজনের জন্য যথেষ্ট নমনীয়তা রয়েছে এবং এটি ব্যবহার এবং বুঝতে খুব সহজ:

// Init D3D environment
var window = new RenderForm();
var d3d = new Direct3D(window, GraphicsSettings.Default);
var graphics = new GraphicsManager(d3d.Device);

// Load assets
var mesh = GeometryPackage.FromFile(d3d, "teapot.gp");
var texture = Texture.FromFile(d3d, "bricks.dds");

// Render states
graphics.SetViewports(new Viewport(0, 0, 800, 600);
graphics.SetRasterizer(wireFrame: false, culling: CullMode.Back);
graphics.SetDepthState(depthEnabled: true, depthWriteEnabled: true);
graphics.SetBlendState(BlendMethod.Transparency);

// Input layout
graphics.SetLayout("effect.fx", "VS", "vs_4_0",
    new InputElement("POSITION", 0, Format.R32G32B32_Float, 0),
    new InputElement("TEXCOORD", 0, Format.R32G32_Float, 0)
);

// Vertex shader
graphics.SetShader(Shader.Vertex, "effect.fx", "VS", "vs_4_0");
graphics.SetConstants(Shader.Vertex, 0, 4, stream => stream.Write(wvpMatrix));

// Pixel shader
graphics.SetShader(Shader.Pixel, "effect.fx", "PS", "ps_4_0");
graphics.SetTexture(Shader.Pixel, 0, texture);
graphics.SetSampler(Shader.Pixel, 0, Sampler.AnisotropicWrap);
graphics.SetConstants(Shader.Pixel, 0, 1, stream => stream.Write(new Color4(1, 0, 1, 0);

d3d.Run(() =>
{
    // Draw and present
    d3d.BackBuffer.Clear(new Color4(1, 0, 0.5f, 1));
    graphics.SetOutput(d3d.BackBuffer);
    graphics.Draw(mesh);
    d3d.Present();
}

8
এই জাতীয় প্রশ্নের জন্য আমি "অকাল অপ্টিমাইজেশন" বক্তৃতা দেব না, আমি আপনাকে "প্রোফাইল পরিবর্তনগুলি দিয়েছি যাতে আপনি নিজের জন্য দেখতে পারেন" বক্তৃতা দেই।
টেট্রাড

@ টেট্রাড আমি স্বীকার করতে প্রায় লজ্জা পেয়েছি যে এটি বেশ সুন্দর শালীন পরামর্শ। আমার অবশ্যই আরও প্রোফাইলিং করা উচিত।
লুসিয়াস

1
প্রোফাইলিং সংখ্যাগুলি হ'ল "ছবিগুলি বা এটি ঘটেছিল না" এর গেমদেব সংস্করণ = নিশ্চিত))
প্যাট্রিক হিউজেস

উত্তর:


3

আমি গেমদেব.টনে এই থ্রেডগুলিতে হজম্যান দ্বারা বর্ণিত বিমূর্ততা পদ্ধতির পছন্দ:

তিনি একটি ত্রি-স্তরের রেন্ডারিং সিস্টেম বর্ণনা করেছেন:

  1. নিম্ন-স্তরের রেন্ডারিং এপিআই যা "কমান্ডগুলি" গ্রহণ করে, বিভিন্ন গ্রাফিক্সের এপিআই এর যেমন ডাইরেক্ট 3 ডি 9, ডাইরেক্ট 3 ডি 11, এবং ওপেনজিএল থেকে ভিন্নতার চেয়ে বেশি বিমূর্ত হয় না। প্রতিটি "কমান্ড" মানচিত্রের একটি পৃথক স্থানে বা ড্র-কল, যেমন একটি শীর্ষ প্রান্ত বা টেক্সচার বাঁধাই বা আদিম অঙ্কন।
  2. এপিআই যা "আইটেমগুলি রেন্ডার করে" স্বীকার করে, যা সমস্ত রাজ্যকে একত্রে গ্রুপ করে এবং নির্দিষ্ট বস্তুকে রেন্ডার করার জন্য একক ড্র কল কল করে এবং বাছাই করে এবং সেগুলি প্রথম স্তরে প্রেরিত আদেশগুলিতে অনুবাদ করে। একটি রেন্ডার রাষ্ট্রের মধ্যে একটি ড্র-কল এবং "রাষ্ট্রীয় গোষ্ঠী" একটি স্ট্যাক থাকে, যা যৌক্তিকভাবে রাষ্ট্র-পরিবর্তনগুলিকে গ্রুপ করে। উদাহরণস্বরূপ, রেন্ডার পাসের জন্য আপনার কাছে একটি রাষ্ট্রীয় গোষ্ঠী, পদার্থের জন্য একটি রাষ্ট্রীয় গোষ্ঠী, জ্যামিতির জন্য একটি রাজ্য গোষ্ঠী, উদাহরণস্বরূপ একটি রাজ্য গোষ্ঠী এবং আরও অনেক কিছু রয়েছে। এই স্তরটি অনর্থক রাষ্ট্রের পরিবর্তনগুলি হ্রাস করার জন্য এই রেন্ডার আইটেমগুলিকে বাছাই করার জন্য এবং বাস্তবে নিরর্থক যে কোনও রাজ্যের পরিবর্তনগুলি মুছে ফেলার জন্য দায়ী।
  3. একটি দৃশ্যের গ্রাফ বা জিইউআই রেন্ডারারের মতো উচ্চ-স্তরের সিস্টেমগুলি যা দ্বিতীয় স্তরে রেন্ডার আইটেমগুলি প্রেরণ করে। গুরুত্বপূর্ণ বিষয়টি লক্ষ্য করার বিষয়টি হ'ল এই সিস্টেমগুলি স্টেটের বাছাই করা অ্যালগরিদম বা নির্দিষ্ট রেন্ডারিং এপিআই সম্পর্কে জানে না, এগুলিকে সম্পূর্ণ প্ল্যাটফর্ম-অজোনস্টিক করে তোলে। নিম্ন-স্তরের এপিআই প্রয়োগ হয়ে গেলে এগুলি ব্যবহার করাও সহজ।

উপসংহারে, এই মডেলটি আপনার উভয় সমস্যার একসাথে সমাধান করে।

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