আপনি পৃথক আপডেট (লজিক টিক) এবং অঙ্কন (টিক রেন্ডার) হারগুলি করতে চান।
আপনার আপডেটগুলি বিশ্বব্যাপী সমস্ত বস্তুর অবস্থান আঁকতে হবে।
আমি এখানে দুটি পৃথক সম্ভাবনা কভার করব, আপনি যেটি অনুরোধ করেছেন, তা এক্সট্রাপোলেশন এবং আরও একটি পদ্ধতি, অন্তরঙ্গকরণ।
1।
এক্সট্রোপোলেশন হল যেখানে আমরা পরের ফ্রেমে অবজেক্টের (পূর্বাভাসিত) অবস্থান গণনা করব এবং তারপরে বর্তমান বস্তুর অবস্থানের মধ্যে এবং বস্তুটি পরবর্তী ফ্রেমের অবস্থানের মধ্যে বিভক্ত করব।
এটি করতে, আঁকতে হবে প্রতিটি বস্তুর অবশ্যই একটি যুক্ত velocity
এবং থাকতে হবে position
। পরের ফ্রেমটিতে velocity * draw_timestep
অবজেক্টের অবস্থানের অবস্থানটি অনুসন্ধান করতে আমরা পরবর্তী ফ্রেমের পূর্বাভাসিত অবস্থানটি সন্ধান করতে কেবল অবজেক্টের বর্তমান অবস্থানটি যুক্ত করব। draw_timestep
পূর্ববর্তী রেন্ডার টিক (ওরফে আগের ড্র কল) এর পরে যে সময় কেটে গেছে তা হ'ল।
আপনি যদি এটি এ ছেড়ে চলে যান, যখন তাদের ভবিষ্যদ্বাণী করা অবস্থানটি পরবর্তী ফ্রেমে প্রকৃত অবস্থানের সাথে মেলে না তখন আপনি সেই বস্তুগুলি "ঝাঁকুনি" খুঁজে পাবেন। ঝাঁকুনি অপসারণ করতে, আপনি পূর্বাভাসিত অবস্থানটি সংরক্ষণ করতে পারেন এবং পূর্ববর্তী পূর্বাভাসিত অবস্থান এবং প্রতিটি অঙ্কিত ধাপে নতুন পূর্বাভাসিত অবস্থানের মধ্যে লার্প করতে পারেন, পূর্ববর্তী আপডেটটিকে লার্প ফ্যাক্টর হিসাবে টিকিয়ে রাখার পর থেকে অতিবাহিত সময়টি ব্যবহার করে। এটি যখন দ্রুত চলমান বস্তুগুলি হঠাৎ করে অবস্থান পরিবর্তন করে, তখন এটি খারাপ আচরণে পরিণত হয় এবং আপনি সম্ভবত এই বিশেষ কেসটি পরিচালনা করতে চাইতে পারেন। এই অনুচ্ছেদে যা বলা হয়েছে তা হ'ল আপনি বহিঃপ্রকাশ ব্যবহার করতে চান না তার কারণ ।
2।
ইন্টারপোলেশন হল যেখানে আমরা শেষ দুটি আপডেটের স্থিতি সংরক্ষণ করি এবং সর্বশেষের আপডেটের পরে গত সময়ের যে পরিমাণ সময় পেরিয়ে গেছে তার উপর ভিত্তি করে তাদের মধ্যে বিভক্ত করা। এই সেটআপে, প্রতিটি বস্তুর অবশ্যই একটি সম্পর্কিত position
এবং থাকতে হবে previous_position
। এই ক্ষেত্রে, আমাদের অঙ্কন বর্তমান গেমস্টেটের পিছনে সবচেয়ে খারাপ এক আপডেট টিকে উপস্থাপন করবে এবং সর্বোপরি বর্তমান আপডেটের টিকের মতো ঠিক একই স্থানে।
আমার মতে, আপনি সম্ভবত বর্ণনাকেন্দ্রটি চান যা আমি বর্ণনা করেছি, কারণ প্রয়োগ করা দু'জনের পক্ষে সহজতর এবং আপনার বর্তমান আপডেট হওয়া রাষ্ট্রের পিছনে একটি সেকেন্ডের (উদাহরণস্বরূপ 1/60 সেকেন্ড) একটি ক্ষুদ্র ভগ্নাংশ অঙ্কন করা ভাল।
সম্পাদনা:
উপরেরগুলি আপনাকে বাস্তবায়ন করার অনুমতি দেওয়ার পক্ষে পর্যাপ্ত পরিমাণে না হলে, আমি বর্ণিত অন্তরঙ্গ পদ্ধতিটি কীভাবে করব তার একটি উদাহরণ এখানে। আমি এক্সট্রাপোলেশনটি কভার করব না, কারণ এমন কোনও বাস্তব-জগতের পরিস্থিতি সম্পর্কে আমি ভাবতে পারি না যেখানে আপনাকে এটি পছন্দ করা উচিত।
আপনি যখন একটি অঙ্কনযোগ্য অবজেক্ট তৈরি করেন, এটি আঁকার জন্য প্রয়োজনীয় বৈশিষ্ট্যগুলি সংরক্ষণ করবে (অর্থাত, এটি আঁকার জন্য প্রয়োজনীয় রাষ্ট্রীয় তথ্য)।
এই উদাহরণস্বরূপ, আমরা অবস্থান এবং আবর্তন সংরক্ষণ করব। আপনি অন্যান্য বৈশিষ্ট্য যেমন রঙ বা টেক্সচার সমন্বয় অবস্থানের (যেমন যদি কোনও টেক্সচার স্ক্রোলগুলি) সঞ্চয় করতেও পারেন।
থ্রেড রেন্ডার করার সময় ডেটা সংশোধন করা থেকে রোধ করতে, (যেমন রেন্ডার থ্রেড আঁকানোর সময় একটি অবজেক্টের অবস্থান পরিবর্তন করা হয়েছে, তবে অন্য সমস্ত এখনও আপডেট হয়নি), আমাদের কিছু ধরণের ডাবল বাফারিং প্রয়োগ করতে হবে।
একটি বস্তু এটির দুটি অনুলিপি সঞ্চয় করে previous_state
। আমি এগুলিকে একটি অ্যারে রাখব previous_state[0]
এবং তাদের হিসাবে এবং হিসাবে উল্লেখ করব previous_state[1]
। এটি একইভাবে এটির দুটি অনুলিপি প্রয়োজন current_state
।
ডাবল বাফারটির কোন অনুলিপি ব্যবহার করা হয় তার উপর নজর রাখতে আমরা একটি ভেরিয়েবল সঞ্চয় করি state_index
, যা আপডেট এবং আঁকার উভয় ক্ষেত্রেই উপলভ্য।
আপডেট থ্রেড প্রথমে তার নিজস্ব ডেটা ব্যবহার করে কোনও বস্তুর সমস্ত বৈশিষ্ট্য গণনা করে (আপনি যে কোনও ডেটা স্ট্রাকচার চান)। তারপর, এটি কপি current_state[state_index]
করার previous_state[state_index]
কপি, এবং অঙ্কন, জন্য নতুন তথ্য প্রাসঙ্গিক position
এবং rotation
মধ্যে current_state[state_index]
। তারপরে এটি state_index = 1 - state_index
ডাবল বাফারের বর্তমানে ব্যবহৃত অনুলিপিটি ফ্লিপ করতে।
উপরের অনুচ্ছেদে সমস্ত কিছুই লক আউট নিয়ে শেষ করতে হবে current_state
। আপডেট এবং আঁকার থ্রেড উভয়ই এই লকটি নিয়ে যায়। লকটি কেবলমাত্র রাষ্ট্রীয় তথ্যের অনুলিপি করার সময়কালে নেওয়া হয়, যা দ্রুত।
রেন্ডার থ্রেডে আপনি এর পরে অবস্থান এবং আবর্তনের ক্ষেত্রে রৈখিক প্রবৃত্তি করেন:
current_position = Lerp(previous_state[state_index].position, current_state[state_index].position, elapsed/update_tick_length)
কোথায় elapsed
যে থ্রেড রেন্ডার পাস হয়েছে, সর্বশেষ আপডেট টিক যেহেতু পরিমাণ, এবং update_tick_length
যে আপনার নির্দিষ্ট আপডেট হার টিক প্রতি লাগে (যেমন 20FPS আপডেট এ সময় পরিমাণ update_tick_length = 0.05
)।
Lerp
উপরের ফাংশনটি কী তা আপনি যদি না জানেন , তবে উইকিপিডিয়া সম্পর্কিত প্রবন্ধটি চেকআউট করুন: লিনিয়ার ইন্টারপোলেশন । তবে, যদি আপনি জানেন না যে লার্পিং কী, তবে আপনি সম্ভবত ডিসপ্লেড আপডেট / ইন্টারপোল্টেড অঙ্কন সহ অঙ্কন কার্যকর করতে প্রস্তুত নন।