এক্সএনএ এফেক্ট প্যারামিটার সেট করার জন্য সেরা অনুশীলন


13

আমি জিজ্ঞাসা করতে চাই যে Effectএক্সএনএ-তে পরামিতিগুলি নির্ধারণের জন্য সর্বোত্তম অনুশীলন আছে কি না। বা অন্য কথায়, আমি ফোন করলে ঠিক কী ঘটে pass.Apply()। আমি একাধিক পরিস্থিতি কল্পনা করতে পারি:

  1. প্রতিটি সময় Applyবলা হয়, সমস্ত ইফেক্ট প্যারামিটারগুলি জিপিইউতে স্থানান্তরিত হয় এবং এর জন্য এটির কোনও প্রকৃত প্রভাব নেই যে আমি কতবার প্যারামিটার সেট করি।
  2. প্রতিটি সময় Applyবলা হয়, কেবলমাত্র পুনরায় সেট করা প্যারামিটারগুলি স্থানান্তরিত হয়। সুতরাং সেট-অপারেশনগুলি ক্যাশে করা যা আসলে কোনও নতুন মান সেট করে না তা এড়ানো উচিত।
  3. প্রতিটি সময় Applyবলা হয়, পরিবর্তিত হয়ে যাওয়া প্যারামিটারগুলি কেবল স্থানান্তরিত হয়। সুতরাং সেট-অপারেশনগুলি ক্যাচিং অকেজো।
  4. এই পুরো প্রশ্নগুলি বুটহীন কারণ কোনওভাবেই উল্লেখ করা উপায়গুলির গেমের পারফরম্যান্সে কোনও উল্লেখযোগ্য প্রভাব নেই।

সুতরাং চূড়ান্ত প্রশ্ন: সেট ক্রিয়াকলাপের কিছু ক্যাশে প্রয়োগ করা কি কার্যকর:

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

দলিল ধন্যবাদ আপনাকে.


আমি এক্সটিএনএর তুলনায় এটি নিম্ন-স্তরের কার্যকারিতা ভিত্তিতে ডাইরেক্টএক্স ট্যাগ যুক্ত করেছি।
অ্যান্ড্রু রাসেল

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

উত্তর:


8

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

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

(যেহেতু পরিস্থিতি # 2 একটি সম্ভাবনা, তাই সম্ভবত পরিবর্তন করা হয়নি এমন পরামিতিগুলি ইচ্ছাকৃতভাবে পুনরায় সেট করা ভাল নয় ))

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

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

এছাড়াও, তুলনা Matrixসঙ্গে ==খারাপ জাদু হয়। একজন Matrixগঠিত floats, এবং ফ্লোটিং পয়েন্ট সমতা তুলনা অনেক ক্ষেত্রে ব্যর্থতা প্রবণ।

এবং, সাধারণভাবে বলতে গেলে, প্যাটার্নটি if(x != y) x = y;সহজ তুলনায় ধীর x = y


আকর্ষণীয় বিষয়টি যে ড্রাইভারদের এটি সম্পর্কে যত্ন নেওয়া উচিত। লিঙ্কটির জন্য ধন্যবাদ (এবং পুনরায় লিঙ্কগুলি)।
0xBADF00D

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

4

এই বিষয় সম্পর্কে একটি আকর্ষণীয় জিনিস আমি পেয়েছি।

এমএসডিএন থেকে:

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

এবং

আপনার ইফেক্টের প্রতিটি টেকনিকের জন্য একটি এফেক্টপ্যারামিটার উদাহরণ তৈরি এবং নির্ধারণ করা প্রভাবের উপর প্যারামিটারগুলি সূচকযুক্ত সম্পত্তি ব্যবহার করার চেয়ে উল্লেখযোগ্যভাবে দ্রুত is

তার মানে যে _effect.Parameters["xWorld"].SetValue(value);তুলনায় লক্ষণীয়ভাবে ধীরwordlParam.SetValue(value);

সুতরাং আপনার সম্ভবত এটির মতো প্যারামিটারগুলি ক্যাশে করা উচিত:

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

তবে আমি কোনও আসল মানদণ্ড খুঁজে পাইনি।

সূত্র:

http://msdn.microsoft.com/en-us/library/Mic Microsoft.Xna.Framework.Graphics.EffectParameter% 28v =xnagamestudio.40% 29.aspx http://msdn.microsoft.com/en-us/library /bb976060%28v=xnagamestudio.31%29.aspx


এটি কেবল মনোগাম এবং ডব্লিউপি এমুলেটরটিতে পরীক্ষা করা হয়েছে - আমি নিশ্চিত করতে পারি যে সত্যই, একটি উল্লেখযোগ্য পার্থক্য রয়েছে (আমার ক্ষেত্রে 5-15% এর মধ্যে)। পারফরম্যান্সে সহায়তা করে এমন আরও কিছু কৌশল আছে কি?
কনরাড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.