Searching...
العربية
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Game Programming Patterns

Game Programming Patterns

بواسطة Robert Nystrom 2011 354 صفحات
4.48
1.5K تقييمات
استمع
Try Full Access for 7 Days
Unlock listening & more!
Continue

النقاط الرئيسية

1. هندسة البرمجيات تتعلق بإدارة التغيير وتقليل العبء المعرفي.

بالنسبة لي، يعني التصميم الجيد أنه عندما أجري تغييرًا، كأن البرنامج بأكمله قد تم تصميمه في انتظار ذلك.

الهدف الأساسي للهندسة المعمارية. تركز هندسة البرمجيات بشكل أساسي على تسهيل التغيير. النظام المصمم بشكل جيد يتوقع التعديلات المستقبلية، مما يسمح للمطورين بتنفيذ ميزات جديدة أو إصلاح الأخطاء مع الحد الأدنى من الاضطراب. سهولة استيعاب قاعدة الشيفرة للتغييرات هي المقياس النهائي لجودة هندستها المعمارية.

تقليل العبء المعرفي. أحد الجوانب الرئيسية للهندسة المعمارية الجيدة هو تقليل كمية المعلومات التي يحتاج المطور لفهمها قبل إجراء تغيير. تساعد أنماط الفصل والتصميم المعياري في تقليل هذا العبء المعرفي من خلال السماح للمطورين بالتفكير في المكونات الفردية بشكل مستقل. هذا يقلل من خطر الآثار الجانبية غير المقصودة ويجعل قاعدة الشيفرة أسهل في التنقل.

تدفق البرمجة. يتضمن تدفق البرمجة فهم الشيفرة الموجودة، ووضع حل، وتنفيذ الشيفرة، وإعادة تنظيم الشيفرة. تتعلق هندسة البرمجيات بمرحلة التعلم. تحميل الشيفرة في الخلايا العصبية يكون بطيئًا، لذا من المفيد إيجاد استراتيجيات لتقليل حجمها.

2. الفصل يقلل من حجم الشيفرة اللازمة لفهم تغيير ما.

إذا قمت بفصلها، يمكنك التفكير في أي جانب بشكل مستقل.

تعريف الفصل. يشير الفصل إلى الدرجة التي يمكن بها فهم وتعديل قطعتين من الشيفرة بشكل مستقل. تتطلب الشيفرة المترابطة بشدة من المطور فهم تعقيدات كلا المكونين قبل إجراء أي تغييرات، مما يزيد من خطر الأخطاء ويجعل الصيانة أكثر صعوبة. يهدف الفصل إلى تقليل هذه الاعتمادات، مما يسمح للمطورين بالتركيز على المكونات الفردية دون الحاجة لفهم النظام بأكمله.

فوائد الفصل. يقلل الفصل من كمية المعرفة التي تحتاج إلى امتلاكها قبل أن تتمكن من إحراز تقدم. كما يعني الفصل أن تغيير قطعة واحدة من الشيفرة لا يتطلب تغيير قطعة أخرى. كلما قل الترابط، كلما كانت التغييرات أقل تأثيرًا على بقية النظام.

استراتيجيات الفصل. يمكن تحقيق الفصل من خلال أنماط التصميم المختلفة والمبادئ المعمارية، بما في ذلك الواجهات، والفئات المجردة، وقوائم الرسائل. تسمح هذه التقنيات للمكونات بالتفاعل مع بعضها البعض من خلال عقود محددة جيدًا، مما يقلل من الحاجة للاعتمادات المباشرة ويعزز المعيارية.

3. التجريد والقابلية للتوسع تأتي على حساب التعقيد والتخمين.

كلما أضفت طبقة من التجريد أو مكانًا حيث يتم دعم القابلية للتوسع، فإنك تخمن أنك ستحتاج إلى تلك المرونة لاحقًا.

جاذبية التجريد. يمكن أن يؤدي التجريد، والمرونة، وأنماط التصميم إلى برامج مصممة بشكل جيد تكون ممتعة للعمل بها. تحدث فرقًا كبيرًا في الإنتاجية. ومع ذلك، تأتي هذه الفوائد بتكلفة.

