আমি আমার নিজস্ব ক্লোন মাইনক্রাফ্ট লিখছি (জাভাতেও লেখা)। এটি এখন দুর্দান্ত কাজ করে। 40 মিটার দেখার দুরত্বের সাথে আমি আমার ম্যাকবুক প্রো 8,1 এ সহজেই 60 টি এফপিএস হিট করতে পারি। (ইন্টেল আই 5 + ইনটেল এইচডি গ্রাফিক্স 3000)। তবে যদি আমি দেখার দূরত্বটি 70 মিটারের উপরে রাখি তবে আমি কেবল 15-25 এফপিএসে পৌঁছেছি। আসল মাইনক্রাফ্টে, আমি কোনও সমস্যা ছাড়াই দুরত্বের ঝোঁকটি দূরে (= 256 মিটার) রাখতে পারি। সুতরাং আমার প্রশ্নটি হল আমার খেলাটি আরও ভাল করার জন্য আমার কী করা উচিত?
আমি যে আশাবাদগুলি প্রয়োগ করেছি:
- কেবল স্থানীয় অংশগুলিকে মেমরিতে রাখুন (প্লেয়ারের দেখার দূরত্বের উপর নির্ভর করে)
- ফ্রাস্টাম কুলিং (প্রথমে খণ্ডে, তারপরে ব্লকগুলিতে)
- শুধুমাত্র ব্লকের সত্যই দৃশ্যমান মুখগুলি অঙ্কন করা
- প্রতি অংশে তালিকাগুলি ব্যবহার করে যাতে দৃশ্যমান ব্লক থাকে। দৃশ্যমান হয়ে যাওয়া খণ্ডগুলি এই তালিকায় নিজেকে যুক্ত করবে। যদি তারা অদৃশ্য হয়ে যায় তবে এগুলি স্বয়ংক্রিয়ভাবে এই তালিকা থেকে সরানো হবে। প্রতিবেশী ব্লক তৈরি বা ধ্বংস করে ব্লকগুলি দৃশ্যমান হয়ে ওঠে।
- আপডেট হওয়া ব্লকগুলি সহ প্রতি অংশের তালিকা ব্যবহার করা। দৃশ্যমান ব্লক তালিকা হিসাবে একই প্রক্রিয়া।
- প্রায় না ব্যবহার করুন
new
গেম লুপের ভিতরে বিবৃতি । (আবর্জনা সংগ্রহকারীকে না নেওয়া পর্যন্ত আমার খেলাটি প্রায় 20 সেকেন্ড চলবে) - আমি এই মুহুর্তে ওপেনজিএল কল তালিকা ব্যবহার করছি। (
glNewList()
,glEndList()
,glCallList()
) ব্লক একটি ধরনের প্রতিটি পাশ জন্য।
বর্তমানে আমি এমনকি কোনও প্রকারের আলো ব্যবস্থা ব্যবহার করছি না। আমি ভিসিও সম্পর্কে ইতিমধ্যে শুনেছি। তবে ঠিক কী তা আমি জানি না। যাইহোক, আমি তাদের সম্পর্কে কিছু গবেষণা করব। তারা কর্মক্ষমতা উন্নতি করবে? ভিবিওর বাস্তবায়ন করার আগে, আমি glCallLists()
কল তালিকার একটি তালিকা ব্যবহার এবং পাস করার চেষ্টা করতে চাই । পরিবর্তে হাজারবার ব্যবহার glCallList()
। (আমি এটি চেষ্টা করতে চাই, কারণ আমি মনে করি যে আসল মাইনক্রাফ্ট ভিবিও ব্যবহার করে না rect সঠিক?)
পারফরম্যান্স উন্নত করার জন্য অন্য কৌশল আছে?
ভিজ্যুয়ালভিএম প্রোফাইলিং আমাকে এটি দেখায় (70 মিটার দেখার দুরত্বের সাথে কেবল 33 ফ্রেমের জন্য প্রোফাইলিং):
40 মিটার (246 ফ্রেম) সহ প্রোফাইলিং:
দ্রষ্টব্য: আমি প্রচুর পদ্ধতি এবং কোড ব্লক সিঙ্ক্রোনাইজ করছি, কারণ আমি অন্য থ্রেডে খণ্ড তৈরি করছি। আমি মনে করি যে কোনও গেম লুপে এটি করার সময় কোনও অবজেক্টের জন্য লক অর্জন করা একটি পারফরম্যান্স ইস্যু (অবশ্যই, আমি সেই সময়ের কথা বলছি যখন কেবল গেম লুপ থাকে এবং কোনও নতুন অংশ তৈরি হয় না)। এটা কী ঠিক?
সম্পাদনা করুন: কিছু synchronised
ব্লক এবং কিছু অন্যান্য সামান্য উন্নতি সরিয়ে দেওয়ার পরে । পারফরম্যান্স ইতিমধ্যে অনেক ভাল। 70 মিটার সহ এখানে আমার নতুন প্রোফাইলিং ফলাফল:
আমি মনে করি এটি বেশ স্পষ্ট যে selectVisibleBlocks
বিষয়টি এখানে।
আগাম ধন্যবাদ!
Martijn
হালনাগাদ : কিছু অতিরিক্ত উন্নতির পরে (যেমন প্রতিটির স্থলে লুপের জন্য ব্যবহার করা, লুপগুলির বাইরে চলকগুলি বাফার করা ইত্যাদি ইত্যাদি), এখন আমি দর্শনীয় দূরত্ব 60 চালাতে পারি বেশ ভাল।
আমি মনে করি আমি যত তাড়াতাড়ি সম্ভব ভিবিও বাস্তবায়ন করতে যাচ্ছি।
পিএস: সমস্ত সোর্স কোড গিটহাবটিতে উপলব্ধ:
https://github.com/mcourteaux/CraftMania