বর্ধমান গতি বৃদ্ধি?


9

আমি পাইগেমে 2 ডি সাইডক্রোলার নিয়ে কাজ করছি। প্রতিটি মানচিত্রের জন্য আমরা একটি টেক্সচার ব্যবহার করি (এটি টেক্সচারের আসল আকার):

মানচিত্র টেক্সচার

তারপরে আমরা এই কোড সহ চিত্রটি লোড করব:

sprite = pygame.image.load("Maps/MapTesting.png")
sprite.convert()
sprite = pygame.transform.scale(sprite,
              (sprite.get_width()*6, sprite.get_height()*6))

আপনি দেখতে পাচ্ছেন, আসল মানচিত্রের টেক্সচারটি তৈরি করতে টেক্সচারটি 6 বার ফুটিয়ে উঠেছে। গড়ে এই টেক্সচারটি প্রায় 4500x800। এই টেক্সচারটি প্রতিটি ফ্রেমে স্ক্রিনে ব্লিট করতে হবে , কারণ পুরো স্ক্রিনটি নোংরা (পাশের স্ক্রোলিংয়ের জন্য ধন্যবাদ)। আমরা এই কোডটি ব্যবহার করে এটি করি:

screen.blit(sprite, (0, 0),
(cameraposx, cameraposy, windowheight, windowwidth))

এবং এটি কাজ করে। সমস্যাটি হ'ল এটি বেশ ধীর গতিতে: আমি একটি কম-শালীন পিসিতে একটি স্বল্প 40 এফপিএস পাই এবং এটি সত্যিকারের এআই / অবজেক্টগুলি ছাড়া কোনওটিই নয়, যখন আমরা 60 টি এফপিএসের লক্ষ্য করছি। কীভাবে আমরা এই গতি বাড়িয়ে তুলব?


নোট করুন যে উপরের কোডটি স্যানিটাইজ করা হয়েছে এবং প্রসঙ্গের বাইরে নেওয়া হয়েছে। সম্পূর্ণ কোডটি এখানে পাওয়া যাবে: https://github.com/nightcracker/PyGG2

এবং সর্বশেষে তবে সর্বনিম্ন নয়, যদিও উপরের চিত্রটি 8-বিটের মতো দেখাতে পারে তবে গেমটিতে এমন কিছু উপাদান রয়েছে যার জন্য আরও বিট-গভীরতা প্রয়োজন।


প্রতি টেক্সচারে বুদ্ধিমান আকারে বিভক্ত করুন, প্রতি ব্লক 1024 বিস্তৃত বলুন এবং একবারে প্রাসঙ্গিকভাবে কেবল দুটি ব্লিট করুন।
জারি কম্প্পা

@ জারিকোম্প্পা: এটি চেষ্টা করে, ব্লিটিংয়ের উপর কোনও প্রভাব ফেলেনি (কেবলমাত্র মেমোরির ব্যবহারের জন্য পাইগামটি কেবল স্মৃতিশক্তি ব্যবহারের জন্য ব্লিট করতে যথেষ্ট স্মার্ট)।
orlp

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

@ মাল্টিফিনিটাস: হ্যাঁ, আমি এটি সিফ্রোফাইল দিয়ে প্রোফাইল করলাম।
orlp

আপনি যদি এটির প্রকৃত রেজোলিউশনে প্রদর্শন করেন তবে গতির পার্থক্য কী? আপনি যদি বৃহত্তর চিত্রটি পূর্ববর্তী করেন?
আলটিফিনিটাস

উত্তর:


7

ব্লিটিং পিক্সেল সম্পর্কিত একটি পৃষ্ঠের (আমার অভিজ্ঞতা থেকে) সম্পর্কিত কিছু সাধারণ তুলনামূলক অপ্টিমাইজেশনের তালিকা তৈরি করুক।