تكلفة المرونة. تتطلب الهندسة المعمارية الجيدة جهدًا حقيقيًا وانضباطًا. يجب أن تفكر في الأجزاء التي يجب فصلها من البرنامج وتقديم التجريد في تلك النقاط. وبالمثل، يجب أن تحدد أين يجب أن يتم تصميم القابلية للتوسع بحيث تكون التغييرات المستقبلية أسهل.

مبدأ YAGNI. يمكن أن يؤدي التجريد المفرط إلى قواعد شيفرة تحتوي على واجهات مفرطة، وأنظمة إضافات، وطرق افتراضية، مما يجعل من الصعب تتبع الشيفرة الفعلية التي تؤدي مهمة معينة. يعمل مبدأ "لن تحتاج إليه" (YAGNI) كتذكير لتجنب التحسين المسبق والتركيز على حل المشكلة الفورية.

4. تحسين الأداء يعتمد على الافتراضات والقيود الملموسة.

الأداء يتعلق بالافتراضات.

المرونة مقابل الأداء. تتعلق هندسة البرمجيات بجعل برنامجك أكثر مرونة. يتعلق الأمر بجعل تغيير البرنامج يتطلب جهدًا أقل. وهذا يعني تشفير افتراضات أقل في البرنامج. لكن الأداء يتعلق بالافتراضات. تزدهر ممارسة التحسين على القيود الملموسة.

تجارة تحسين الأداء. يتطلب التحسين وقتًا هندسيًا كبيرًا. بمجرد الانتهاء منه، يميل إلى تجميد قاعدة الشيفرة: الشيفرة المحسنة بشكل كبير غير مرنة وصعبة التغيير.

تنازل النمذجة. أحد التنازلات هو الحفاظ على الشيفرة مرنة حتى يستقر التصميم ثم إزالة بعض التجريد لاحقًا لتحسين الأداء. من الأسهل إنشاء لعبة ممتعة بسرعة من جعل لعبة سريعة ممتعة.

5. البساطة تخفف القيود على الهندسة المعمارية، والأداء، وسرعة التطوير.

أحاول جاهدًا كتابة أنظف وأبسط حل للمشكلة.

البساطة كمبدأ توجيهي. كتابة حلول نظيفة ومباشرة للمشكلات تقلل من كمية الشيفرة، مما يقلل بدوره من العبء المعرفي المطلوب لفهمها وتعديلها. غالبًا ما تعمل الشيفرة البسيطة بشكل أسرع بسبب تقليل الحمل الزائد وقلة خطوط التنفيذ.

البساطة والوقت. لا تعني الشيفرة البسيطة بالضرورة أنها تستغرق وقتًا أقل للكتابة. الحل الجيد ليس تراكمًا للشيفرة، بل هو تقطير لها. العثور على ذلك يشبه إلى حد ما مطابقة الأنماط أو حل الألغاز. يتطلب جهدًا لرؤية النظام الخفي الذي يكمن وراء تشتت حالات الاستخدام.

قيمة الأناقة. الحلول الأنيقة هي حلول عامة: قطعة صغيرة من المنطق تغطي بشكل صحيح مساحة كبيرة من حالات الاستخدام. العثور على ذلك يشبه إلى حد ما مطابقة الأنماط أو حل الألغاز. يتطلب جهدًا لرؤية النظام الخفي الذي يكمن وراء تشتت حالات الاستخدام.

6. نمط الأمر يحقق استدعاءات الطرق من خلال إدخال قابل للتكوين وإمكانية التراجع/الإعادة.

الأمر هو استدعاء طريقة محقق.

استدعاءات الطرق المحققة. يقوم نمط الأمر بتغليف طلب ككائن، مما يسمح بتهيئة العملاء بطلبات مختلفة، والتسجيل، ودعم العمليات القابلة للتراجع. إنه استدعاء طريقة مغلف في كائن.

تهيئة الإدخال. يمكّن نمط الأمر من تهيئة إدخالات المستخدم من خلال ربط كل ضغط زر بكائن أمر. وهذا يسمح للاعبين بتخصيص عناصر التحكم الخاصة بهم دون الحاجة إلى تغييرات في منطق اللعبة الأساسي.

