SDL- double buffering, dirty rectangle - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

SDL- double buffering, dirty rectangle


בלה

Recommended Posts

שלום אני בונה משחק סנייק ב- c++ ורציתי להשתמש ב- SDL.

בעיקרון בציור רציתי להשתמש ב- double buffering והבנתי שיש דגל שלו ב- SDL ופקודת flip נוחה אבל זה לא עבד לי..

שאני כותב screen = SDL_SetVideoMode(640, 480, 16, SDL_DOUBLEBUF | SDL_FULLSCREEN);

זה אומר שמעכשיו כל ה- putPixel שלי יכתבו ל- back buffer וכדי להראות את זה אני אצטרך לעשות SDL_flip(screen) כי זה לא עבד לי.

עוד דבר שראיתי זה משהו שנקרא diry rectangle (אני לא בטוח בשם).. מישהו יכול להרחיב לי על זה בדיוק?

זה משתמש ב- SDL_UpdateRect אבל מה זה בדיוק עושה? מצייר את המסך מחדש כל פעם? (זה לא כותב ישירות לזיכרון?) ויש שם lock ו- Unlock.. מה הכוונה?

תודה למי שיסביר ועוד יותר תודה עם יתלווה להסבר קוד קצר:)

נ.ב. מישהו יודע עם STL (לא קשור לנושא אבל חפיף) לא תומך במצביעים?

ניסיתי לעשות משהו כזה :

list< &baseObject>

וזה עושה errors.

אני צריך שתהיה רשימה של מצביעים או בצורה נוחה יותר, reference, כי baseObject הוא abstract class

קישור לתוכן
שתף באתרים אחרים

לפי התיעוד, כדי שתוכל להשתמש ב- SDL_Flip אתה צריך להעביר ל- SDL_SetVideoMode גם flag של SDL_HWSURFACE.

dirty rectangles זה כשאתה עוקב בעצמך איזה חלקים של המסך (מלבנים) משתנים ומעדכן רק אותם. (בסנייק זה דווקא יכול לעבוד לא רע, כי רק שני מלבנים משתנים כל פעם)

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

לגבי STL - רשימה של מצביעים לאובייקט אמורה להיות

list<baseObject*>

קישור לתוכן
שתף באתרים אחרים

1) לא ניתן ליצור STL container שמכיל reference כיוון של-reference אין default constructor.

למיטב זכרוני זה נכון גם ל-sequence containers כמו vector ו-list וגם ל-associative containers כמו map.

2) לא כדאי ליצור STL container שמכיל reference כיוון שהסיכויים הם שמהר מאוד יהיה לך reference לאובייקט שכבר נהרס, או לחילופין memory leak. גם נסיון סביר להכניס בלולאה אובייקטים יתקל בהפתעות (כל הרפרנסים יהיו לאותו אובייקט).

דוגמא שלמעשה היא סוג של dangling reference:

list<Object&> l; // error here, but let's assume you could do that.

void create_new_object( int data_for_object )
{
Object obj( data_for_object);

l.push_back( obj ); // this causes trouble
}
// OOOPS! destructor for obj was called. now l contains an invalid reference!!

בקיצור תשתמש במצביעים.

קישור לתוכן
שתף באתרים אחרים

עוד הערה :

לא כדאי להשתמש במשתני reference.

מומלץ להשתמש ב-reference אך ורק כארגומנטים לפונקציות או כערכי החזרה (על מנת להימנע מהעתקות מיותרות של אובייקטים).

וגם במקרים כאלה, מומלץ להיזהר במה שעושים.

קישור לתוכן
שתף באתרים אחרים

עוד הערה :

לא כדאי להשתמש במשתני reference.

מומלץ להשתמש ב-reference אך ורק כארגומנטים לפונקציות או כערכי החזרה (על מנת להימנע מהעתקות מיותרות של אובייקטים).

וגם במקרים כאלה, מומלץ להיזהר במה שעושים.

אני לחלוטין לא מסכים עם זה. ואני לא היחיד, לדעתי רוב קהילת מתכנתי C++ לא יסכימו עם זה.

http://www.parashift.com/c++-faq-lite/references.html#faq-8.6.

באופן אישי אני משתמש דווקא במצביעים ל-output parameters ולא ברפרנסים. זאת בגלל שכאשר קוראים לפונקציה, ניתן לראות את כל פרמטרי הפלט מסומנים ב-&. אבל זה מוזרות שלי, ולא בהכרח הסכנון המומלץ או המקובל.

קישור לתוכן
שתף באתרים אחרים

זה לא סותר מה שאמרתי.

אמרתי שכדאי להימנע ממשתני reference.

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

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

הם גם יעילים כ-LVALUES החוזרים מפונקציות, לדוגמא ב-operator[], לכתיבת smart pointers, וכו'.

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

קישור לתוכן
שתף באתרים אחרים

תודה רבה לאלה שענו.

טוב אז אני אשתמש במערך של רפרנס ל- BaseObject.

בקשר ל- SDL, מישהו יכול לכתוב קוד קצר עם שימוש ב- doubleBuffer או dirty rectangle (רק אם אפשר למשל לצייר כל מיני צורות אבל לא ישירות למסך ואז בפונקציה של העדכון להעביר הכל ביחד.. כאילו כמו דאבל באפר).

קישור לתוכן
שתף באתרים אחרים

תודה רבה לאלה שענו.

טוב אז אני אשתמש במערך של רפרנס ל- BaseObject.

לא, אל תעשה את זה. תשתמש במערך של מצביעים.

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

קישור לתוכן
שתף באתרים אחרים

לפותח הדיון -

יכול להיות שהתרגלת ל- Java?

ב- C++ מערך של references לא מחזיק בשום מובן את האובייקטים שבו. מה שאומר שאתה מוכרח להחזיק אותם במקום אחר.

כלומר צריכים להיות לך משתנים "בחיים" עבור כל אחד מהאובייקטים האלה, או להחזיק מערך אחר שמחזיק אותם. אז מה הרווחת?

קישור לתוכן
שתף באתרים אחרים

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

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

עשיתי מערך של פוינטרים ופשוט שיניתי את כל הנקודות ל: <- וזה עובד מצויין.

תודה רבה.

דרך אגב, מישהו כאן שיודע SDL יכול לכתוב לי קוד דוגמא למה שביקשתי?

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...