Table of Contents
יישום רשתות מרובות משתתפים במשחקים חצי-חיים ו- Counter- ⁇ נדרש לפתור אתגרים טכניים עמוקים שימשיכו להשפיע על פיתוח משחק מקוון היום.הנבנה במקור כשינוי של מנוע Quake-derive של Valve, Counter- ⁇ התפתח לכותרת בולטת שדרשה דיוק גבוה, אלגוריתמים נמוכים, ומשחקי הונאה ברשת.
מודל שירות לקוחות במפורט
Half-Life ו- Counter- ⁇ יישמו ארכיטקטורת לקוחות קפדנית שבה השרת שומר על שליטה סמכותית על כל מצב המשחק.כל פעולה של שחקן - בין אם היא נעה, ירי או העלאה מחדש - יש לאמת על ידי השרת לפני שהוא משפיע על הסימולציה.עיצוב הזה מונע טמפונים ושמירה על עקביות בכל הלקוחות המחוברים.
המונחים Server
במנוע גולדסאר של Valve (ומאוחר יותר מקור), השרת מנהל את סימולציה מלאה של פיזיקה, זיהוי התנגשות, כללי המשחק ולוגיקה AI. לקוחות לשלוח פקודות קלט גולמי (למשל, סדקים או תנועות עכבר) לשרת, אבל הם אף פעם לא משפיעים ישירות על העולם.השרת מעבדים האלה, מעדכנים את המדינה, ומפעילים את המיקומים החדשים, בריאות, אירועים, ישויות וסימולציות אחוריות לכל השחקנים האלה, באופן אוטומטי, משום שעדיין לא ניתן להזיזו את המשחק, אלא רק באמצעות משחק זה, באופן אוטומטי, כמו משחק הוגן, כמו משחק זה, רק דרך משחק כללי, זה, רק דרך משחק יעיל יותר, כמו משחק כללי, כלומר, רק דרך משחק זה, כלומר, רק דרך משחק חכם יותר, הוא רק דרך עיצובי תיבות של משחק מרפא, או לחץ דם, או דרך מטרה פשוטה יותר, דרך משחק חכם יותר, דרך משחק זה, דרך משחק זה, דרך משחק זה, באופן אוטומטי, רק דרך משחק זה, דרך משחק זה, או משחק חכם יותר, הוא רק דרך משחק חכם יותר, רק דרך משחק חכם יותר, הוא רק על ידי ניסיון רב-כך, הוא רק דרך משחק זה, דרך משחק זה, רק על ידי ניסיון רב-כך, רק דרך משחק זה, לחץ-
לקוח Input Process
כל לקוח אוסף את השחקן קלט כל מסגרת וחבילות אותו לתוך מבנה פיקוד הכולל וקטורים תנועה, זוויות תצוגה, כפתור קובע, ופעמים-אמפ. פקודות אלה נשלחות לשרת כמו UDP Datagrams.השרתים הנכנסים פקודות, מבצעת אותם ברצף הנכון על בסיס סדר מתקתק, ומחלימים אותם על הסימולציה הסמכותנית.
רשת תחבורה: למה UDP ו- Custom Reliability
Half-Life ו- Counter- ⁇ מסתמכים בעיקר על UDP (פרוטוקול נתונים של משתמשים) עבור החלפת נתונים בזמן אמת, בחירתו על TCP למרות המסירה המובטחת של TCP והענקת הטבות.ההחלטה נבעה מהצורך בעקביות נמוכה ויכולת להתאושש במהירות מהפסד החבילה.
UDP vs. TCP Trade-offs
TCP מספק משלוח אמין, הזמנה, אבל זה מציג גדול מעל הראש: זה דורש אישור, ביטול של חבילות אבודות, וחלון גודש שיכול לגרום חסימת ראש של קו מראש.ב היורה מהיר, אפילו עיכוב קטן שנגרם על ידי המתנה עבור חפיסת אבודה כדי להיות משוחרר יכול להרוס את חוויית המשחק.
אובדן יד וזיקוק
קוד הזהב שלש קשת מיישם את שכבת האמינות שלו על גבי הודעות ביקורתיות UDP (כגון תוצאות ירי נשק או מקרי מוות של שחקן) נשלחים באמצעות ערוץ אמין שחבילות ובקשות לניתוק אם ההכרה אינה מקבלת בתוך פרק זמן. עדכונים ביקורתיים פחות - כמו שינויים בעמדה או מצב אנימציה - נשלחים ללא תשלום, ומאפשרים למערכת לצלם תמונות ישנות יותר לטובתם של מספרי השבתה או לאתר מחדש של נתונים מוגבלים או כיסוי עיניים שאבדו לכל סוג של תמונות של המשחק.
עבור מבט עמוק יותר לתוך האבולוציה של רשתות משחק בזמן אמת, המצגת של Valve של GDC 2001 על ידי Yahn ברניר מספקת סקירה מקיפה של הטכניקות המשמשות במחצית החיים: FLT:0Latency Compensating Methods in Customer /Server in-Game Protocol design and OptimizationFLT:1.
משחקים עם רשתות בלתי מוגבלות
גם עם UDP ואמינות אישית, שחקנים חווים שקיפות משתנה, אובדן החבילה, ו- Jitter. כדי לשמור על האשליה של תגובה מיידית ונוף עקבי בעולם, Half-Life ו- Counter- ⁇ יישמו שלוש טכניקות קריטיות: תחזית בצד הלקוח, פיוס השרת, ו-ישות אינטרפולציה.
תחזית לקוחות-Side ו- Server Reconciliation
ללא תחזית מצד הלקוח, כל פעולה של שחקן תהיה כפופה לעקב עגול: אתה לוחץ על העכבר, הפקודה נוסעת לשרת, השרת מעבד אותו, והתוצאה נעה בחזרה.עבור משחק כמו Counter- ⁇ , שבו זמני התגובה נמדדים במילימטרים, כי עיכוב יהיה בלתי מתקבל על הדעת.
עם זאת, החיזוי של הלקוח עשוי להידרדר ממצב הסמכות של השרת בשל lag, אובדן החבילה או הבדלים בסימולציה. Server פיוס לתקן את הסטיות האלה.כל פעם השרת שולח תמונה של מצב המשחק, הלקוח משווה את עמדות השרת עם מצבה הנבא שלו.אם יש תקלה, הלקוח מזיז את ישויותיו המקומיות כלפי השרתים, תיקון התחזיות מבלי להרגיש את התחזיות הנגדיות של הניאקציה.
אינטואיציה אינטרפולציה
מכיוון שהשרת שולח רק עדכונים בתדר קבוע (קצב הקרציות), הלקוח מקבל תמונות דיסקרטיות.ההתנגדות ממלאת את הפערים על ידי ביצוע עמדות אובייקט בזמן בין השניים האחרונים שהתקבלו, באמצעות ממוצעים במשקל המבוססים על הפעמים tamps. זה יוצר תנועה חלקה, רציפה גם כאשר השרת מעדכנת רק 20 או 66 פעמים לשנייה באנטי-polation, הוא נראה כי הם נעים בין הפונקציות של המערכת המרחביתות: "לפתורים" הם נראים בין האנימציה חלקה" (Pretamps) לבין המשתנים בצורה חלקה.
« « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «
אחת התכונות החדשניות ביותר בצופן הנגדי היא פיצוי על כלי נשק (מחליפים, אקדחים, רובים צלפים) כי כדורים נוסעים מיד מכניקה של Hitcan, השרת חייב להחליט אם פגיעה בהתבסס על עמדת היעד ברגע שהנורה פוטרה - לא כאשר השרת מעובד אותה.
הפתרון של Valve מאחסן היסטוריה קצרה של כל שחקן עבור מאה השניות האחרונות בשרת. כאשר השרת מקבל פקודה ירונית, הוא מסתכל על המיקום של המטרה בזמן הלקוח של היורה ראה אותם (המקבילה של הטיימס בפקד) השרת מדווח על הזיהוי נגד עמדה היסטורית זו, ולא על השיטה הנוכחית - כלומר, פיצויי תגמול מקסימליים (גם אם לא ניתן למזער את הנאות), אלא גם כן, אם הוא מקבל את הפחתת הסיכון הגבוה מדי) של הפחתת הנאות גבוהה מדי.
ניתן למצוא התמוטטות מפורטת של טכניקה זו בFLT:0Gaffer על GamesFLT:1, שבו גלן פידל מסביר שיטות דומות המשמשות ירי מרובה משתתפים.
תזמון ועדכונים Frequency
קצב הקרציות של השרת קובע באיזו תדירות הוא מעבד קלט ושולח תמונות. בתחילת Counter- ⁇ 1.6, שיעור ברירת המחדל של שרת ברירת המחדל היה סביב 20 הרץ (20 עדכונים לשנייה) בשרתים רשמיים, בעוד השרתים התחרותיים לעתים קרובות גדל ל-33 או אפילו 100 הרץ באמצעות הגדרות מותאמות אישית.שיעורי סיגנל גבוהים יותר להפחית את העיכוב בין פעולת השחקן לבין תגובת השרת, אך הם גם מגבירים רוחב פס ו- CPU.
Server Tick Rate (sv tickrate)
קצב הסימון קשור ישירות לגודל הסימולציה של השרת. at 33 הרץ, כל סיגנל מייצג כ -30 מ"מ של זמן המשחק.השרת מבצע את כל הפקודות המתונות, מנהל את הפיזיקה, תהליכים, ושולח תמונה מלאה לכל הלקוחות כל סיגנל גבוה יותר פירושו יותר פגיעה מדויקת ותנועה חלקה יותר, אבל זה גם מגביר את העומס על CPU של השרת ו-In מודרני לנטרל את אותם עקרונות, אך הם עדיין סטנדרטיים של ⁇ , אך ורק 64 נקודות קידוד, אך ורק 0, אך ורק 0, אך ורק 0, 12.
הגדרות של לקוחות (lerp)
בצד הלקוח, פרמטר של אינטרפולציה הנקרא:0 (או FLT:1) שולט כמה רחוק אחורה בזמן הלקוח עושה את המשחק לפצות על עיכוב רשת.לקוחות חייבים לבחור ערך מפועש אשר מאזן חלקות עם רסן. a low lerp מורידה את הגמישות החזותית אבל יכול לגרום ל- jr אם הם אבודים; רצועה גבוהה חלקה רשת בלתי סדירה, אך לעתים קרובות מוסיף את מה שהופך את העיכוב הנכון לשחק את ה-ream.
®Bandwidth and Data Optimization
Half-Life ו- Counter- ⁇ נועדו לחיבורים באינטרנט של עידן שלהם (56k מודמים לפס רחב מוקדם) כדי לשמור על רוחב פס מנוהל, נטוקוד השתמש בכמה טכניקות אופטימיזציה.
דלתא
השרת אינו שולח מצב משחק מלא עם כל תמונה.במקום, הוא שולח תמונת בסיס לאחר שחקן מתחבר, וצילומים הבאים הם דלה-ממדכאים: רק השינויים (דלטס) מאז הצילום האחרון המוכר מועברים.זה מפחית באופן דרסטי את גודלו של כל עדכון.לדוגמה, אם שחקן עומד עדיין, השרת עשוי לשלוח רק עדכון זעיר שאינו מציין שינוי אם הוא כולל לוחמת נשק חדש, אלא גם לחץ על ידי שחקן מוליד, אלא אם הוא לא כולל דחיסה (אום) או משחק מוליד, אלא גם לחץ על ידי לוחמת כלי נשק חדש, אלא אם שחקן, אם שחקן, אם שחקן, אם שחקן, לדוגמה, אם שחקן, אם שחקן, אם הוא לא כולל דחיסה, אם שחקן, הוא לא כולל דחיסה, אם שחקן, אם שחקן, הוא לא כולל משחק מוליד, לדוגמה, אם שחקן, אם שחקן עומד עדיין, אם שחקן, לחץ על ידי לוחמת הפלאש-קולארי, אם שחקן, הוא לא כולל משחק מוליד, אם שחקן, לחץ על גבי לוחמת פלאש, אם שחקן, אם שחקן, אם שחקן, לדוגמה, לחץ על גבי לוחמת הפלאש-קולארי, הוא לא משנה, אם שחקן, לדוגמה, לדוגמה, לחץ על ידי לוחמת הפלאש-קול
עדכון מחירים משתנה
אירועים קריטיים כמו נזק, הורג, ואש כלי נשק נשלחים מיד באמצעות ערוץ אמין, בעוד עדכונים קבועים בדרג הקרציות באמצעות ערוץ לא אמין.השרת גם מתאמת באופן דינמי את שיעור העדכון המבוסס על רוחב פס זמין ועל איכות חיבור לקוחות.אם לקוח חווה אובדן החבילה, השרת עשוי להפחית את תדירות עדכונים שאינם חיוניים או לעבור לתעל אמין יותר עבור נתונים קריטיים.
אדריכלות אנטי-Cheat (VAC ו- Beyond)
אין דיון על Half-Life ו- Counter- ⁇ Network שלם מבלי להזכיר את Valve Anti-Cheat (VAC) למרות VAC הוא בעיקר סריקת צד לקוח ומערכת זיהוי בצד השרת, העיצוב שלה מסתמך על הקוד הסמכותי של השרת.
- בדוק כי המשחק של הלקוח ניתן להפעלה ו- DLLs תואם גרסאות טובות הידועות.
- דפוסים כגון שימוש ב-Tebot על ידי ניתוח סטטיסטיקת דיוק לירות שנשלח לשרת.
- חשבונות בורות שנתפסים באמצעות חתימה של רמאות ידועה.
באופן קריטי, סמכות השרת מונעת הרבה רמאות משותפת: קירק יכול רק לחשוף את מה שכבר נשלח ללקוח (השרת שולח את כל תפקידי הישות, כך שקירות מצטמצם על ידי ההיגיון "היכולות" של השרת ועל ידי הגבלת לקוחות הנתונים לקבל על אויבים מרוחקים). השילוב של סמכות קודקוד ומערכות אנטי-כימות חיצוניות נשאר תקן עבור היורה תחרותי.
לקבלת מידע נוסף על ההיסטוריה והיכולות של VAC, ראה:0.Valve's official Anti-Cheat pageFLT:1.
מורשת והשפעה על Netcode המודרנית
טכניקות הרשתות החלוצה ב-Half Life ו- Counter- ⁇ הקימו תבנית שעדיין באה בעקבות כמעט כל משחק מקוון גדול.משחקים מודרניים כגון Overwatch, Valorant, ו-Call of Duty להשתמש בחיזוי בצד הלקוח, השרת, פיצוי, דחיסה דלה, דחיסה מבוססת טייפ ועדכונים המבוססים על קוד פתוח ו- GDC עזרו לחנך דור שלם של אפשרויות המשחק.
ההשפעה משתרעת מעבר ל- Shoots. Combat Games, כותרות אסטרטגיות בזמן אמת, ואפילו משחקי מרוץ אימצו ארכיטקטורות דומות של הלקוח או עמיתים ל-peer עם חיזוי וגלגלבק.בעיות הליבה (עקביות, אובדן החבילה, רמאות) נשאר זהה, ואת הפתרונות שפותחו עבור Half-Life ו- Counter- ⁇ לספק נקודת התחלה חזקה עבור כל משחק רשת.
עבור סקירה טכנית של כיצד קוד קוד קוד קוד מטפל שכפול וחיזוי היום, מתייחס ל- FLT:0Valve של Source Multiplayer Networking DocumentsFLT:1.
לסיכום, רשתות מרובות משתתפים ב-Half-Life ו- Counter- ⁇ לא רק מוצר של זמנו אלא הישג יסוד שהוכיח כיצד לספק משחק מקוון מגיב, הוגן ורחב.על ידי איזון אופטימיזציה של ביצועים עם סמכות שרת קפדנית, Valve יצר ניסיון שמיליוני שחקנים עדיין נהנים כיום - וזה ימשיך להודיע כיצד משחקים ברחבי האינטרנט.