وظيفة التراجع/الإعادة. من خلال تنفيذ طرق execute() وundo() في الفئات الفرعية للأمر، يبسط نمط الأمر تنفيذ وظيفة التراجع/الإعادة. يخزن كل أمر الحالة اللازمة لعكس تأثيراته، مما يمكّن المستخدمين من التراجع بسهولة عن الإجراءات.

7. نمط الوزن الخفيف يحافظ على الذاكرة من خلال مشاركة الحالة الجوهرية.

الوزن الخفيف، كما يوحي اسمه، يأتي في اللعب عندما يكون لديك كائنات تحتاج إلى أن تكون أكثر خفة، عمومًا لأن لديك الكثير منها.

كائنات خفيفة. يقلل نمط الوزن الخفيف من استهلاك الذاكرة من خلال فصل حالة الكائن إلى مكونات جوهرية (مشاركة) وأخرى خارجية (فريدة). يتم تخزين الحالة الجوهرية في كائن مشترك، بينما يتم تمرير الحالة الخارجية حسب الحاجة.

مثال التضاريس. يمكن تطبيق نمط الوزن الخفيف على بلاطات التضاريس في عالم اللعبة. يمكن لكل بلاطة تخزين مؤشر إلى كائن تضاريس مشترك، يحتوي على خصائص نوع التضاريس (مثل تكلفة الحركة، والملمس). هذا يتجنب تخزين بيانات زائدة لكل بلاطة.

دعم الأجهزة. قد يكون نمط الوزن الخفيف هو النمط الوحيد من أنماط تصميم "عصابة الأربعة" الذي لديه دعم فعلي من الأجهزة. مع العرض المثيل، يمكن لبطاقة الرسوميات عرض البيانات المشتركة مرة واحدة فقط. ثم، بشكل منفصل، تدفع كل بيانات مثيل شجرة فريدة - موقعها، ولونها، ومقياسها.

8. نمط المراقب يمكّن الإشعارات المفصولة، ولكنه يتطلب إدارة دقيقة.

يسمح لقطعة واحدة من الشيفرة بالإعلان عن حدوث شيء مثير للاهتمام دون أن تهتم فعليًا بمن يتلقى الإشعار.

التواصل المفصول. يسمح نمط المراقب لكائن واحد (الموضوع) بإخطار عدة كائنات أخرى (المراقبين) حول تغييرات الحالة دون معرفة أنواعها المحددة. يعزز هذا الترابط الضعيف والمرونة.

مثال نظام الإنجازات. يمكن استخدام نمط المراقب لتنفيذ نظام الإنجازات. يمكن لمحرك الفيزياء إخطار المراقبين عندما تسقط كائن، ويمكن لنظام الإنجازات التحقق مما إذا كان الكائن هو البطل وإذا سقط من جسر لفتح إنجاز "السقوط من جسر".

إدارة الذاكرة. عند استخدام نمط المراقب، من المهم إدارة عمر الموضوعات والمراقبين لتجنب المؤشرات المعلقة أو تسرب الذاكرة. يجب على المراقبين إلغاء تسجيل أنفسهم من الموضوعات عند تدميرهم.

9. نمط النموذج يقدم النسخ كبديل للتثبيت التقليدي.

الفكرة الرئيسية هي أن كائنًا يمكنه إنتاج كائنات أخرى مشابهة له.

إنشاء كائنات نموذجية. يسمح نمط النموذج بإنشاء كائنات جديدة عن طريق نسخ كائنات موجودة (نماذج). هذا يتجنب الحاجة إلى منطق مُعقد للباني ويمكّن من إنشاء كائنات بحالات أولية مخصصة.

مثال مولد الوحوش. يمكن استخدام نمط النموذج لتنفيذ مولدات الوحوش. بدلاً من وجود فئة مولد منفصلة لكل نوع من الوحوش، يمكن لفئة مولد واحدة نسخ مثيل وحش نموذجي لإنشاء وحوش جديدة.

نمذجة البيانات. تعتبر التفويض النموذجي مناسبة جيدة لتعريف البيانات في الألعاب. يمكن التعبير عن سيف السحر الذي يفصل الرأس، والذي هو في الحقيقة مجرد سيف طويل مع بعض المكافآت، على النحو التالي:
json
{
"name": "سيف فصل الرأس",
"prototype": "سيف طويل",
"damageBonus": "20"
}

