এক্সএনএর স্প্রিটব্যাচ ঠিক কীভাবে কাজ করে?


38

আরও সুনির্দিষ্টভাবে বলার জন্য, যদি আমাকে অন্য এপিআইতে (যেমন ওপেনগিএল) স্ক্র্যাচ থেকে এই কার্যকারিতাটি পুনরায় তৈরি করার দরকার হয় তবে এটি করার জন্য সক্ষম হওয়ার কী দরকার?

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

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

সম্ভব হলে আমি কৃতজ্ঞ থাকি যদি আপনি স্প্রিটব্যাচ.বাগিন () কে স্প্রিটব্যাচ.ইন্ড () অবধি ডাকা হয় তখন থেকেই এই প্রক্রিয়াটির মধ্য দিয়ে আমাকে গাইড করতে পারতেন, কমপক্ষে ডিফল্ট ডিফার্ড মোড ব্যবহার করার সময়।


এটি ওপেনজিএল এর মাধ্যমে মনোগেমে কীভাবে প্রয়োগ করা হয়েছে তা একবার দেখুন: github.com/mono/MonoGame/blob/master/MonoGame.Framework/…
ডেন

আপনি কি মাইক্রোসফ্ট.এক্সনা.গ্রাফিক্সে ডটপিক বা প্রতিচ্ছবি ব্যবহার করার চেষ্টা করেছেন (যদিও আমি অবৈধ কিছু করার পরামর্শ দিচ্ছি না :)?
ডেন

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

হ্যাঁ, এ কারণেই আমি কোনও মন্তব্য ব্যবহার করেছি। আমি মনে করি অ্যান্ড্রু রাসেল এই প্রশ্নের উত্তর দেওয়ার জন্য ভাল ব্যক্তি হতে পারে। তিনি এই সম্প্রদায়ে সক্রিয় এবং ExEn যা MonoGame একটি বিকল্প কাজ করছে: andrewrussell.net/exen
ডেন

হ্যাঁ, এন্ড্রু রাসেল (বা এক্সএনএ ফোরামে শান হারগ্রিভস) সাধারণত এই প্রশ্নটি সাজান into
ডেভিড গৌভিয়া

উত্তর:


42

আমি যে ক্রস প্ল্যাটফর্ম ইঞ্জিনটিতে কাজ করছি তার জন্য মুলতুবি মোডে স্প্রিটব্যাচের আচরণের একরকম প্রতিলিপি তৈরি করেছি, তাই আমি এখন পর্যন্ত যে বিপরীতে ইঞ্জিনিয়ার করেছি সেগুলি এখানে রইল:

  1. SpriteBatch কন্সট্রাকটর: একটি সৃষ্টি DynamicIndexBuffer, DynamicVertexBufferএবং অ্যারে VertexPositionColorTextureসংশোধন আকারের (এই ক্ষেত্রে, ব্যাচের সর্বাধিক পরিমাপ - sprites জন্য 2048 এবং 8192 ছেদচিহ্ন জন্য)।

    • সূচি বাফারটি কোয়াডের শীর্ষস্থানীয় সূচকগুলিতে পূর্ণ হয় যা অঙ্কিত হবে (0-1-2, 0-2-3, 4-5-6, 4-6-7 এবং আরও)।
    • SpriteInfoস্ট্রাক্টগুলির একটি অভ্যন্তরীণ অ্যারেও তৈরি করা হয়। এটি ব্যাচিংয়ের সময় ব্যবহারের জন্য টেম্পোরাল স্প্রাইট সেটিংস সংরক্ষণ করবে।
  2. SpriteBatch.Begin: অভ্যন্তরীণভাবে মান সঞ্চয় করে BlendState, SamplerStateনিদিষ্ট, ইত্যাদি এবং চেক যদি এটি একটি ছাড়া দুইবার বলা হয়েছে SpriteBatch.Endতাদের মধ্যে।

  3. স্প্রিটব্যাচ.ড্রে: সমস্ত স্প্রিট তথ্য (টেক্সচার, অবস্থান, রঙ) নেয় এবং এটিকে অনুলিপি করে SpriteInfo। যদি সর্বোচ্চ ব্যাচের আকার পৌঁছে যায় তবে পুরো ব্যাচটি নতুন স্প্রিটের জন্য জায়গা তৈরি করতে আঁকা।

    • SpriteBatch.DrawStringDrawঅ্যাকাউন্টিং কার্নিং এবং স্পেসিংয়ের ক্ষেত্রে স্ট্রিংয়ের প্রতিটি চরিত্রের জন্য কেবল একটি জারি করে।
  4. স্প্রিটব্যাচ.এন্ড: নিম্নলিখিত ক্রিয়াকলাপগুলি করে:

    • নির্দিষ্ট করা রেন্ডার রাজ্যগুলি সেট করে Begin
    • অর্থোগ্রাফিক প্রজেকশন ম্যাট্রিক্স তৈরি করে।
    • SpriteBatchশেডার প্রয়োগ করে ।
    • বাঁধে DynamicVertexBufferএবং DynamicIndexBuffer
    • নিম্নলিখিত ব্যাচিং অপারেশন সম্পাদন করে:

      startingOffset = 0;
      currentTexture, oldTexture = null;
      
      // Iterate through all sprites
      foreach SpriteInfo in SpriteBuffer
      {
          // Store sprite index and texture
          spriteIndex = SpriteBuffer.IndexOf(SpriteInfo);
          currentTexture = SpriteInfo.Texture;
      
          // Issue draw call if batch count > 0 and there is a texture change
          if (currentTexture != oldTexture)
          {
              if (spriteIndex > startingOffset)
              {
                  RenderBatch(currentTexture, SpriteBuffer, startingOffset,
                              spriteIndex - startingOffset);
              }
              startingOffset = spriteIndex;
              oldTexture = currentTexture;
          }
      }
      
      // Draw remaining batch and clear the sprite data
      RenderBatch(currentTexture, SpriteBuffer, startingOffset,
                  SpriteBuffer.Count - startingOffset);
      SpriteBuffer.Clear();
      
  5. স্প্রিটব্যাচ.রেন্ডারবাচ:SpriteInfo ব্যাচের প্রত্যেকটির জন্য নিম্নলিখিত ক্রিয়াকলাপ সম্পাদন করে :

    • স্প্রাইটের অবস্থান নেয় এবং উত্স এবং আকার অনুসারে চারটি শীর্ষে চূড়ান্ত অবস্থানের গণনা করে। বিদ্যমান ঘূর্ণন প্রয়োগ করে।
    • UV স্থানাঙ্কগুলি গণনা করে এবং SpriteEffectsতাদের নির্দিষ্ট করে প্রয়োগ করে।
    • স্প্রাইটের রঙ অনুলিপি করে।
    • এই মানগুলি VertexPositionColorTextureপূর্বে তৈরি উপাদানগুলির অ্যারেতে সংরক্ষণ করা হয় । সমস্ত sprites গণনা করা হয়েছে, তখন SetDataউপর বলা হয় DynamicVertexBufferএবং একটি DrawIndexedPrimitivesকল ইস্যু করা হয়।
    • ভার্টেক্স শ্যাডারটি কেবল একটি ট্রান্সফর্ম অপারেশন করে এবং পিক্সেল শেডার টেক্সচার থেকে আনা রঙটিতে টিন্টিং প্রয়োগ করে।

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

