Rollback netcode משקר לכם כמה פריימים, ולכן משחקי לחימה עובדים ברשת
טוני קאנון כתב את GGPO סביב 2006 כדי לשחק ב־Street Fighter III דרך האינטרנט. השיטה חצופה: לחזות את הקלט של היריב, להציג את התוצאה מיד, וכשהניחוש שגוי להריץ את הסימולציה אחורה ומחדש.
נתחיל בסדר הגודל של הבעיה. משחק לחימה רץ בשישים פריימים לשנייה, כלומר פריים נמשך 16.7 אלפיות שנייה. מכה מהירה יוצאת בשלושה עד שישה פריימים, וחלון החסימה שלה הוא אחד או שניים. חבילת מידע מלוס אנג'לס לניו יורק לוקחת כארבעים אלפיות שנייה לכיוון אחד, ולטוקיו יותר ממאה. הרשת איטית מהיחידה המשמעותית הקטנה ביותר של המשחק, ואי אפשר לעשות עם זה דבר. אפשר רק לבחור כיצד לשקר לשחקן.
השקר הראשון: השהיית קלט
הפתרון הקלאסי נקרא delay-based. שתי המכונות ממתינות לקלט של היריב ואינן מתקדמות עד שהוא מגיע. כדי שרעידות הרשת לא יגרמו לקפיצות, מוסיפים השהיית קלט: הכפתור שלכם אינו פועל עכשיו אלא כעבור כמה פריימים, והמרווח הזה מספיק בדרך כלל לחבילה להגיע.
היתרון הוא ששני הצדדים רואים קרב זהה לחלוטין. החסרונות שניים ושניהם כבדים. השליטה נעשית רכה: שלושה עד חמישה פריימים מפרידים בין הלחיצה למכה, והגנות מדויקות פשוט מפסיקות לעבוד. וכשחבילה אובדת, שני השחקנים קופאים — אותה גמגום גומייתי המוכר ממצבי הרשת של משחקי SNK הוותיקים ושל Arc System Works המוקדמים.
השקר השני: גלגול לאחור
Rollback בנוי הפוך. המכונה אינה מחכה לדבר. בהיעדר קלט מרוחק היא מניחה שהיריב עושה את מה שעשה בפריים הקודם, הנחה שכמעט תמיד נכונה, משום שכפתורים מוחזקים ולא משוחררים בכל פריים. המשחק מתקדם מיד.
כשהקלט האמיתי מגיע וסותר את הניחוש, המנוע לוקח את המצב השמור של אותו פריים, מחיל עליו את הקלט הנכון ומריץ מחדש את כל הפריימים עד ההווה, הכול בתוך פריים תצוגה אחד. על המסך זה נראה כקפיצה של היריב בכמה פיקסלים. הדמות שלכם צייתנית לחלוטין לאורך כל הזמן, משום שהקלט שלכם מעולם לא נוחש.
delay-based משקר על מתי לחצתם. rollback משקר על מה שעשה היריב. אין אפשרות שלישית.
מדוע אי אפשר פשוט להפעיל את זה
החלק המעניין הוא דרישות המנוע, הסיבה שאולפנים אמרו שנים שאינם יכולים להוסיף גלגול לאחור.
ראשית, הסימולציה חייבת להיות דטרמיניסטית: קלט זהה חייב לייצר מצב זהה, תמיד. בלי קריאות לשעון המערכת, בלי מחולל מספרים אקראיים לא מאותחל, ובזהירות רבה עם נקודה צפה.
שנית, את מצב המשחק צריך לדעת לשמור ולשחזר במלואו, בזול, עשרות פעמים בשנייה — ההיסטוריה נשמרת כשבעה או שמונה פריימים אחורה. אם המצב מרוח בין אובייקטי המנוע ותת־מערכת הגרפיקה, אין מה לשמור.
שלישית, יש לנתק את הסימולציה מהציור כדי שאפשר יהיה להריץ שבעה צעדי לוגיקה בתוך פריים מוצג אחד. מנוע שהלוגיקה שלו חיה בתוך לולאת הציור יידרש לכתיבה מחדש.
איך זה הפך לנורמה
את GGPO כתב טוני קאנון, ממייסדי טורניר Evo, סביב 2006, לשימושו האישי, כדי לשחק במשחקי לחימה ותיקים ברשת. הספרייה הריצה את Street Fighter III: Third Strike Online Edition ב־2011, את Skullgirls ב־2012 ואת Killer Instinct ב־2013. ב־9 באוקטובר 2019 שחרר קאנון את הקוד ברישיון MIT, ובתוך שנים אחדות הפך הגלגול לאחור מיתרון לדרישה: הז'אנר החל לדחות משחקים שיצאו בלעדיו עוד לפני ההשקה.
כדאי להבין מדוע השיטה נשארה בתוך משחקי הלחימה. עלות הגלגול פרופורציונית ישירות לגודל המצב ולמספר הישויות המחושבות מחדש. שתי דמויות במישור אחד הן מצב זעיר שאפשר להעתיק שישים פעם בשנייה. מאה שחקנים בעולם פתוח לא. משחקי ירי משתמשים בשקר קרוב אך א־סימטרי: הלקוח חוזה תנועה, והשרת, בבואו לאמת פגיעה, מגלגל את תיבות הפגיעה אחורה בזמן אל הרגע שראיתם. מכאן המוות המפורסם מאחורי הפינה — זהו הגלגול של מישהו אחר, שהוחל עליכם.
מקור: en.wikipedia.org