10. نمط الحالة يحقق سلوكًا محددًا حسب الحالة، ولكنه يمكن أن يُستخدم بشكل مفرط.

يسمح لكائن بتغيير سلوكه عندما تتغير حالته الداخلية. سيبدو الكائن وكأنه يغير فئته.

سلوك يعتمد على الحالة. يسمح نمط الحالة لكائن بتغيير سلوكه بناءً على حالته الداخلية. يتم تمثيل كل حالة بفئة منفصلة، ويفوض الكائن استدعاءات الطرق إلى كائن حالته الحالي.

مثال البطلة. يمكن استخدام نمط الحالة لتنفيذ سلوك بطلة في لعبة منصات. يمكن أن تكون للبطلة حالات مثل الوقوف، والقفز، والانحناء، والغوص. تحدد كل فئة حالة سلوك البطلة لكل إدخال.

انتقالات الحالة. لتغيير الحالات، نحتاج إلى تعيين state_ للإشارة إلى الحالة الجديدة. إذا لم يكن لكائن الحالة أي حقول أخرى، فإن البيانات الوحيدة التي يخزنها هي مؤشر إلى جدول طرق افتراضية داخلي حتى يمكن استدعاء طرقه. في هذه الحالة، لا يوجد سبب لوجود أكثر من مثيل واحد منه.

11. نمط حلقة اللعبة يفصل زمن اللعبة عن إدخال المستخدم وسرعة المعالج.

افصل تقدم زمن اللعبة عن إدخال المستخدم وسرعة المعالج.

سرعة اللعب المتسقة. يضمن نمط حلقة اللعبة أن تعمل اللعبة بسرعة متسقة بغض النظر عن الأجهزة الأساسية أو إدخال المستخدم. يتم تحقيق ذلك من خلال فصل منطق تحديث اللعبة عن عملية العرض.

خطوات زمنية متغيرة. في حلقة اللعبة ذات الخطوات الزمنية المتغيرة، فإن مقدار الوقت الذي يمر بين كل تحديث ليس ثابتًا. بدلاً من ذلك، يتغير اعتمادًا على معدل الإطارات. ثم تكون المحرك مسؤولة عن دفع عالم اللعبة للأمام بمقدار ذلك الوقت.

خطوة تحديث زمنية ثابتة، عرض متغير. تحاكي اللعبة بمعدل ثابت باستخدام خطوات زمنية ثابتة آمنة عبر مجموعة من الأجهزة. فقط أن نافذة اللاعب المرئية إلى اللعبة تصبح أكثر تقطعًا على جهاز أبطأ.

12. نمط تحديث الطريقة يحاكي كائنات مستقلة من خلال تحديثات متسلسلة.

حاكي مجموعة من الكائنات المستقلة من خلال إخبار كل منها بمعالجة إطار واحد من السلوك في كل مرة.

محاكاة كائنات متزامنة. يحاكي نمط تحديث الطريقة مجموعة من الكائنات المستقلة من خلال استدعاء طريقة update() على كل كائن في كل إطار. يمنح هذا كل كائن فرصة لتحديث حالته وسلوكه.

مثال الكيانات. يمكن استخدام نمط تحديث الطريقة لمحاكاة الكيانات في عالم اللعبة. تحتوي كل كيان على طريقة update() يتم استدعاؤها في كل إطار. يمكن أن تتعامل طريقة update() مع أشياء مثل الذكاء الاصطناعي، والفيزياء، والرسوم المتحركة.

اعتبارات الأداء. يمكن تحسين نمط تحديث الطريقة باستخدام تقنيات محلية البيانات. يتضمن ذلك تخزين بيانات جميع الكيانات في كتلة متجاورة من الذاكرة، مما يمكن أن يحسن أداء التخزين المؤقت.

13. التخزين المؤقت المزدوج يخلق وهم التزامن من خلال فصل الوصول إلى البيانات عن التعديل.

يجعل سلسلة من العمليات المتسلسلة تبدو فورية أو متزامنة.