যাইহোক, আমি ডকুমেন্টেশনে সন্ধান করতে পারি না - বাফারটি পূর্ণ হওয়ার আগে আপনি যে কল করতে পারবেন তার কল সীমা কত? এবং ড্রটেক্সটকে কল করা কি সেই বাফারকে স্ট্রিংয়ের সম্পূর্ণ পরিমাণে অক্ষর দ্বারা পূর্ণ করে?
ডেভিড গাউভিয়া

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

@ ডেভিডগুভিয়া: ২০৪৪ স্প্রেটস হ'ল সর্বোচ্চ ব্যাচের আকার - উত্তরটি সম্পাদনা করে সুবিধার জন্য এটি যুক্ত করা হয়েছে। হ্যাঁ, টেক্সচার অনুসারে বাছাই করা এবং জেড-বাফারকে স্প্রাইট অর্ডারের যত্ন নিতে দেওয়া ন্যূনতম ড্র কলগুলি ব্যবহার করবে। আপনার যদি এটির প্রয়োজন হয় তবে আপনি যা SpriteSortMode.Textureযা ক্রম চান তা আঁকতে বাস্তবায়ন করার চেষ্টা করুন এবং SpriteBatchবাছাই করতে দিন ।
r2d2rigo

1
@ ডেন: এক্সেন এবং মনোগেম নিম্ন স্তরের এপিআই যা এক্সএনএ কোডটি নন-উইন্ডোজ প্ল্যাটফর্মে চালানোর অনুমতি দেয়। আমি যে প্রকল্পে কাজ করছি তা হ'ল উপাদান # ভিত্তিক ইঞ্জিন যা খালি সি # তে লিখিত হয়েছে, তবে আমাদের সিস্টেমের API- এ অ্যাক্সেস সরবরাহ করার জন্য আমাদের খুব পাতলা স্তর প্রয়োজন (যেখানে আমি কাজ করছি)। আমরা কেবল SpriteBatchসুবিধার জন্য রিম্পিমলেট বেছে নিয়েছি । এবং হ্যাঁ, এটির জন্য MonoTouch / MonoDroid প্রয়োজন কারণ এটি সমস্ত সি #!
r2d2rigo

13

কেবল এটিই বলতে চাই যে এক্সএনএ স্প্রিটব্যাচ কোডটি ডাইরেক্টএক্সে পোর্ট করা হয়েছে এবং এক্সএনএ দলের কোনও পূর্ববর্তী সদস্য দ্বারা ওএসএস হিসাবে প্রকাশ করেছেন। সুতরাং আপনি যদি এটি দেখতে চান তবে এটি XNA এ কীভাবে কাজ করে আপনি এখানে যান।


"কোডের জন্য আমি কখনই ব্যবহার করব না তবে স্কিম ওভার থেকে আকর্ষণীয়"
কাইল বারান

নেটিভ সি যেমন XNA SpriteBatch ++, এর সর্বশেষ সংস্করণ পাওয়া যাবে GitHub / CPP । একটি বোনাস হিসেবে, একটি DirectX12 সংস্করণ এছাড়াও উপলব্ধ / CPP
চাক Walbourn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.