গ্রাফিক্সের সাথে ডিল করার সময় আমি প্রায়শই অকালমালিকল্পিত অপটিম্যাজেশন করি। আমি সর্বদা কয়েকটি নীতি অনুসরণ করার চেষ্টা করি:
- ডি 3 ডি উপাদানগুলির সংখ্যা সর্বনিম্ন রাখুন। (রেন্ডার স্টেটস, বাফার, শেডার ইত্যাদি)
- একেবারে প্রয়োজনীয় হলে কেবল উপাদানগুলি আবদ্ধ করুন। (ইতিমধ্যে আবদ্ধ নয়)
- যতটা সম্ভব উপাদানগুলি বিশেষজ্ঞ করুন। (কেবলমাত্র প্রয়োজনীয় বাইন্ডফ্লাগগুলি সেট করুন)
এটি তৈরি উপাদান এবং বর্তমান পাইপলিং অবস্থা পরিচালনার জন্য আমাকে খুব বিস্তৃত মোড়ক তৈরি করতে পরিচালিত করে। এটি কেবল আমার মূল্যবান বিকাশের সময়কেই গ্রাস করে না, এটি জটিলতার আরও একটি বড় স্তর যুক্ত করে।
এবং সবচেয়ে খারাপ: আমি জানি না যে এটি সমস্ত সমস্যার জন্য মূল্যবান।
আমার কিছু অপ্টিমাইজেশন বিবেচনা ইতিমধ্যে নিম্ন স্তরে প্রয়োগ করা যেতে পারে এবং আমি কেবল সেগুলিই প্রতিলিপি করছি, অতিরিক্তভাবে সিপিইউতে সময় নষ্ট করছি। অন্যান্য বিবেচনাগুলি সম্পূর্ণ অপ্রয়োজনীয় হতে পারে, যেহেতু পারফরম্যান্সের উপর প্রভাব নগণ্য।
সুতরাং আমার প্রশ্নগুলি হ'ল:
- উপরোক্ত দিকনির্দেশগুলির মধ্যে কোনটি বৈধ এবং আমার কতটা পরিমাণে সেগুলি অনুসরণ করা উচিত?
- জিপিইউ হ্যান্ডেল রাষ্ট্রের পরিবর্তন কীভাবে হয়?
- যদি আমি এমন কোনও রাষ্ট্র পরিবর্তন করি যা কখনই ব্যবহৃত হয় না? (এটি সক্রিয় থাকাকালীন কোনও কল কল করা হচ্ছে না))
- বিভিন্ন বিভিন্ন উপাদানকে বাঁধাই করার জন্য প্রকৃত পারফরম্যান্সের জরিমানাগুলি কী কী?
- অন্যান্য কোন পারফরম্যান্স বিবেচনা করা উচিত?
দয়া করে কেবল আমাকে বলবেন না, যতক্ষণ না আমি আসল সীমাটি না আঘাত করি ততক্ষণ আমার পারফরম্যান্সের বিষয়ে চিন্তা করা উচিত নয়। যদিও এটি ব্যবহারিক দৃষ্টিকোণ থেকে স্পষ্টতই সত্য, তবে আমি মূলত তত্ত্বটির প্রতি আগ্রহী। সর্বোপরি গ্রাফিক্স কাঠামো তৈরির তাগিদকে লড়াই করার জন্য আমার একরকম প্রয়োজন এবং আমি মনে করি না যে আমি সাধারনত "অকাল অপ্টিমাইজেশন বক্তৃতা" দিয়ে তা করতে পারি।
উপাদান পরিচালনা করা
আমি বর্তমানে পরিচালিত মোড়ক হিসাবে স্লিমডিএক্স ব্যবহার করে সি # তে ডাইরেক্টএক্স 11 অ্যাপ্লিকেশন লিখছি। এটি খুব নিম্ন স্তরের মোড়ক এবং আমার বর্তমান বিমূর্তি এটির উপরে নির্মিত।
ডাইরেক্ট 3 ডি বিমূর্ততা ব্যবহার করার সময় কিছু সুস্পষ্ট সুবিধা রয়েছে। পরিবেশ স্থাপন, শেডার লোড করা, ধ্রুবক স্থাপন করা এবং একটি জাল অঙ্কন করা অনেক সহজ এবং অনেক কম কোড ব্যবহার করে। এছাড়াও, যেহেতু এটি বেশিরভাগ উপাদানগুলি তৈরি এবং নিষ্পত্তি পরিচালনা করে সেগুলি স্বয়ংক্রিয়ভাবে সর্বত্র পুনরায় ব্যবহার করা যেতে পারে এবং আমি প্রায় সম্পূর্ণরূপে মেমরি ফাঁসগুলি এড়িয়ে চলে।
- আপনি সাধারণত সমস্ত গ্রাফিক্স উপাদান এবং সংস্থানগুলি কীভাবে পরিচালনা করেন?
- আপনি কি নীচের আমার উদাহরণের অনুরূপ কিছু পরিচালিত মোড়ক দেওয়ার পরামর্শ দিতে পারেন?
আমার বর্তমান প্রয়োগের একটি উদাহরণ এখানে 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();
}