تحديثات الحالة الذرية. يسمح نمط التخزين المؤقت المزدوج بالتعديل التدريجي للحالة مع ضمان أن ترى الشيفرة الخارجية دائمًا لقطة متسقة وذرية من البيانات. يتم تحقيق ذلك من خلال الحفاظ على نسختين من البيانات: مخزن حالي ومخزن التالي.

مثال عرض الرسوم. يُستخدم نمط التخزين المؤقت المزدوج بشكل شائع في عرض الرسوم لمنع التمزق. تكتب الشيفرة الخاصة بالعرض إلى المخزن التالي، بينما يقرأ برنامج تشغيل الفيديو من المخزن الحالي. عندما تكتمل عملية العرض، يتم تبديل المخزنين.

اعتبارات الأداء. يتطلب التبديل نفسه وقتًا. يتطلب التخزين المؤقت المزدوج خطوة تبديل بمجرد الانتهاء من تعديل الحالة. يجب أن تكون تلك العملية ذرية - لا يمكن لأي شيفرة الوصول إلى أي حالة أثناء تبديلها.

14. نمط محدد الخدمة يوفر نقطة وصول عالمية للخدمات مع تقليل الترابط.

يوفر نقطة وصول عالمية إلى خدمة دون ربط المستخدمين بالفئة المحددة التي تنفذها.

الوصول المفصول للخدمات. يوفر نمط محدد الخدمة نقطة وصول عالمية إلى خدمة دون ربط الشيفرة التي تستخدم الخدمة بالتنفيذ المحدد. يسمح ذلك بمرونة أكبر وقابلية للاختبار.

مثال نظام الصوت. يمكن استخدام نمط محدد الخدمة لتوفير الوصول إلى نظام الصوت. توفر فئة Locator طريقة getAudio() التي تعيد مثيلًا من واجهة Audio. يمكن تبديل التنفيذ الفعلي لنظام الصوت دون التأثير على الشيفرة التي تستخدمه.

خدمة فارغة. إذا لم يكن بالإمكان تحديد موقع الخدمة، يمكن للمحدد إرجاع خدمة فارغة. تنفذ الخدمة الفارغة واجهة الخدمة، لكنها لا تفعل شيئًا فعليًا. يسمح ذلك للعبة بالاستمرار في العمل حتى إذا لم تكن الخدمة متاحة.

15. نمط صندوق فرعي يحدد السلوك في الفئات الفرعية باستخدام عمليات الفئة الأساسية.

حدد السلوك في فئة فرعية باستخدام مجموعة من العمليات التي توفرها فئتها الأساسية.

سلوك الفئة الفرعية المقيد. يحدد نمط صندوق الفرعي السلوك في فئة فرعية باستخدام مجموعة من العمليات التي توفرها فئتها الأساسية. يحد هذا من وصول الفئة الفرعية إلى بقية النظام، مما يعزز التغليف ويقلل من الترابط.

مثال القوى الخارقة. يمكن استخدام نمط صندوق الفرعي لتنفيذ القوى الخارقة في لعبة. توفر فئة Superpower الأساسية طرقًا لتحريك البطل، وتشغيل الأصوات، وإنتاج الجسيمات. يمكن للفئات الفرعية بعد ذلك تنفيذ قوى خارقة محددة من خلال استدعاء هذه الطرق.

أشجار وراثية واسعة. يؤدي هذا النمط إلى بنية حيث لديك تسلسل فئات ضحل ولكنه واسع. ليست سلاسل وراثتك عميقة، ولكن هناك الكثير من الفئات التي تتعلق بفئة Superpower. من خلال وجود فئة واحدة مع العديد من الفئات الفرعية المباشرة، لدينا نقطة نفوذ في قاعدة الشيفرة لدينا.

16. نمط بايت كود يمنح السلوك مرونة البيانات من خلال آلة افتراضية.

امنح السلوك مرونة البيانات من خلال ترميزه كتعليمات لآلة افتراضية.

سلوك مدفوع بالبيانات. يسمح نمط بايت كود بتعريف السلوك في البيانات بدلاً من الشيفرة. يمكّن هذا من مرونة أكبر، وتعديل أسهل، ورمل أكثر أمانًا.

