تخيل نفسك مشاهدة فيلم ضباب بطيء بشكل لا يصدق. أنت لا ترى حواف وحادة الحدود. الآن تشغيل الفيلم مع 10fps. وسوف تبدو السوائل. لماذا لأن الفرق من إطار واحد إلى الآخر منخفض جدا. سوف يكون أقصى الجدار غير متحرك تماما: ثم 1 إطارا في الثانية تساوي 1000 إطارا في الثانية. الآن تأخذ يدك وتحريكه ببطء أمام وجهك. ثم نقله بشكل أسرع حتى ضبابية. كم عدد الإطارات في الثانية التي تراها يجب أن يكون قليلا، لأنك ترى فقط اليد غير واضحة دون أن تكون قادرة على التمييز بين كل تغيير في ميلي ثانية واحدة، ولكن يجب أن يكون الكثير، لأنك ترى حركة السوائل دون أي انقطاع أو القفز. لذلك هذا هو خدعة العيون في كلا المثالين: طمس يحاكي سيولة، والحدة يحاكي التأتأة. (مماثلة ل كوترواتيون يحاكي غرافيتيكوت.) الحركة طمس example1: التقاط من الأداء الحي من كورس ما يمكن أن أقوم في متف متفوقة الحركة طمس example2: التقاط من كوت غريزة الأساسية كوت، حيث ترى امرأة تغرق الجليد اختيار في مان، بدن، بينما، جلسة، عن، هيم. والحقيقة هي أن العين البشرية تدرك حركة السينما السينمائية النموذجية بأنها السوائل في حوالي 18fps، بسبب عدم وضوح لها. إذا كنت قد ترى يدك تتحرك واضحة جدا وهشة، ثم عينك اللازمة لجعل المزيد من لقطات منه لجعلها تبدو السوائل. إذا كان لديك فيلم مع 50 صورة حادة جدا ونقية في الثانية الواحدة، عينك من شأنه أن يجعل الكثير من التفاصيل من وقت لآخر وكان لديك الشعور، أن الفيلم هو التأتأة. أيضا 25 إطارا في الثانية ولكن من دون ضبابية: لقطات من قصة ببكس عن إد جين، القاتل، حالة ووس مستوحاة هيتشكوك لجعل الاقتباس النفسي وجوناثان ديمي لجعل صمت من الحملان كوت. الموسيقى من سي إن إن سي ماركيتماكيرس كوت (0.52 مب). مجرد التفكير في الألعاب الحديثة: هل سبق لك أن لعبت زلزال مع 18fps لا يوجد ضبابية الحركة في تلك الألعاب، وبالتالي كنت في حاجة الى الكثير من الإطارات في الثانية أكثر. ومع ذلك، ترى البقع والأوساخ من إطارات واحدة في فيلم السينما، لا أنت وتلك الأفلام لعبت في 24fps. لذلك هناك فرق بين رؤية السوائل والحركة ورؤية أن ثيريس شيء (الأوساخ) على الإطلاق. واصل القراءة. يتيح إجراء الاختبار المعاكس ل كوتسنسيتيفيتي إلى داركنسكوت. دعونا نتحدث عن، مدى حساسية العين هو السطوع. تخيل نفسك في غرفة مظلمة جدا. لقد كنت هناك لساعات وأسودها تماما. الآن ومضات ضوء الحق أمامك. دعونا نقول كما مشرق مثل الشمس. هل ترى ذلك، عندما 125 فقط من الثانية كنت بالتأكيد. 1100 من الثانية نعم. 1200 من الثانية نعم. وقد أظهرت الاختبارات مع الطيارين سلاح الجو، وأنها يمكن أن تحدد الطائرة على صورة تومض التي تومض فقط لمدة 1220 من الثانية. هذا هو تحديد. لذلك آمنة جدا أن أقول، أن الاعتراف، أن بعض الضوء كان هناك ممكن مع 1300th من الثانية. الآن إذا كنت تأخذ بعين الاعتبار، أن لديك عينان مع زوايا مختلفة ومناطق مختلفة من الحساسية (ربما كنت تعرف، أن ترى التلفزيون الخفقان أفضل، عندما كنت لا تنظر مباشرة إلى شاشة التلفزيون، ولكن مع جانبي عينيك) ويمكنك مافيروتاتشيك رأسك وعينيك إلى موقف مختلف، وربما كنت في حاجة الى ومضات قصيرة مثل 1500th من الثانية للتأكد من، لا أحد يرى لهم في أي حال. الآن، ماذا يحدث إذا أنا تومض لك 1500 من الثانية مرة واحدة في الثانية لمدة 365 يوما مباشرة في عينك هل تشعر شيئا غريب هل تشعر مختلفة من دون ذلك هل لاحظت أن شيئا ما خاطئا لذلك، يجب أن نضيف قيمة الأمن ، للتأكد من لا أحد يرى أي شيء حتى دون وعي ويشعر بالراحة حول هذا الموضوع. ربما صناعة لم يضيف ما يكفي من عامل الأمن لأقراص مدمجة وهذا هو السبب في كثير من الناس لا يزالون يشعرون أن التناظرية هو أفضل في بعض الأحيان. لها مثل في غرفة مليئة أضواء النيون. أنت تعرف فقط أن شيئا غير صحيح. أسباب نتائج الاختبار 2 واختبار 3 هي أفتيرماجيس. الضوء الساطع يخلق بعد ذلك في العين. بنفس الطريقة التي ترى الضوء في ثوان العين بعد الطبيب يضيء ضوء في ذلك. هذا الأضواء يجعل من الممكن أن نرى ما كان هناك قبل ثوان. سطوع ما بعد السينما السينمائية تنتج مثل هذه أفتيماجيس وبالتالي يساعد الفيلم ليكون فليكرفري. لذا فإن السؤال كيف أن العديد من الإطارات لا أحتاج إلى جعل فليكرفريكوت الفيلم لا يرى السواد بين الإطارات (حوالي 70-100 إطارا في الثانية) لا يجيب على السؤال كيف يمكن قصيرة يمكن أن تكون صورة مشرقة أن نرى إيتكوت مسألة سلاح الجو وهذا لا يجيب والسؤال كوتوو قصيرة يمكن صورة (وليس مشرق) أن نرى إيتكوت. وبالتالي فإن الاستنتاج هو: لجعل فيلمزفيرتوال واقع الكمال، يود أن تعرف ما تريد. أن يكون الوهم الكمال من كل ما يمكن فلاش، وميض والتحرك يجب أن لا تذهب أقل من 500 إطارا في الثانية. فكر في ذلك، أيضا إذا كان لديك شاشة ينعش في 85Hz واللعبة يعمل على 50HZ (50fps): هل أنت متأكد من أنك لا تحتاج إلى مزامنة لهم هل أنت متأكد من أنك لا تحتاج للعب مع عدة من 85 للاستمتاع التحديثات تحديث متزامنة وبالتالي فإن اللعبة التي تعمل في 85fps قد أفضل من 100fps. ربما حتى شاشة تفت كان أفضل. فإنه يعرض فقط مع حوالي 40fps ولكن تدريجيا. على الرغم من أن خلايا العين الواحدة (القضبان والأقماع) قد يكون لها قيود بسبب أوقات تفاعلها الكيميائي وبسبب المسافة إلى الدماغ، لا يمكنك التأكد من كيفية تفاعلها أو تكملها أو مزامنتها. إذا كانت خلية واحدة قادرة على تصور 10fps، 2 خلايا قد تكون قادرة على تصور 20fps عن طريق استكمال بعضها البعض. حتى لا تخلط بين إيكوت الإنسان مع كوتكوت. بعض خلايا العين تتفاعل فقط عندما يتحرك التحفيز. يتفاعل البعض عندما تتحرك من A إلى B، وبعض عندما تتحرك من D إلى Z. وهذا قد يعقد محاكاة القائم على الإطار للواقع. حركة جسمك يمكن أن تغير الطريقة التي تصور. هل تحصل على الصداع بعد مشاهدة 3 أفلام في السينما على التوالي ربما لأنك لم تتحرك مع حركة تصوير هذا هو السبب في الركاب الأمامي الحركات (شخص آخر نقل السيارة) والبحر (البحر تحركت السفينة فجأة) . ربما هذا هو السبب في نظارات 3D الألعاب لن تعمل تماما. وهذا لا علاقة له مع معدلات الإطار. عندما تنظر مباشرة (مع مركز عينيك) ليست هي نفسها كما لو كان مع الجانبين من عينيك. الجانبين أكثر حساسية للسطوع و الخفقان. في المرة القادمة كنت في السينما القيام بما يلي: انظروا إلى السقف في حين أن الفيلم يلعب. وخصوصا خلال المشاهد برايتوهايت سوف تلاحظ بوضوح أن وميض الفيلم. الحساسية للأزرق مختلفة عن اللون الأخضر: ترى اللون الأخضر أفضل، حتى عندما يكون الظلام، على سبيل المثال. يترك في غابة في الليل. حتى إطارات كوتوبلو في سيكوندكوت قد تختلف عن كوتغرين فريمس في سيكوندكوت هل تحب أن تلعب زلزال هل تعتقد أن كوتومور هو بيستكوت ربما هذا لماذا تعتقد 200fps أفضل من 180fps. هل تعتقد أن الانتقال في الألعاب ثلاثية الأبعاد يتأرجح ربما يقوم الماوس بفحص الحركة بدقة منخفضة جدا (نقطة لكل بوصة) أو إطارا في الثانية (إطارات لكل ثانية) هل تعتقد أنه من المهم أن تعرض بطاقة الرسومات 250 إطارا في الثانية في اللعبة المفضلة لديك، وذلك لأن وهذا ميزة يكتبون عنها في مجلات بيسي وعلى يغطي الآن هذا هو مجرد شخصية لإظهار مدى سرعة البطاقة، وليس لإظهار أنك بحاجة إلى مثل هذا معدل الإطار عالية. لها مثل مع السيارات: 100kmh في 5 ثوان. متى سوف تحتاج من أي وقت مضى للذهاب 100kmh في 5 ثوان حتى ما هو كوتنوغ فبسكوت أنا لا أعرف، لأنه لا أحد ذهب هناك حتى الآن. ربما 120fps يكفي، ربما سوف تحصل الصداع بعد 3 ساعات. رؤية فرامويز هو ببساطة ليست الطريقة التي يعمل بها نظام العينين. وهو يعمل مع تدفق مستمر من ليتينفورماتيون. (على غرار آثار الكاميرات مشاعل (ناقوس إيسكوت): وامض هو ببساطة ليست الطريقة التي نرى). لذلك لا تزال هناك أسئلة. ربما تحتاج إلى 4000fps، ربما أقل، ربما أكثر. وسينشأ نفس السؤال بالنسبة إلى إطار العمل بالنسبة للقرار. كم بكسل يمكن للعين البشرية ترى هل 2000x1000 (حرب النجوم الحلقة الثانية القرار) تبدو وكأنها واقع أم أنها مجرد ما يكفي لجعل فيلم كوتسينيمابلكوتهو العديد من إطارات في الثانية هو أفضل عند تسجيل كائن في الحركة، وهناك أسباب عملية للحد من معدل إطار الكاميرا: الحد من الإدراك البشري: ليس هناك سبب لإظهار المزيد من الإطارات في الثانية مما يمكن للمشاهد إدراك. إن الحد الدقيق لإدراك الحركة البشرية لا يزال قائما للنقاش العلمي، ولكن من المتفق عليه عموما أن هناك عتبة أعلى بعدها لا يستطيع الناس تقدير الفرق. تكلفة وسائل الإعلام وحجمها: فيلم وأشرطة الفيديو تكلفة الأسهم المال. تتطلب معدلات الإطار الأعلى المزيد من لقطات وأكثر تكلفة لاطلاق النار. يصبح تحرير وإدارة وسائل الإعلام أكثر صعوبة مع زيادة كمية وسائل الإعلام الخام. تسجيل معدلات عالية الإطار لتأثيرات بطيئة الحركة على الرغم من زيادة التكاليف والجهد، وهناك حالات حيث اطلاق النار معدلات الإطار أعلى مفيد. يتم إنشاء تأثيرات بطيئة الحركة بتسجيل مئات الإطارات في الثانية ثم تشغيل نفس الإطارات مرة أخرى بمعدل أبطأ. على سبيل المثال، رصاصة تحطيم لمبة ضوء قد يستغرق سوى جزء صغير من الثانية، يبدو تقريبا لحظية لأي شخص يراقب. إذا سجلت الكاميرا المصباح الكهربائي ألف مرة في الثانية ثم جهاز عرض يلعب الإطارات مرة أخرى في 24160fps، الفيلم سوف تظهر على الشاشة يستغرق تقريبا 40 مرة (1000160fps 24160fps 41.6160seconds). كلما ارتفع معدل الإطار، كلما زادت دقة الوقت (اللقطة الزمنية) لقطاتك، مما يعني أنه يمكن تباطؤها لإظهار اللحظات المفصلة التي قد تكون ضبابية. يتطلب اطلاق النار في معدلات الإطار عالية أيضا المزيد من الضوء، لأن هناك وقتا أقل لفضح كل إطار. تسجيل معدالت اإلطار البطيء معدالت التصوير البطيء يتم استخدام معدالت اإلطار البطيئة لتصوير الفاصل الزمني، حيث يتم تسجيل المشهد ببطء نسبي، وربما إطار واحد كل ثانية أو ساعة أو يوم. هذا مفيد عندما كنت تحاول التقاط الأحداث المتغيرة تدريجيا، مثل النباتات المتنامية، حركة السحب، أو ارتفاع ووضع الشمس. عندما يتم تشغيلها بمعدلات الإطارات القياسية، تحدث الأحداث بسرعة على الشاشة وتظهر أنماط لا يمكن اكتشافها. التصوير الفوتوغرافي إيقاف الحركة، والرسوم المتحركة رسمها التقليدية، وتقديم الكمبيوتر اتخاذ نهج مماثل. النقطة هنا هي أن معدل إنشاء إطار لا يتوافق بالضرورة مع معدل التشغيل. هذا هو واحد من المقترحات الأكثر إثارة من الصور المتحركة وقدرتها على التعامل مع الوقت: يمكنك إنشاء الصور في أي معدل يناسبك واللعب بها مرة أخرى بسرعة مختلفة تماما. أمثلة على كيفية اختلاف معدلات الإطار يتم استخدام الفيلم بشكل خاص في أنه يمكن تصويره وتشغيله بمجموعة متنوعة من السرعات. بعض الأمثلة هي: 1160 إطار في الساعة: المتطرفة الوقت الفاصل بين التصوير الفوتوغرافي. 1160 إطار في الدقيقة: التصوير الفاصل بين الزمن ووقف الحركة الرسوم المتحركة. 18160 إطارا في الثانية: أفلام صور متحركة مبكرة. 24160 إطارا في الثانية: معيار عالمي لأفلام السينما السينمائية. 48160 إطارا في الثانية: تصوير بطيء الحركة (لأنه يستغرق ضعف الوقت المطلوب للعرض في جهاز عرض 24160 إطارا في الثانية، تكون الحركة بطيئة مرتين). 300 لقطة في الثانية: كاميرات عالية السرعة للتصوير بطيء الحركة جدا (غالبا ما تستخدم للمنمنمات لجعل نماذج تبدو أكبر على الشاشة). 2500 إطارات في الثانية الواحدة: كاميرات عالية السرعة جدا لتأثيرات خاصة مثل التصوير الفوتوغرافي النارية والانفجارات. أشرح مفصل من لعبة جافاسكريبت الحلقات والتوقيت الحلقة الرئيسية هي جزء أساسي من أي تطبيق التي تتغير الدولة مع مرور الوقت. في الألعاب، وغالبا ما تسمى الحلقة الرئيسية حلقة اللعبة. وهي مسؤولة عادة عن حساب الفيزياء والذكاء الاصطناعي وكذلك رسم النتيجة على الشاشة. لسوء الحظ، فإن الغالبية العظمى من الحلقات الرئيسية وجدت على الانترنت - وخاصة تلك الموجودة في جافا سكريبت - مكتوبة بشكل غير صحيح بسبب قضايا التوقيت. أود أن أعرف إيف كتابة نصيب عادل من سيئة منها. هذه الوظيفة تهدف إلى تبين لك لماذا العديد من الحلقات الرئيسية تحتاج إلى أن تكون ثابتة، وكيفية كتابة حلقة رئيسية بشكل صحيح. إذا أود بدلا تخطي التفسير ومجرد الحصول على رمز للقيام بذلك الحق. يمكنك استخدام بلدي مفتوحة المصدر مشروع MainLoop. js. المحاولة الأولى كانت تكتب لعبة. للبساطة، كانت مجرد الذهاب إلى رسم مربع تتأرجح: يتيح جعله تظهر: حسنا، أن واسنت سيئة للغاية. الآن يتيح سقالة تطبيق جافا سكريبت. أولا، لدينا مربع سوف تحتاج بعض الخصائص لتحديد موقفها والسرعة. يتيح أيضا رمي في وظيفة، رسم (). لعرض مربعات موقف جديد: الآن منطق الألعاب. نريد مربع للتحرك ذهابا وإيابا، وذلك على ما يرام فقط إضافة السرعة إلى الموقف. هذا هو المكان الذي تبدأ الأمور على غير ما يرام، كما سترى في لحظة. والآن يتيح جعله تشغيل. للقيام بذلك، نحن بحاجة إلى حلقة التي تبقي فقط تنفيذ وظيفة التحديث () لجعل الخطوة مربع، ثم رسم () وظيفة لتحديث التصور على الشاشة. كيف يمكننا أن نفعل ذلك إذا كنت قد كتبت أي وقت مضى ألعاب بلغة أخرى، قد تفكر في حلقة في حين: ومع ذلك، جافاسكريبت هي مترابطة واحد، مما يعني أن هذا النهج من شأنه منع المتصفح من القيام بأي شيء آخر تقريبا على تلك الصفحة. ونتيجة لذلك، فإن المتصفح قفل، وبعد بضع ثوان وسوف تظهر للمستخدم خطأ يسأل عما إذا كانوا يريدون إنهاء السيناريو الخاص بك. يول تريد اللعبة لتشغيل لأكثر من بضع ثوان، بحيث لا توجد جيدة نحن بحاجة إلى وسيلة لإعطاء السيطرة من حلقة اللعبة مرة أخرى إلى المتصفح لفترة، حتى المتصفح جاهز بالنسبة لنا للقيام ببعض العمل مرة أخرى. إذا كنت معتادا على جافا سكريبت، قد تفكر في سيتيموت () أو سيتينتيرفال () - الدالات التي تسمح بتنفيذ التعليمات البرمجية بعد مقدار معين من الوقت. هذه فكرة معقولة جدا، ولكن في المتصفحات ثيريس بطريقة أفضل: ريكستانيماشيونفريم (). لها وظيفة جديدة إلى حد ما مع دعم متصفح قوي (في وقت كتابة هذا التقرير، جميع المتصفحات باستثناء IE9 وأدناه دعم ذلك). يمكنك تمرير رد على هذه الوظيفة، ويتم تشغيل هذا الاستدعاء في المرة القادمة المستعرض جاهز لتغيير كيف تبدو الصفحة. على رصد 60 هرتز، وهذا يعني تطبيق ضبطها على النحو الأمثل يمكن رسم التحديثات (تسمى إطارات اللوحة) 60 مرة في الثانية الواحدة. لذلك، الحلقة الرئيسية الخاصة بك لديها 1 60 16.667 ميلي ثانية للقيام بعملها في كل مرة يتم تشغيلها إذا كنت تريد أن تصل إلى 60 لقطة في الثانية مثالية. كذلك تغطية بوليفيل ل node. jsio. js وأقل المتصفحات في وقت لاحق. ضع في اعتبارك أن معظم المراقبين غير قادرين على عرض أكثر من 60 لقطة في الثانية (فبس). ما إذا كان البشر يمكن أن أقول الفرق بين معدلات الإطار عالية يعتمد على التطبيق، ولكن كمرجع، يتم عرض الفيلم عادة في 24 فبس، وأشرطة الفيديو الأخرى في 30 فبس، ومعظم الألعاب مقبولة فوق 30 فبس، والواقع الافتراضي قد تتطلب 75 فبس ليشعر طبيعي >> صفة. بعض المراقبين الألعاب تصل إلى 144 فبس. حسنا، يتيح استخدام ريكستانيماشيونفريم () لكتابة تلك الحلقة الرئيسية من المهم أن تسمى () تسمى () بعد التحديث () لأننا نريد الشاشة لتعكس حالة التطبيق الذي هو ما يصل إلى تاريخ ممكن. (لاحظ أن التطبيقات المستندة إلى قماش قد تحتاج إلى العناية لرسم الإطار الأول جدا في الحالة الأولية للتطبيقات، قبل حدوث أي تحديثات، ونوقشت طريقة واحدة للقيام بذلك في وقت لاحق في هذه المقالة.) بعض المشاركات عبر الإنترنت تكهن بأن في وقت سابق في ريكستانيماشيونفريم رد يمكن الحصول على الشاشة رسمت بشكل أسرع هذا هو في الغالب ليس صحيحا، وحتى عندما يكون هو، وعادة ما يكون مجرد مفاضلة بين تقديم الإطار الحالي عاجلا وتقديم الإطار التالي في وقت لاحق. لا يهم حقا عند ريكستانيماشيونفريم يسمى مرة أخرى لأنه يمكن تشغيل إطار واحد فقط في وقت واحد، ولكن أجد أنه يجعل المعنى الأكثر منطقية لطلب إطار آخر بمجرد الانتهاء من واحد الحالي. مشاكل التوقيت حتى الآن، يعاني دالة التحديث () من المشكلة التي تعتمد على معدل الإطار. وبعبارة أخرى، إذا كانت اللعبة تعمل ببطء (أي عدد أقل من الإطارات في الثانية)، فسيظهر كائنك أيضا للتحرك ببطء، في حين إذا كان التطبيق قيد التشغيل بسرعة (أي مزيد من الإطارات في الثانية)، سيظهر الكائن للتحرك بسرعة. وجود مثل هذه التجارب اللعب لا يمكن التنبؤ بها غير مرغوب فيه، وخاصة في الألعاب متعددة اللاعبين. لا أحد يريد شخصيته أن يكون بلبوك فقط لأن أجهزة الكمبيوتر الخاصة بهم ليست قوية كما. حتى في ألعاب لاعب واحد، والسرعة يؤثر بشكل كبير صعوبة: الألعاب التي تتطلب ردود فعل سريعة سيكون من الأسهل في سرعات بطيئة وصعبة أونبليابلي في تلك سريعة. لرؤية هذا لأنفسنا، يتيح إضافة القدرة على خنق فبس. حسنا الاستفادة من حقيقة أن ريكستانيماشيونفريم () يمر الطابع الزمني إلى رد الاتصال. في كل مرة تدير حلقة، تحقق جيدا إذا كان قد مر الحد الأدنى من الوقت إذا كان لديه، وأيضا جعل الإطار، وإذا كان هاسنت، حسنا فقط الانتظار للإطار التالي. يمكنك أن ترى كم أبطأ بألم هو: نحن بحاجة إلى أن نفعل ما هو أفضل. المشكلة هي أن طلبنا غير مرتبطة في الوقت الحقيقي. كيف يمكننا إصلاح ذلك كما تمريرة الأولى، ويحاول محاولة ضرب سرعة بمقدار الوقت الذي مرت بين تقديم الإطارات، والتي تدعو أيضا دلتا. لذلك بدلا من تشغيل بوكس بوكس مربع فيلوسيتي جيدا بدلا من تشغيل بوكس بوكس مربع فيلوسيتي دلتا. تحتاج أيضا إلى ضبط وظيفة التحديث لدينا لتلقي دلتا كمعلمة من الحلقة الرئيسية: نتائج جيدة جدا لدينا مربع يبدو الآن لنقل مسافة ثابتة مع مرور الوقت، بغض النظر عن معدل الإطار. إذا لم تتصرف بالطريقة التي تتوقعها. حسنا، قراءة على. مشاكل الفيزياء حاول تحريك السرعة إلى قيمة مثل 0.8. في غضون ثوان معدودة فقط، ستلاحظ أن المربع سيبدأ في التصرف بشكل غير منتظم، وربما يذهب خارج النافذة المرئية. هذا ليس من المفترض أن يحدث ما حدث خطأ ماذا يحدث هو أنه في حين أن مربع قبل مسافة ثابتة كل إطار، والآن مربع يتحرك مسافات متفاوتة كل إطار - وبعض هذه المسافات كبيرة جدا. في الألعاب، يمكن لهذه الظاهرة تسمح للاعبين لتشغيل من خلال الجدران، أو منعهم من القفز فوق العقبات. والمشكلة الثانية هي أنه نظرا لأن المربع يتحرك مسافة متباينة لكل رتل فإن أخطاء التقريب الصغيرة من ضرب السرعة مع دلتا الإطار ستؤدي إلى انحراف موضع الصندوق بمرور الوقت. لا أحد سوف تكون قادرة على لعب بالضبط نفس اللعبة لأن معدلات الإطار ستكون مختلفة والتي من شأنها أن تسبب أخطاء التقريب مختلفة. قد يبدو هذا غير منطقي ولكن من الناحية العملية يمكن أن تكون مرئية بعد بضع ثوان فقط حتى في معدلات الإطار العادي هذا ليس سيئا فقط للاعبين - لها أيضا سيئة للاختبار، لأن ويد مثل برنامجنا لإنتاج بالضبط نفس الإخراج إذا اعطينا ذلك نفس المدخلات. وهذا يعني أننا نريد أن يكون برنامجنا حتميا. حل إن الفكرة الرئيسية لإصلاح مشاكل الفيزياء لدينا هي أننا نريد أفضل العالمين: نريد محاكاة كمية ثابتة من الوقت في اللعبة في كل مرة نقوم بتشغيل التحديثات لدينا، ومع ذلك نحن بحاجة لمحاكاة الوقت المنقضي الفعلي كل الإطار. اتضح أننا يمكن أن نفعل على حد سواء، من خلال مجرد تشغيل تحديثاتنا عدة مرات مع دلتا ذات حجم ثابت حتى ويف محاكاة في كل وقت نحتاج. يتيح قرص الحلقة الرئيسية لدينا: كل ما فعلنا هو أننا فصلت كمية من الوقت محاكاة في كل تحديث () من مقدار الوقت بين الإطارات. لدينا وظيفة التحديث () لا تحتاج إلى تغيير نحن بحاجة فقط لتغيير دلتا نمر بها بحيث أن كل تحديث () يحاكي كمية محددة من الوقت. سيتم الآن تشغيل وظيفة التحديث () عدة مرات لكل إطار إذا لزم الأمر لمحاكاة إجمالي مقدار الوقت الذي تم تمريره منذ الإطار الأخير. (إذا كان الوقت الذي مرت منذ آخر إطار أقل من الوقت المحاكاة الثابتة، ونحن فقط لن تشغيل تحديث () حتى الإطار التالي. إذا كان هناك وقت أونسيمولاتد اليسار على ما هو أقل من الجدول الزمني لدينا، حسنا مجرد ترك فإنه يجب أن يتم محاكاة خلال الإطار التالي، ولهذا السبب نحن بحاجة إلى إضافة إلى دلتا بدلا من التنازل عنها - لأننا بحاجة للحفاظ على الوقت المتبقي من الإطار الأخير.) هذا النهج يتجنب أخطاء التقريب غير متناسقة ويضمن أنه لا يوجد عملاق، خل، الجدران، في فترات متباعدة، الإطارات. دعونا نرى ذلك في العمل: إذا قمت بتعديل مربع فيلوسيتي سترى أن مربع لدينا الآن يبقى بشكل صحيح حيث من المفترض أن يكون. نيس ملاحظة واحدة: كان اختيار قيمة لدينا تيمستيب التعسفي. ويحدد القاسم بشكل فعال الإطارات في الثانية التي يستطيع المستخدمون إدراكها (ما لم يتم استيفاء الرسم، كما هو مبين أدناه). تقليل الجدول الزمني يزيد الحد الأقصى ينظر فبس على تكلفة تشغيل التحديث () مرات أكثر في الإطار عندما فبس الفعلي هو أقل من الحد الأقصى. منذ تشغيل التحديث () المزيد من الأوقات يستغرق المزيد من الوقت لمعالجة، وهذا يمكن أن يبطئ فعلا معدل الإطار. إذا كان يبطئ كثيرا، فإنه يمكن أن يؤدي إلى دوامة الموت. الذعر دوامة الموت للأسف، مرة أخرى ويف قدم مشكلة جديدة. في محاولتنا الأولى، إذا استغرقت الإطارات وقتا طويلا لتحديث وتقديم، معدل الإطار تباطأ فقط حتى يستمر كل إطار طويلا بما يكفي لتحديثات تحدث. ومع ذلك، تحديثاتنا تعتمد على الوقت الآن. إذا كان إطار واحد يستغرق وقتا طويلا لمحاكاة، فإن واحد القادم يحتاج لمحاكاة كمية أطول من الوقت. وهذا يعني حاجة جيدة لتشغيل التحديث () أكثر من مرة، وهو ما يعني أن إطارنا الجديد سوف يستغرق وقتا أطول لمحاكاة، وهلم جرا. حتى التطبيق سوف يتجمد وتعطل. وهذا ما يسمى دوامة الموت. غير جيد. عموما، كانت جيدة طالما يتم تعيين تيمستيب لدينا إلى قيمة عالية بما فيه الكفاية أن المكالمات التحديث عادة ما يستغرق وقتا أقل من مقدار الوقت الذي يحاكي. ومع ذلك، سيكون هذا مختلفا للأجهزة المختلفة وأعباء العمل. بالإضافة إلى ذلك، هذا هو جافاسكريبت كانوا يتحدثون عن: لدينا القليل جدا من السيطرة على بيئة التنفيذ. إذا كان المستخدم يتحول إلى علامة تبويب أخرى، فإن المتصفح سوف تتوقف عن رسم إطارات، وينتهي جيدا مع الكثير من الوقت لمحاكاة عندما يعود المستخدم مرة أخرى. إذا كان الكثير من الوقت، فإن المتصفح شنق. فحص سانيتي نحن بحاجة إلى طريق الهروب. يتيح إضافة الاختيار سانيتي إلى حلقة التحديث لدينا: ماذا يجب أن نفعل في وظيفة الذعر لدينا حسنا، هذا يعتمد. بدورها القائم على ألعاب متعددة تستخدم تقنية الشبكات دعا قفل التي تضمن أن جميع اللاعبين يواجهون اللعبة في نفس الوتيرة. وهذا يعني أن جميع اللاعبين تجربة اللعبة في وتيرة أبطأ واحد. إذا كان لاعب واحد يتخلف لفترة طويلة جدا، يحصل على لاعب انخفض حتى أن اللاعبين الآخرين لا تحصل على جر أسفل أيضا. لذلك، في الألعاب على ظهره، لاعب سوف تحصل فقط انخفض. في الألعاب متعددة اللاعبين التي لا تستخدم عتبة، مثل أول شخص الرماة، وهناك عادة الخادم الذي لديه دولة موثوقة من اللعبة. وهذا هو، الخادم يتلقى جميع اللاعبين المدخلات ويحسب ما ينبغي أن يبدو العالم من أجل منع اللاعبين من الغش. إذا كان لاعب ينجرف بعيدا جدا عن الدولة الموثوقة، كما سيكون الحال في حالة من الذعر، ثم لاعب يحتاج إلى أن قطعت مرة أخرى إلى دولة موثوقة. (في الممارسة العملية، وهذا هو الارتباك، وبالتالي فإن لاعب قد تقع مرة أخرى على وظيفة التحديث البديلة المؤقتة التي من شأنها تسهيل العالم العميل مرة أخرى نحو العالم الخادم أكثر سلاسة). مرة واحدة نحن المفاجئة المستخدم إلى حالتهم الجديدة، ونحن لا نريد منهم أن لا تزال لديها مجموعة من الوقت المتبقي لمحاكاة لأننا سريع بشكل فعال من خلال ذلك. لذلك، يمكننا التخلص منه: إذا كان الخادم يفعل ذلك، فإنه من شأنه أن يعرض السلوك غير الحتمي، ولكن فقط يحتاج الخادم اللعبة المضي قدما حتما حتى غرامة على العميل في لعبة متصلة بالشبكة. في ألعاب لاعب واحد، قد يكون مقبولا للسماح للتطبيق للحفاظ على تشغيل لفترة ما لمعرفة ما إذا كان سوف اللحاق بالركب. ومع ذلك، وهذا يمكن أيضا أن يسبب التطبيق لتبدو وكأنها تعمل بسرعة كبيرة لعدد قليل من الإطارات كما أنها تنتقل من خلال الدول الوسيطة. البديل الذي قد يكون مقبولا هو تجاهل ببساطة الوقت المنقضي غير المنقول كما فعلنا أعلاه في حالة عدم الاتصال بالشبكة. مرة أخرى، وهذا يدخل السلوك غير الحتمي، ولكن قد تقرر أن الذعر هو ظرف غير عادي وجميع الرهانات قبالة. في جميع الحالات، إذا كان فاني التطبيق في كثير من الأحيان وليس بسبب وجوده في علامة التبويب الخلفية، وهذا هو على الارجح مؤشرا على أن الحلقة الرئيسية تعمل ببطء شديد. قد ترغب في زيادة خطوتك الزمني. التحكم فبس طريقة تكميلية لمنع اللوالب من الموت (ومعدلات الإطار منخفضة بشكل عام) هو رصد معدل الإطار وضبط ما هي الأنشطة التي تحدث في الحلقة الرئيسية إذا كان معدل الإطار يحصل منخفضة جدا. في كثير من الأحيان انخفاض في معدل الإطار ربما يكون ملحوظا قبل حدوث حالة من الذعر، حتى نتمكن من منع الذعر عن طريق التحضير. هناك العديد من الطرق لتتبع معدل الإطار. طريقة واحدة هي لتتبع عدد الإطارات التي تم تقديمها في كل ثانية لفترة من الزمن (على سبيل المثال، آخر 10 ثانية) ومتوسطها. ومع ذلك، هذا هو أكثر قليلا من الأداء كثيفة من الاعجاب مثل، وأنه سيكون من الجميل أن الوزن المتوسط نحو ثواني أكثر حداثة. نهج أسهل أن يفعل هذا الترجيح هو استخدام المتوسط المتحرك الأسي فبس في الحلقة الرئيسية لدينا: 0.25 هو معلمة تسوس - هو في الأساس كيف ثقل أكثر ثباتا مؤخرا. متغير إطارا في الثانية يحمل الآن إطاراتنا المقدرة في الثانية. عظيم. الآن ما يجب علينا القيام به معها حسنا، الشيء الواضح الذي يجب القيام به هو عرضه: يمكننا استخدام فبس بطرق أكثر فائدة على الرغم من. إذا كان منخفضا جدا، يمكننا الخروج من اللعبة، وخفض جودة البصرية، ووقف أو تقليل الأنشطة خارج الحلقة الرئيسية مثل معالجات الحدث أو تشغيل الصوت، وإجراء التحديثات غير الحرجة أقل كثيرا، أو زيادة الوقت. (لاحظ أن هذا الخيار الأخير يؤدي إلى مزيد من الوقت محاكاة في كل تحديث () استدعاء، الأمر الذي يتسبب في التطبيق أن تتصرف بشكل غير محدد، لذلك يجب أن تستخدم ماما إذا كان على الإطلاق.) إذا فبس يسحب، يمكننا عكس هذه أفعال. البدايات والنهايات قد يكون من المفيد الحصول على الوظائف التي تدعوها الحلقة الرئيسية الخاصة بك في بداية ونهاية الحلقة (يتيح الاتصال بهم تبدأ () ونهاية () على التوالي) للقيام الإعداد والتنظيف. عموما، تبدأ () مفيد لمعالجة المدخلات قبل تشغيل التحديثات (على سبيل المثال، مقذوف التفريخ عندما يضغط لاعب مفتاح سلاح النار). إذا كان هناك إجراءات طويلة التي يجب اتخاذها استجابة لإدخال المستخدم، ومعالجتها في قطع في الحلقة الرئيسية بدلا من كل مرة واحدة في معالجات الحدث يمكن أن تكون مفيدة لتجنب تأخير الإطارات. الدالة إند ()) مفيدة أيضا في إجراء تحديثات طويلة التشغيل بشكل متكرر بحيث تكون حساسة للوقت، فضلا عن التعديل مع التغييرات في فبس. اختيار خط زمني عموما، 1000 60 هو خيار جيد لمعظم الحالات لأن معظم المراقبين تشغيل في 60 هرتز. إذا كنت تجد أن التطبيق الخاص بك هو مكثف جدا للأداء قد ترغب في تعيينه إلى، على سبيل المثال، 1000 30. وهذا فعال قبض معدل الإطار الخاص بك يمكن إدراكها في 30 فبس (ما لم يتم استيفاء الرسم كما هو موضح أدناه). لاحظ أنه يمكن اختناق الإطارات اعتمادا على الشاشة وبرنامج تشغيل الرسومات، وبالتالي فإن الحد الأقصى الذي قمت بتعيينه قد لا يكون الحد الأقصى الذي تحصل عليه في الممارسة العملية. إذا كانت اللعبة تدير بسرعة وكنت تريد محاكاة أكثر دقة، هل يمكن أن تنظر في أقصى القيم فبس من شاشات الألعاب الراقية: 75، 90، 120، و 144. أبعد من ذلك، ويول في نهاية المطاف تبطئ نفسك إلى أسفل. اعتبارات الأداء إذا كان الأداء الخاص بك ليست جيدة كما كنت ترغب في أن يكون، الاستيفاء الرسم واستخدام العاملين على شبكة الإنترنت هي اثنين من التغييرات الهيكلية يمكنك جعل التي يمكن أن يكون لها تأثير قوي. إنتيربولات دراوينغ بعد الانتهاء من التحديثات لدينا، وسوف يكون هناك عادة بعض الوقت المتبقي في دلتا التي هي أقل من كامل تيمستيب. تمرير النسبة المئوية للخطوة الزمنية التي لم تتم محاكاتها بعد إلى وظيفة التعادل () تسمح لها بالاستكمال بين الإطارات. هذا التمهيد البصرية يساعد على تقليل التأتأة حتى في معدلات الإطار عالية. يظهر التأتأة لأن الوقت الذي يحاكيه التحديث () والوقت بين استدعاء () استدعاء عادة ما يكون مختلفا. لتوضيح ذلك، إذا حدث التحديث () المحاكاة في كل شريط عمودي في الصف الأول أدناه، ورسم () المكالمات يحدث في كل شريط عمودي في الصف الثاني أدناه، ثم بعض الإطارات سوف يكون الوقت المتبقي على أن لم يتم محاكاة بعد من قبل تحديث () عند حدوث العرض في رسم (): من أجل رسم () لاستكمال الحركة لأغراض العرض، يجب الاحتفاظ الكائنات بعد التحديث الأخير () واستخدامها لحساب حالة وسيطة. لاحظ أن هذا يعني أنه سيتم عرض تحديث واحد () وراء. هذا لا يزال أفضل من استقراء (إسقاط حالة الكائنات بعد التحديث في المستقبل ()) التي يمكن أن تنتج نتائج غريبة. قد يكون من الصعب إنشاء دول متعددة، وتذكر أن تشغيل هذه العملية يستغرق وقتا يمكن أن يدفع معدل الإطار إلى أسفل، لذلك قد لا يكون من المفيد ما لم تلعثم مرئية. هيريس كيف يمكننا تنفيذ الاستيفاء لمربعنا: استخدام عمال ويب للحصول على التحديثات كما هو الحال مع كل شيء في الحلقة الرئيسية، وقت تشغيل التحديث () يؤثر بشكل مباشر على معدل الإطار. إذا كان التحديث () يستغرق وقتا كافيا أن معدل الإطار ينخفض تحت معدل الإطار الهدف (الميزانية)، أجزاء من وظيفة التحديث () التي لا تحتاج إلى تنفيذ بين كل إطار يمكن نقلها إلى عامل ويب. (مصادر مختلفة على شبكة الإنترنت في بعض الأحيان تقترح أنماط جدولة أخرى باستخدام سيتيموت () أو سيتينتيرفال (). هذه المقاربات تقدم أحيانا تحسينات متواضعة مع الحد الأدنى من التغييرات على التعليمات البرمجية الموجودة، ولكن لأن جافاسكريبت هي ترابط واحد، فإن التحديثات لا تزال تمنع تقديم واسحب لأسفل ومعدل الإطار استخدام عاملات ويب هو المزيد من العمل، ولكنها تنفذ في سلاسل عمليات منفصلة، حتى أنها تحرر المزيد من الوقت في الحلقة الرئيسية). قائمة غير شاملة من الأشياء للتفكير عند النظر في استخدام عاملات الويب: ملف التعريف الخاص بك التعليمات البرمجية قبل القيام بالعمل لنقله إلى عمال الويب. ويمكن أن يكون تقديم هذا هو عنق الزجاجة، وفي هذه الحالة يجب أن يكون الحل الأول لتقليل تعقيد البصرية للمشهد. ليس من المنطقي نقل محتويات التحديث () إلى العمال إلا إذا كانت وظيفة السحب () يمكن استيفاء بين الإطارات كما نوقش أعلاه. وأحدث الفاكهة المعلقة من التحديث () هي تحديثات أساسية (مثل حساب المواطنين السعادة في لعبة بناء المدن)، والفيزياء التي لا تؤثر على المشهد (مثل الأعلام التي تلوح في الريح)، وأي شيء يتم إلغاؤه أو يحدث بعيدا عن الشاشة. إذا كان الرسم () يحتاج إلى استيفاء الفيزياء استنادا إلى النشاط الذي يحدث في عامل، فيحتاج العامل إلى تمرير قيمة الاستكمال الداخلي إلى مؤشر الترابط الرئيسي بحيث يكون متاحا لرسم (). ويب العمال غير قادر على الوصول إلى حالة من الموضوع الرئيسي، حتى أنها غير قادر مباشرة على تعديل الأشياء في المشهد الخاص بك. نقل البيانات من وإلى عمال الويب هو ألم. أسرع طريقة للقيام بذلك هي مع الكائنات القابلة للتحويل: في الأساس، يمكنك تمرير أرايبوفر للعامل، وتدمير المرجع الأصلي في هذه العملية. يمكنك قراءة المزيد عن عمال الويب والكائنات القابلة للنقل في HTML5 روكس. بدء وإيقاف حتى الآن، مرة واحدة لدينا لعبة قد بدأت الحلقة الرئيسية، ونحن قد كان لديه وسيلة لوقفه. يتيح إدخال بدء () ووقف () وظائف لإدارة ما إذا كان التطبيق قيد التشغيل. أول شيء نحن بحاجة إلى القيام به هو معرفة كيفية وقف طلب الأطر. طريقة واحدة هي الحفاظ على متغير منطقي تشغيل يتحكم ما إذا كان يدعو حلقة رئيسية ريكستانيماشيونفريم () مرة أخرى. ثاتس عادة ما تكون جيدة، ولكن إذا تم بدء اللعبة وتوقفت بسرعة، وسوف تحصل على طلب إطار مع أي وسيلة لإلغاء ذلك. لذلك بدلا من ذلك ما نحتاجه هو وسيلة لإلغاء الإطارات. لحسن الحظ ثيريس وظيفة لذلك: كانسيلانيماشيونفريم (). Requesting a frame actually returns a frame ID that we can pass to the cancelling function: Be sure to do this in the FPS throttling condition as well if youve kept it around. Now lets implement stop(): In addition to this implementation, event handling and other background tasks (such as those occurring via setInterval() or in web workers) should also be paused when the main loop is paused. This usually isnt a big deal because they can just check the running variable to see if they should execute or not. Also note that pausing in multiplayer games will cause the players client to become out of sync, so generally the game should exit or snap the player to their updated position when the main loop is started again (after confirming with the player that they really want to pause). Starting the loop is trickier. We need to pay attention to four things. First, we shouldnt allow starting the main loop if its already started, since that would request multiple frames at once and slow us down. Second, we need to make sure that toggling between starting and stopping quickly doesnt cause problems. Third, we may need to render the initial state of the game before any updates occur, since our main loop draws after updating. Finally, we need to reset some variables in order to avoid simulating time that passed while the game was paused. Additionally, event handlers and background tasks should resume once the game starts again. Here we go: Node. jsIO. js and IE9 support The main issue with our code right now that is holding back support for node. jsIO. js, as well as IE9 and earlier if you care about those browsers, is the lack of requestAnimationFrame() and cancelAnimationFrame(). We can make up for it with polyfills based on timers: Weve reduced the compatibility issue to support for Date. now(), which isnt available in IE8. If you really need IE8 support, you can use new Date() instead, but youll be generating a lot of new objects and that will create a lot of garbage collection which will make your game stutter. And IE8 is slow enough to start with that it hardly makes sense to do anything JavaScript-intensive on it. Wrapping up That was a lot to think about. If you want your main loop the easy way, you can just use my MainLoop. js open-source project. Then you wont have to worry about all these issues. If youre rolling your own, there is some general cleanup that could be done. For example, the box should be wrapped in its own class. The whole script should be wrapped in an IIFE with an exported interface to prevent polluting the global namespace in browsers, or packaged as a CommonJS or AMD module. MainLoop. js does this (and more) for you, but on the whole, weve done pretty well. Finally, Id like to thank Glenn Fiedler for writing the classic Fix your timestep which was the starting point for a lot of the work here. Thanks to Ian Langworth as well for reviewing a shorter version of this article that I included in my book about making 3D browser games and for some tips about web workers. If, after all this, youre still looking for more resources on the topic, you might also consider checking out the Game Programming Patterns books take or the less thorough take at MDN .
Comments
Post a Comment