1) সাধারণত প্যালেট চিত্রগুলি (সূচিকৃত চিত্রগুলি) যখন blitted হয়, তখন এটি পুনরায় দিকনির্দেশের একটি অতিরিক্ত স্তরের (রঙ পেতে) চলে যাবে true তাই সত্য রঙের চিত্রগুলির সাথে তুলনা করার সময় তারা blitting করার সময় ধীর হবে।

2) সত্য রঙের পিক্সেল ডেটা (ধরে ধরে আলফা দিয়ে বলুন - বিট 24 বিট ডেটা) খুব দ্রুত ব্লিটেড করা যায় কারণ আমরা ইমেজের প্রতিটি স্ক্যানলাইনের জন্য একটি মেমকি করতে পারি (যদি আমরা চিত্রটির কোনও অংশ অনুলিপি করি) ডিভাইস ফ্রেমের বাফারে .যদি ব্লিট হওয়া ডেটা যদি একটি পূর্ণ চিত্র হয়, তবে আমরা সরাসরি পুরো ডেটাটি ম্যাকপি করতে পারি যা আরও দ্রুত!

3) ব্লিটিং আলফা পিক্সেল ডেটা ব্যয়বহুল হবে কারণ এতে প্রতিটি উপাদান ফলাফল গণনা করা অন্তর্ভুক্ত হবে এবং আমাদের এটি আরজিবি ডেটাতে আবার প্যাক করতে হবে। সরল পদে চূড়ান্ত রঙ পাওয়ার জন্য প্রতিটি পিক্সেলের আরও ক্রিয়াকলাপ!

Finalrgb = Alpha*(Srgb) + (1-Alpha)*Drgb (this is for normal blend equation)
    where Srgb is source-rgb (we need to apply for each of the component for final color)
       Drgb is the color that will be there in the destination buffer.

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

* আপডেট: * রঙ কী সেট করা প্রতিটি পৃষ্ঠায় পিক্সেল ব্লিটিং করার সময় একটি অতিরিক্ত চেক যুক্ত করার মতো।

       for(eachPixelColor in allPixels)
         {
            if(eachPixelColor is NOT colorKeyColor)
            {
              copy color to the frame buffer!
            }

         }

সুতরাং, এখানে যদি আপনি দেখতে পান, আমরা প্রতিটি পিক্সেলের রঙের বৈধতা পরীক্ষা করতে হবে বলে আমরা মেমকি ব্যবহার না করা সীমাবদ্ধ!


ঠিক আছে, set_colorkeyএটি একটি (ব্যয়বহুল) আলফা চ্যানেল দিয়ে মানচিত্রের টেক্সচারে পিছলে যাওয়ার জন্য কল আসে । এটি একটি convertস্থির, এবং এখন আমি এই ক্রপ পিসিতে 150 টি এফপিএস স্থিতিশীলভাবে চালাচ্ছি। ধন্যবাদ!
orlp

ওহে রঙ কী সম্পর্কিত সম্পর্কিত সম্পাদনা করা হবে এমনকি কিছু তথ্য এটি যোগ করতে ভুলে গেছেন: ডি
আইয়্যাপ্পা

5

sprite.convert() আপনি যা ভাবেন তা করেন না।

sprite = sprite.convert() আপনার যা প্রয়োজন তা হল


Woops, আমি আছে sprite = sprite.convert()বাস্তব কোডে যদিও :)
orlp

আহা ভাল. :) সেক্ষেত্রে পাইগামের পরিবর্তে পাইগলেট ব্যবহার করার কথা বিবেচনা করা বা আপনি ওপেনগ্লায় স্বাচ্ছন্দ্য বোধ করলে সরাসরি পাইপেনজিএল ব্যবহার করা ছাড়া আমার কাছে আপনার কাছে বেশি কিছু দেওয়ার দরকার নেই।
কাইলোটন

@ কাইলোটান: ভাল ক্যাচ! আমি এটি চেক করি নি :)
আইয়্যাপ্প

বা আরও উন্নত:sprite = pygame.image.load("Maps/MapTesting.png").convert()
MestreLion
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.