এগুলি তত্ত্বের সমস্ত ভাল ধারণা, যতক্ষণ না আপনি গভীর হয়ে যান। সমস্যাটি হ'ল আপনি কোনও আরএএফকে ডি-সিঙ্ক্রোনাইজ না করে গলা ফাটিয়ে ফেলতে পারবেন না, এটি বিদ্যমান জন্য এটি খুব উদ্দেশ্য defe সুতরাং আপনি এটি পুরো গতিতে চালানোর জন্য, এবং একটি পৃথক লুপ এ আপনার ডেটা আপডেট করার অনুমতি দিন , বা এমনকি একটি পৃথক থ্রেডে!
হ্যাঁ, আমি এটা বলেছি। আপনি ব্রাউজারে মাল্টি-থ্রেড জাভাস্ক্রিপ্ট করতে পারেন !
দুটি পদ্ধতি আছে যা আমি জানি যে জ্যাঙ্ক ছাড়াই অত্যন্ত ভাল কাজ করে, খুব কম রস ব্যবহার করে এবং কম তাপ তৈরি করে। সঠিক মানব-স্কেল সময় এবং মেশিনের দক্ষতার নেট ফলাফল।
যদি এটি কিছুটা শব্দযুক্ত হয় তবে দুঃখিত, তবে এখানে ...
পদ্ধতি 1: সেটআইন্টারওয়ালের মাধ্যমে ডেটা এবং আরএএফের মাধ্যমে গ্রাফিকগুলি আপডেট করুন।
অনুবাদ এবং রোটেশন মানগুলি, পদার্থবিজ্ঞান, সংঘর্ষ ইত্যাদি আপডেট করার জন্য একটি পৃথক সেটআইন্টারওয়াল ব্যবহার করুন each প্রতিটি অ্যানিমেটেড উপাদানগুলির জন্য কোনও মানগুলিতে এই মানগুলি রাখুন। প্রতিটি সেটইন্টারভাল 'ফ্রেম' অবজেক্টের ভেরিয়েবলকে ট্রান্সফর্ম স্ট্রিং বরাদ্দ করুন। এই বস্তুগুলিকে একটি অ্যারেতে রাখুন। এমএস: এমএস = (1000 / এফপিএস) আপনার কাঙ্ক্ষিত এফপিএসে আপনার বিরতি সেট করুন। এটি একটি অবিচল ঘড়ি রাখে যা আরএএফ গতি নির্বিশেষে যে কোনও ডিভাইসে একই এফপিএসের অনুমতি দেয়। এখানে উপাদানগুলিতে রূপান্তর বরাদ্দ করবেন না!
একটি অনুরোধে অ্যানিমেশন ফ্রেম লুপটিতে লুপের জন্য একটি পুরানো স্কুল দিয়ে আপনার অ্যারে দিয়ে পুনরাবৃত্তি করুন - নতুনতর ফর্মগুলি এখানে ব্যবহার করবেন না, এগুলি ধীর!
for(var i=0; i<sprite.length-1; i++){ rafUpdate(sprite[i]); }
আপনার rafUpdate ফাংশনে, অ্যারের মধ্যে আপনার জেএস বস্তু থেকে রূপান্তর স্ট্রিংটি এবং এর উপাদানগুলির আইডি পান। আপনার 'স্প্রাইট' উপাদানগুলি ইতিমধ্যে একটি চলকগুলির সাথে সংযুক্ত থাকা বা অন্য মাধ্যমে সহজেই অ্যাক্সেসযোগ্য হওয়া উচিত যাতে আপনি আরএএএফ-এ সেগুলি পেতে 'সময়' হারাবেন না। তাদের এইচটিএমএল আইডির নাম অনুসারে কোনও আইটেমে রাখার কাজটি বেশ ভাল। এমনকি আপনার এসআই বা আরএএফ-এ যাওয়ার আগে এই অংশটি সেট করুন।
কেবলমাত্র আপনার ট্রান্সফর্ম আপডেট করতে আরএএফ ব্যবহার করুন , কেবলমাত্র 3 ডি ট্রান্সফর্ম (এমনকি 2 ডি এর জন্য) ব্যবহার করুন এবং সিএসএস "" বদলে যাবে: রূপান্তর করুন "সেট করুন; যে উপাদান পরিবর্তন হবে। এটি আপনার রূপান্তরগুলি যথাসম্ভব দেশীয় রিফ্রেশ রেটে সিঙ্ক করে রাখে, জিপিইউতে কিক দেয় এবং ব্রাউজারকে জানায় যে কোথায় সবচেয়ে বেশি মনোযোগ দেওয়া যায়।
সুতরাং আপনার এই সিউডোকোডের মতো কিছু হওয়া উচিত ...
// refs to elements to be transformed, kept in an array
var element = [
mario: document.getElementById('mario'),
luigi: document.getElementById('luigi')
//...etc.
]
var sprite = [ // read/write this with SI. read-only from RAF
mario: { id: mario ....physics data, id, and updated transform string (from SI) here },
luigi: { id: luigi .....same }
//...and so forth
] // also kept in an array (for efficient iteration)
//update one sprite js object
//data manipulation, CPU tasks for each sprite object
//(physics, collisions, and transform-string updates here.)
//pass the object (by reference).
var SIupdate = function(object){
// get pos/rot and update with movement
object.pos.x += object.mov.pos.x; // example, motion along x axis
// and so on for y and z movement
// and xyz rotational motion, scripted scaling etc
// build transform string ie
object.transform =
'translate3d('+
object.pos.x+','+
object.pos.y+','+
object.pos.z+
') '+
// assign rotations, order depends on purpose and set-up.
'rotationZ('+object.rot.z+') '+
'rotationY('+object.rot.y+') '+
'rotationX('+object.rot.x+') '+
'scale3d('.... if desired
; //...etc. include
}
var fps = 30; //desired controlled frame-rate
// CPU TASKS - SI psuedo-frame data manipulation
setInterval(function(){
// update each objects data
for(var i=0; i<sprite.length-1; i++){ SIupdate(sprite[i]); }
},1000/fps); // note ms = 1000/fps
// GPU TASKS - RAF callback, real frame graphics updates only
var rAf = function(){
// update each objects graphics
for(var i=0; i<sprite.length-1; i++){ rAF.update(sprite[i]) }
window.requestAnimationFrame(rAF); // loop
}
// assign new transform to sprite's element, only if it's transform has changed.
rAF.update = function(object){
if(object.old_transform !== object.transform){
element[object.id].style.transform = transform;
object.old_transform = object.transform;
}
}
window.requestAnimationFrame(rAF); // begin RAF
এটি ডেটা অবজেক্টগুলিতে আপনার আপডেটগুলি রাখে এবং এসআই-তে পছন্দসই 'ফ্রেম' হারের সাথে সিঙ্ক হওয়া স্ট্রিংগুলিকে রূপান্তরিত করে, এবং আরএএফ-তে প্রকৃত রূপান্তর অ্যাসাইনমেন্টগুলি জিপিইউ রিফ্রেশ রেটে সিঙ্ক হয়। সুতরাং প্রকৃত গ্রাফিক্সের আপডেটগুলি কেবল আরএএফ-তে রয়েছে, তবে ডেটাতে পরিবর্তন এবং ট্রান্সফর্ম স্ট্রিং তৈরি করা এসআই-তে রয়েছে, সুতরাং জাঙ্কিগুলি ব্যতীত কাঙ্ক্ষিত ফ্রেম-রেটে 'সময়' প্রবাহিত হয় না।
প্রবাহ:
[setup js sprite objects and html element object references]
[setup RAF and SI single-object update functions]
[start SI at percieved/ideal frame-rate]
[iterate through js objects, update data transform string for each]
[loop back to SI]
[start RAF loop]
[iterate through js objects, read object's transform string and assign it to it's html element]
[loop back to RAF]
পদ্ধতি 2. এসআইকে একটি ওয়েব-কর্মীর মধ্যে রাখুন। এটি একটি FAAAST এবং মসৃণ!
পদ্ধতি 1 হিসাবে একই, তবে এসআইকে ওয়েব-কর্মীর মধ্যে রাখুন। এটি তখন সম্পূর্ণ আলাদা থ্রেডে চলবে, পৃষ্ঠাটি কেবল আরএএফ এবং ইউআইয়ের সাথে ডিল করার জন্য রেখে যাবে। 'ট্রান্সফেরেবল অবজেক্ট' হিসাবে পিছনে স্প্রাইট অ্যারে পাস করুন। এই বুকো দ্রুত। এটি ক্লোন বা সিরিয়ালাইজ করতে সময় লাগে না, তবে এটি রেফারেন্স দিয়ে যাওয়ার মতো নয় যে অন্য দিক থেকে রেফারেন্সটি নষ্ট হয়ে গেছে, সুতরাং আপনার উভয় পক্ষকে অন্য দিকে যেতে হবে, এবং উপস্থিত থাকলে কেবল সেগুলি আপডেট করুন, সাজান হাই-স্কুলে আপনার গার্লফ্রেন্ডের সাথে বার বার নোট পাস করার মতো।
একসাথে কেবল একজনই পড়তে এবং লিখতে পারবেন। এটি এতক্ষণ ঠিক আছে যেহেতু তারা পরীক্ষা করে এটি ত্রুটি এড়ানোর জন্য এটি অপরিবর্তিত নয় কিনা। আরএএফ দ্রুত এবং এটিকে তাড়াতাড়ি ফিরিয়ে আনবে, তারপরে জিপিইউ ফ্রেমের একটি গোছা দিয়ে দেখুন এটি এখনও পাঠানো হয়েছে কিনা তা পরীক্ষা করে। ওয়েব-কর্মীর এসআই-এর বেশিরভাগ সময় স্প্রিট অ্যারে থাকবে এবং অবস্থানিক, চলন এবং পদার্থবিজ্ঞানের ডেটা আপডেট করার পাশাপাশি নতুন ট্রান্সফর্ম স্ট্রিং তৈরি করার পরে এটি পৃষ্ঠায় আরএএফ-এ ফিরিয়ে দেবে।
স্ক্রিপ্টের মাধ্যমে উপাদানগুলি প্রাণবন্ত করতে আমি এটিই দ্রুততম উপায়। দুটি ফাংশন দুটি পৃথক প্রোগ্রাম হিসাবে চলবে, পৃথক দুটি থ্রেডে, একক জেএস স্ক্রিপ্টটি এমনভাবে নয় যে মাল্টি-কোর সিপিইউর সুবিধা গ্রহণ করবে। মাল্টি-থ্রেড জাভাস্ক্রিপ্ট অ্যানিমেশন।
এবং এটি জ্যাঙ্ক ছাড়াই এতো সহজেই করবে তবে প্রকৃত নির্দিষ্ট ফ্রেম-হারে খুব সামান্য বিচ্যুতি নিয়ে।
ফলাফল:
এই দুটি পদ্ধতির যে কোনও একটিই নিশ্চিত করবে যে আপনার স্ক্রিপ্টটি কোনও পিসি, ফোন, ট্যাবলেট ইত্যাদিতে (অবশ্যই ডিভাইস এবং ব্রাউজারের দক্ষতার মধ্যে) একই গতিতে চলবে।
requestAnimationFrame
হ'ল (নাম ধরণের প্রস্তাব হিসাবে) কেবলমাত্র যখন অ্যানিমেশন ফ্রেমের প্রয়োজন হয় তখনই অনুরোধ করা। ধরা যাক আপনি একটি স্ট্যাটিক কালো ক্যানভাস দেখিয়েছেন, আপনার 0 fps পাওয়া উচিত কারণ কোনও নতুন ফ্রেমের প্রয়োজন নেই। তবে আপনি যদি কোনও অ্যানিমেশন প্রদর্শন করছেন যা 60fps প্রয়োজন, আপনার এটিও পাওয়া উচিত।rAF
কেবল অকেজো ফ্রেমগুলি "এড়িয়ে যেতে" এবং তারপরে সিপিইউ সংরক্ষণ করতে দেয়।