مثال نظام التعويذات. يمكن استخدام نمط بايت كود لتنفيذ نظام تعويذات في لعبة. يتم تعريف كل تعويذة كسلسلة من تعليمات بايت كود التي يتم تنفيذها بواسطة آلة افتراضية. يسمح ذلك للمصممين بإنشاء تعويذات جديدة دون الحاجة إلى كتابة شيفرة.

آلة مكدس. تحافظ الآلة الافتراضية على مكدس داخلي من القيم. في مثالنا، فإن الأنواع الوحيدة من القيم التي تعمل معها تعليماتنا

آخر تحديث::

FAQ

What's Game Programming Patterns about?

  • Focus on Game Development: Game Programming Patterns by Robert Nystrom is a comprehensive guide that delves into design patterns specifically tailored for game development.
  • Patterns for Better Code: It presents various design patterns that help create cleaner, more efficient, and maintainable code, crucial as game projects grow in complexity.
  • Practical Examples: The book includes practical examples and code snippets, primarily in C++, to demonstrate how these patterns can be implemented in real-world scenarios.

Why should I read Game Programming Patterns?

  • Improve Code Quality: The book introduces design patterns that promote better organization and structure in your code, enhancing your coding skills.
  • Learn from Experience: Robert Nystrom shares insights from his industry experience, particularly from his time at Electronic Arts, offering valuable lessons to avoid common pitfalls.
  • Accessible to All Levels: Designed to be approachable, it is a great resource for both beginners and experienced developers looking to improve their game programming skills.

What are the key takeaways of Game Programming Patterns?

  • Importance of Design Patterns: The book emphasizes how design patterns can lead to cleaner and more maintainable code, with detailed discussions on patterns like Command, Observer, and State.
  • Decoupling Code: A major theme is the need to decouple code to make it easier to manage and extend, especially in games where different systems must interact.
  • Performance Considerations: It addresses performance issues specific to games, such as efficient memory management and optimizing code for real-time execution.

What are the best quotes from Game Programming Patterns and what do they mean?

  • "Every kid has dreamed of being a superhero...": This introduces the Subclass Sandbox pattern, emphasizing a data-driven approach to manage multiple behaviors without redundancy.
  • "A virtual machine... is often as simple as a stack, a loop, and a switch statement.": Highlights the simplicity of creating complex behaviors through a well-structured virtual machine.
  • "The more you can use stuff in that cache line, the faster you go.": From the Data Locality section, it underscores the importance of organizing data in memory to optimize CPU cache usage.

How does the Command pattern work in Game Programming Patterns?

  • Encapsulating Requests: The Command pattern encapsulates a request as an object, allowing for parameterization of clients with different requests.
  • Decoupling Actions: It decouples the sender of a request from the object that handles it, making code more flexible and easier to manage.
  • Example Implementation: Nystrom illustrates this with an input handler example, using command objects to represent actions like jumping or firing a weapon.

How does the State pattern function in Game Programming Patterns?

  • Behavioral Changes: The State pattern allows an object to alter its behavior when its internal state changes, useful for managing complex behaviors in game characters.
  • Encapsulation of State Logic: Each state is represented by a class implementing a common interface, keeping the code organized and simplifying transitions between states.
  • Example Usage: Nystrom provides an example of a game character in different states, each handling its own input and behavior.

What is the Game Loop pattern in Game Programming Patterns?

  • Continuous Execution: The Game Loop pattern is essential for running a game continuously, processing user input, updating game state, and rendering graphics.
  • Decoupling Time from Input: It decouples game time progression from user input and processor speed, ensuring consistent gameplay across different hardware.
  • Implementation Example: The book outlines a basic game loop structure, providing a foundation for any game engine.

How does the Observer pattern work in Game Programming Patterns?

  • Decoupled Communication: The Observer pattern allows one object to notify multiple observers about changes in its state without being tightly coupled to them.
  • Event Handling: Useful for implementing event-driven systems, such as notifying different parts of a game when a player achieves something.
  • Example Implementation: Nystrom illustrates this with a physics engine example that notifies an achievement system when an event occurs.

What is the Double Buffer pattern in Game Programming Patterns?

  • Preventing Tearing: The Double Buffer pattern prevents visual tearing in graphics rendering by maintaining two buffers for displaying and drawing frames.
  • Atomic Updates: By swapping buffers at the end of each frame, the game presents a complete image without showing intermediate states.
  • Implementation Details: The book provides a simple implementation, demonstrating efficient buffer management for smooth visual results.

