עצת פיתוח נוספת

Blue Beetle

New member
עצת פיתוח נוספת

אז ככה: במשחק שאני מפתח יש לי טבלת עצמים. חלק מהעצמים יכולים להפעיל עצמים אחרים (למשל לחצן הפותח דלת). עצמים אלו כוללים בתוכם מצביע לעצם המופעל. במהלך הריצה של המשחק עצמים יכולים להיעלם (להיות מושמדים). כרגע המשחק מניח שעצמים מופעלים הם לא מהסוג שיכול להיעלם, אבל אני רוצה איזשהו בסיס יציב כדי שבפיתוח עתידי אני לא אצטרך לבנות מחדש דברים ושתהיה אפשרות גם לאופציה הזו. אני חשבתי ליישם מערכת תגיות (tags כמו שיש במשחקים כמו doom). העצם המפעיל יקושר לא על ידי מצביע, אלא על ידי התגית. כאשר עצם יושמד, הוא פשוט יסיר את עצמו מטבלת התגיות. האם יש דרך חכמה / נוחה יותר? עצות יתקבלו בברכה.. (הערה: אני כותב ב- C++ בכוונה תחילה דווקא כדי להתמודד גם עם הסוגיות ששפות מנוהלות חוסכות ממני).
 
אפשרות

אתה יכול לתת לכך אוביקט במשחק id שאומר גם איזה אוביקט זה, וגם מאיזה סוג למשל לדלתות אתה נותן נגיד מ 0-100 לכפתורים 100-400 וכן הלאה, כל פעם שאתה יוצר אוביקט חדש אתה נותן לו id בטווח שלו שלא נמצא בשימוש כרגע. עכשיו, בנוסף לזה, תעבוד עם מערך בשם activeObjects שיכיל את כל האוביקטים הפעילים, ותקפיד להוסיף ולהסיר ממנו לפי הצורך אם אוביקט אחד קשור לאוביקט אחר, אז יהיה לו משתנה או מערך שיכיל את ה idsשל האוביקטים הרלוונטיים, וכדי לגדת אליהם תוציא אותם מהמערך של ה activeObjects יתכן שתצטרך קצת להתאים את המגנון הזה לצרכים שלך, בהתאם ליעילות. אם יש לך המון המון אוביקטים למשל, אולי שווה לנהל את זה קצת אחרת. אבל אם המספר מוגבל יחסית, ואתה לא עושה את הפעולה הזאת בכל רגע ורגע, זה אמור לעבוד לא רע.
 

Blue Beetle

New member
האמת שחשבתי על זה

לכל אובייקט יש מזהה טיפוס הירארכי שמיוצג על ידי מחרוזת. למשל "object.pickable.key" או "object.pickable.mask" או "object.monster.egg" וכדומה. הבעיה עם id היא כזאת: שבכל פעם שעצם מפנה לעצם אחר שכבר לא קיים, אני צריך לבדוק אם האובייקט עם ה- id הספציפי קיים או לא. זה גם מסורבל תכנותית (לבדוק אם אובייקט באמת קיים במבנה הנתונים) וגם, כיוון שעצמים חדשים נהרסים ונוצרים כל הזמן (למשל projectiles) אז גם צריך לנהל את כל זה וגם צריך להשאיר מרווח גדול מאד ל- id. מערך כמובן לא ראלי פה. חשבתי אולי שעצם גם ישמור נתונים כלשהם על מי יכול להפעיל אותו, אבל זה מסבך את העניינים עוד יותר. בינתיים השיטה של תגיות נראית הכי סבירה, אם כי היא מעט מגבילה את מה שאפשר לעשות אתה.
 

pulse11

New member
מושמדים = ברמת התצוגה!

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

Blue Beetle

New member
נגיד שיש לי שלב מטורף

בו משהו כמו 30 יצורים, יורים כל חצי שנייה ירייה. אחרי אפילו רק 20 דקות, מונה העצמים כבר מעבר ל-64K. אני מעדיף שלא* * יש גרסאות נאמנות למקור של משחקים כמו Bubble Bobble שעובדים על מחשבון גרפי עם זיכרון של 64k.
 
בנוגע ליריות או לדברים אחרים שחוזרים הרבה

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

Blue Beetle

New member
כלומר יש מערך אבסולוטי של אובייקטים

אז אני צריך סוג של מחסנית למזהים של disposable. ואני עוקף בדרך כלשהי את העובדה שעצם לא יכול מקושר ל- disposable (כדי שלא יהיה מצב שהוא יצביע בטעות לעצם הלא נכון). למעשה אני חוזר למצב הקיים (שהוא למעשה הגיוני), תודה. תודה.
 

someboddy

New member
זה נקרא pool

repository זה משהו אחר, שקשור לניהול והפצה של התוכנה עצמה. הייתי מביא קישור לוויקי, אבל הם סגורים היום.
 
אני קורה לזה הרבה פעמים רפוזיטורי

לקרוא לזה בריכה נשמע לי מוזר, למרות שאני מכיר את המושג כמובן
אבל אתה צודק, למה שאני אבלבל אנשים
 

freak2100

New member
אתה יכול...

לשמור איזשהו dictionary (או אם אתה רוצה לקרוא לזה map, אותו דבר), כנראה hash table, שממפה מ-id לפויינטר. כל עצם שאתה יוצר, יקבל ID ויכנס ל-dictionary. עכשיו עצמים שמפעילים עצמים אחרים, לא ישמרו פויינטר לעצמים האחרים אלא את ה-ID שלהם. מתוך ה-dictionary אתה יכול להוציא עצמים (אם זה hash table אז כל הפעולות ב-O 1 משוערך), ואז תוכל לראות שה-ID כבר לא קיים ב-dictionary ולהבין שהעצם לא קיים.
 
למעלה