אינטרנט עובד לאט :(

MegaMango

New member
אינטרנט עובד לאט :(

מתכנת משחק חלליות קטן באינטרנט בC++ אני משתמש בUDP ובכל פריים אני מקבל הודעה ושולח הודעה (בגודל 10 בייט) אבל אני רואה שיש delay גדול מאוד. אני משתמש בפונ' recv עם timeout=0. ניסיתי להגדיל את הtimeout אבל אז המשחק עובד לאט יותר .. כשכיוונתי את הטיימאאוט לFPS כלומר שתהיה אפשרות גם לעשות טיימאווט ולא להוריד את קצב הפריימים, למשחק עדיין יש delay גבוה מאוד. למישהו יש מושג למה זה קורה? ומה אפשר לעשות?
 

yoniBLA

New member
נשמע כאילו

אתה לא עובד עם מספר threadים, אלא הכל קורה באותו thread. זה באמת ככה?
 

MegaMango

New member
אכן.

לא רוצה להסתבך עם ט'רדים =.= למה זה משנה? כדי שהזמן שבו אני מחכה לקבלת ההודעה לא יעכב את התוכנית?
 

yoniBLA

New member
בדיוק.

there's no way around it. אתה לא יודע מתי תקבל הודעות, ולכן אתה לא לחכות להן בthread של לולאת המשחק.
 

MegaMango

New member
אז אני יכול לעשות איזושהי תוכנה

קטנה שרק עובדת ברקע ומחכה להודעות ואני יכול לתקשר בעזרתה עם התוכנית שלי? אבל אז, אני ארצה שהתוכנית הקטנה והמשחק לא יהיו מקושרים גם הם באינטרנט. אני יכול לעשות שהקטנה שומרת לתוך קובץ והמשחק קורא מיד אבל זה מאולתר מדי P: איך אני יכול לשתף משתנים בין שתי תוכנות?
 

someboddy

New member
לא תוכנה - THREAD

זה לא כזה מסובך, וזה יעבוד הרבה יותר מהר מאשר עוד תוכנה שרצה ברקע.
 

yoniBLA

New member
תקרא על threadים.

הרעיון מאחורי זה זהה לזה שתיארת (תוכנה אחרת שרצה ברקע), רק שמה שרץ ב"רקע" זה הת'רד, והוא רץ באותו פרוסס. מה זה אומר? במקום הרעיון שלך שהתוכנות ידברו דרך קובץ, הת'רדים יכולים לדבר דרך הזיכרון שמשותף להם (כיון שהם רצים מאותו פרוסס). אבל זה נושא שמוביל להרבה בעיות, לכן כדאי שתקרא עליו בצורה מסודרת.
 

MegaMango

New member
ארר...הלכתי לאיבוד

התחלתי לקרוא על ט'רד וזה לא נראה מסובך אבל יש משהו שאני לא מבין. מה ההבדל בין - יצירת thread שמבצע recv וברגע שמקבל מידע מעביר אותו לתוך המבנה (וthread אחר שברגע שהנתונים התחדשו, מעבד אותם ומצייר אותם ובלה בלה) .. לבין יצירת תהליך נפרד שמחכה להודעות (בלי טיים אאוט) וברגע שמקבל, הוא שולח אל המשחק את ההודעה בזמן שהמשחק מחכה להודעות עם timeout=0 ? כלומר...בשני המקרים יש תהליך אחד שמקבל הודעות ישירות מהרשת ותהליך אחר ש"קוטף" את המידע שהגיע אל התהליך השני. ועכשיו אני אפילו לא מבין למה timeout=0 לבד במשחק , בלי שום תהליך נוסף, גורם להשהייה הנוראית P:
 

someboddy

New member
ההבדל הוא

שTHREADים של אותו תהליך משתמשים באותו זיכרון. זה בעצם אומר שהTHREAD שקולט את הנתונים יכול לכתוב ישירות לתוך מבנים של הTHREAD של לולאת המשחק.
 

someboddy

New member
כן

אם אתה משתמש בשני תהליכים נפרדים, אתה חייב להשתמש בצינור בשביל להעביר את המידע לתכנית הראשית. והרי הצינור הוא מה שעשה לך את הבעיות מלכתחילה, לא? חוץ מזה ששני תהליכים זה יותר בזבזני, הן מבחינת זמן עיבוד והן מבחינת זיכרון.
 

MegaMango

New member
very melon

אז פשוט לעשות שthread אחד קורא לפונ' ה-recv וברגע שהוא מקבל, מעביר את הנתונים? איך אני יודע שבאמצע ההעברה של הנתונים הthread השני לא יתנגש ויקרא רק חצי מהם? אפשר לעשות איזשהו ערך שמתשנה רק אחרי שהthread שקיבל את הנתונים מסיים את כל העבודה שלו והthread השני מתעלם מהנתונים עד שהערך מורה שהוא מוכן?
 

De-Panther

New member
רעיון טוב מה שנתת..|זבנג|../images/Emo23.gif../images/Emo185.gif

בסוף ההודעה אם הייתי חושב על זה לפני כמה שנים זה היה חוסך לי כמה הסתבכויות
תן ערך בולאני כלשהו בתחילת התוכנה אחרי שאתה מקבל את הנתונים מרחוק ולפני שאתה משתמש בהם אתה בודק אם הוא טרו אם הוא טרו אתה הופך אותו לפולס... מקבל את הנתונים... מעבד אותם... הופך את הערך חזרה לטרו... הכי פשוט
 

yoniBLA

New member
זה לא באמת כל כך פשוט,

מה קורה אם בthread אחד אתה בודק את הערך של הבוליאן, בזמן שבthread השני אתה משנה את הערך שלו? עלול להיווצר מצב בו אתה מקבל שהוא true, בזמן שהthread השני משנה אותו לfalse, ואז יקרו דברים לא רצויים. הסיבה לכך ששתי פעולות כאלה יכולות לקרות במקביל היא שהפעולה של בדיקת ערך של משתנה, ושינוי שלו הן לא אטומיות. מה זה אומר? כשהקוד יתורגם לאסמבלי הן לא יתורגמו לפקודה אחת. לכן יכול להתבצע context switch (מעבר בין threadים) באמצע רצף האסמבלי, ויהיה בלאגן. לכן הצעתי לך כבר קודם לקרוא על threadים במסודר. הפיתרון הכי פשוט נקרא mutex. אפשר גם להשתמש בפעולות נעילה אטומיות. חפש על זה.
 

MegaMango

New member
הן לא אטומיות? הייתי בטוח שכן..

בכל אופן, במשחק שלי גם אם מה שאמרת מתרחש אין שום בעיה... אבל טוב לדעת את זה, בעתיד הייתי סובל משגיאות בלי לדעת מה המקור שלהן =.=
 
למעלה