How does the Object Pool pattern work in Game Programming Patterns?

  • Reuse Objects Efficiently: The Object Pool pattern allows for the reuse of objects from a fixed pool, reducing memory fragmentation and improving performance.
  • Fixed Pool Size: It creates a collection of objects upfront, avoiding the overhead of frequent memory allocation.
  • Manage Active Objects: Objects can be marked as "in use" or available, allowing the pool to manage reuse without new memory allocation.

What is the purpose of the Dirty Flag pattern in Game Programming Patterns?

  • Track Changes Efficiently: The Dirty Flag pattern avoids unnecessary recalculations by deferring updates until derived data is needed.
  • Set and Clear Flags: When primary data changes, the dirty flag is set, and recalculations occur only if necessary when derived data is requested.
  • Improve Performance: This ensures expensive calculations are performed only when required, leading to smoother performance.

How does the Data Locality pattern enhance performance in Game Programming Patterns?

  • Optimize Memory Access: The Data Locality pattern arranges data in memory to take advantage of CPU caching, reducing cache misses.
  • Contiguous Memory Layout: Organizing data structures contiguously allows the CPU to load larger data chunks efficiently.
  • Impact on Game Performance: Optimizing data locality significantly enhances game speed and responsiveness, crucial for performance.

مراجعات

4.48 من 5
متوسط 1.5K التقييمات من Goodreads و Amazon.

كتاب أنماط برمجة الألعاب يحظى بإشادة كبيرة بفضل شروحه الواضحة، وأسلوبه الكتابي الجذاب، والأمثلة العملية على أنماط التصميم المطبقة في تطوير الألعاب. يقدّر القراء روح الدعابة لدى المؤلف، ورؤاه حول اعتبارات الأداء، والنقاش المتوازن حول المزايا والعيوب لكل نمط. وجد الكثيرون أنه ذو قيمة لكل من المبتدئين والمطورين ذوي الخبرة، مع ملاحظة بعضهم لمدى صلته بمجالات أخرى تتجاوز برمجة الألعاب. بينما أشار بعض النقاد إلى أمثلة قديمة بلغة C++ وتركيز على أنواع معينة من الألعاب. بشكل عام، يعتبر معظم المراجعين الكتاب قراءة أساسية لمطوري الألعاب.

Your rating:
4.66
70 تقييمات

عن المؤلف

روبرت نيستروم هو مبرمج ذو خبرة واسعة تمتد لعشرين عامًا في المجال المهني، بما في ذلك ثماني سنوات في شركة إلكترونيك آرتس. لقد عمل على مشاريع ألعاب متنوعة عبر منصات متعددة، بدءًا من سلاسل الألعاب الكبيرة مثل "مادن" وصولًا إلى العناوين الأصغر. يشعر نيستروم بالفخر بشكل خاص بمساهماته في الأدوات والمكتبات المشتركة التي تمكّن المطورين الآخرين. تكمن شغفه في إنشاء كود نظيف وقابل للاستخدام يعزز من القدرات الإبداعية للآخرين. يقيم نيستروم في سياتل مع عائلته، ويشتهر بكرم ضيافته ومهاراته في الطهي. يعكس كتابه حول أنماط برمجة الألعاب خبرته الواسعة ورغبته في مشاركة المعرفة مع زملائه المطورين.

Listen
Now playing
Game Programming Patterns
0:00
-0:00
Now playing
Game Programming Patterns
0:00
-0:00
1x
Voice
Speed
Dan
Andrew
Michelle
Lauren
1.0×
+
200 words per minute
Queue
Home
Library
Get App
Create a free account to unlock:
Recommendations: Personalized for you
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Ratings: Rate books & see your ratings
100,000+ readers
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 4
📜 Unlimited History
Free users are limited to 4
📥 Unlimited Downloads
Free users are limited to 1
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Jul 7,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Start a 7-Day Free Trial
7 days free, then $44.99/year. Cancel anytime.
Scanner
Find a barcode to scan

Settings
General
Widget
Loading...