Umgang mit großen Grafiken (8000x8000)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Umgang mit großen Grafiken (8000x8000)

    Hey
    Ich hab da ein Problem ^^
    möchte n Spiel machen mit ner "schön" geformten insel ...nun hab ich des Prob die ist 8000x8000 groß soll auch so bleiben ... aber nun is ende mit laden hängt sich auf gibts da irgendwelche Trixx ???
  • Vielleicht die Dateigröße kleiner machen. Als jpg mit niedriger Qualität oder nur 256 Farben. Ansonsten könntest du dass vll irgendwie mit Tiles lösen.
    Anderer Leuten Signaturen sind... anderer Leuten Signaturen!


  • genau des wollte ich mir ersparen :D
    aber wird wohl nichts anderes gehen ...

    Ich schau mal wegen den Fragen ...thxxx


    (noch en andere Sache ...aber gehört dazu ^^ )
    Wie schauts eigentlich aus wenn ich ein Objekt macht das nichts "macht" ausser da sein ... ist dads genaus so wie n Hintergrund oder "belastet" das mehr ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Capdsoft ()

  • Also ich weiß zwar nicht wie stark genau...aber es belastet nach meiner Erfahrung gewaltig...wenn man irgendwas anders als mit einzelnen objekten lösen kann, dann ist das immer viel besser. Der direkte Vergleich zwischen Objekte und einfach ein gutes altes...bzw mehrere Arrays hat mir das mal sehr eindrucksvoll gezeigt...weiß zwar nicht mehr genau wie viel schneller, aber es war gewaltig schneller. Eigentlich benutz ich jetzt überhaupt so wenig objekte wie irgend möglich...da hat man meiner meinung nach zu wenig überblick und kontrolle drüber^^
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Zerleg doch das Bild in kleinere Teile und leg sie in ein Array oder Grid oder Liste... und lässt step-mässig überprüfen, ob sich der Bildteil innerhalb der View befindet, und wenn ja, dann zeichnen lassen...
    "das war meine letzte flamewar PM an dich ."
  • 4-6 Teile sind wahrscheinlich zu wenig. Ich vermute mal, dass es durchaus Sinn macht, viele Einzelteile anzulegen, da momentan die gesamte Insel gezeichnet wird, obwohl nur ein kleines Stückchen sichtbar ist. Bin mir da aber nicht sicher. Also in meinen Augen sollten die Einzelteile maximal so groß sein, wie die gewünschte Bildschirmauflösung. Ich persönlich würde sie sogar noch kleiner machen, auch wenn's viel Arbeit ist.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • blubberblub schrieb:

    Zerleg doch das Bild in kleinere Teile und leg sie in ein Array oder Grid oder Liste... und lässt step-mässig überprüfen, ob sich der Bildteil innerhalb der View befindet, und wenn ja, dann zeichnen lassen...


    ok hört sich sinvollan mit dem zeichnen ..
    hab aber leider noch nie von ARRAY oder GRID oder Liste gehört ?!
    wie funzt n des ?

    vorallem laufen auf der insel verteilt tieren und co rum ... sört sich das nicht wenn das auf einmal nicht mehr geziechnet wird und der boden da weg ist ?
  • Naja wie der Name schon sagt, eine Liste enthält eine Liste von Werten.
    Kann man vielleicht so verdeutlichen:

    Liste
    Element mit index [0] = 4
    Index [1] = 123
    [2] = 0
    [3] = "hallo"
    [4] = 12.5

    Liste und Array sind eigentlich so ziemlich das gleiche, Array sind nur schon im Gamemaker als Typ integriert und Listen verwaltet man allesamt mit Funktionen.
    Ich empfehle Listen im Gamemaker, sie sind schneller und bieten mehr Komfort wie ich finde.

    Listen kannst du folgendermassen erstellen:

    GML-Quellcode

    1. meineListe = ds_list_create() //erstellt eine Liste und gibt die ID der Liste an die neu erstelle Variable "meineListe" zurück.


    Elemente kannst du mit der Funktion ds_list_add zur Liste hinzufügen.
    ds_list_add( Listen ID - etwa meineListe, Wert - zB 10)
    Wenn du den Wert dieses Elements wieder auslesen möchtest, musst du den Index des Elements kennen.
    Beispiel:

    GML-Quellcode

    1. ds_list_add(meineListe,12.345) //füge der Liste ein neues Element mit dem Wert 12.345 hinzu
    2. // Nun kommt ds_list_size(meineListe) zum Einsatz, diese Funktion gibt die Grösse der Liste zurück
    3. index = ds_list_size(meineListe) -1 //der index mit dem element, das wir grad erstellt haben, -1, da der zähler bei 0 anfängt, die grösse aber die anzahl der elemente wiedergibt: {0,1,2} hat eine grösse von 3
    4. wert = ds_list_find_value(meineListe,index) //gibt den Wert des Elements mit dem Index zurück, also 12.345


    Nun, für diesen Zweck würde ich grids verwenden, also "Netze", 2-dimensionale Felder.
    Wie Listen, nur eben 2d.

    GML-Quellcode

    1. ds_grid_create(höhe,breite)
    2. ds_grid_set(grid,x,y,wert)
    3. ds_grid_get(grid,x,y)


    Du hast einen background von 8000 * 8000...
    Sagen wir mal, wir machen daraus 1000 * 1000 grosse Unterteilungen.
    Das wären dann 8*8 Felder, die zusammen den grossen Background ergeben.
    Also erstellen wir ein grid

    GML-Quellcode

    1. gridBackground = ds_grid_create(8,8)

    Davor musst du allerdings den grossen Background zerlegen mit irgendeinem Bildbearbeitungsprogramm in 16 Bilder, die zusammengesetzt den grossen Background darstellen.

    nun weisen wir die Sprites(die alle einen Teil des Backgrounds darstellen) jeweils ihrem entsprechenenden Platz im grid zu:

    GML-Quellcode

    1. ds_grid_set(gridBackground,0,0, spr_BG00) // spr_BG00 ist nur ein Beispielname: spr= sprite, BG = Background und 00 steht für x=0 und y=0, damit du weist, an welcher Position das Bild sein sollte
    2. ds_grid_set(gridBackground,0,1, spr_BG01)
    3. ds_grid_set(gridBackground,0,2, spr_BG02)
    4. ....
    5. ds_grid_set(gridBackground,0,7, spr_BG07)
    6. ds_grid_set(gridBackground,1,0, spr_BG10)
    7. ....
    8. ds_grid_set(gridBackground,2,0, spr_BG20)
    9. ...
    10. ds_grid_set(gridBackground,7,0, spr_BG70)

    Verstehst? Sind halt 16 Zeilen Code ;)

    Dann machen wir noch 4 Variablen, die definieren wie hoch und breit die Teilsprites sind, und wie gross der gesamte Background ist:

    GML-Quellcode

    1. sprWidth = 1000
    2. sprHeight = 1000
    3. bgWidth = 8000
    4. bgHeight = 8000


    Übrigens, das ist keine genaue Anleitung, also um das zum funktionieren zu bringen, musst du wohl noch einiges selber machen.

    Dann müssen wir mal überprüfen, welche TeilSprites sich innerhalb der View befinden:

    GML-Quellcode

    1. for (ix = 0; ix < ds_grid_width(gridBackg...); ix += 1) //iterieren durch die horizontalen komponente des grids ...
    2. {
    3. for (iy = 0; iy < ds_grid_height(..); iy +=1) //und durch die vertikalen
    4. {
    5. //RectangleIntersecting ist ein neues Skript, das ich im nächsten Abschnitt beschreiben werde, es überprüft, ob 2 Rechtecke überlappen("kollidieren")
    6. if ( RectangleIntersecting(view_xview,view_yview,view_xview+view_wview,view_yview+view_hview,ix,iy,ix+sprWidth,iy+sprHeight)
    7. draw_sprite(ds_grid_get(...,ix,iy),0,ix*sprWidth,iy*sprHeight)
    8. }
    9. }


    Das Skript RectangleIntersecting hab ich aus irgendeinem alten Example geklaut:

    GML-Quellcode

    1. /*
    2. Returns whether there is a collision with two rectangles.
    3. Note that the rectangles cannot have a negative width or height.
    4. 0: x1 (of the first rectangle)
    5. 1: y1
    6. 2: x2
    7. 3: y2
    8. 4: x1 (of the second rectangle)
    9. 5: y1
    10. 6: x2
    11. 7: y2
    12. return whether there was a collision
    13. */
    14. w1=argument2-argument0
    15. h1=argument3-argument1
    16. w2=argument6-argument4
    17. h2=argument7-argument5
    18. if(w2<=0 or h2<=0 or w1<=0 or h1<=0)
    19. return 0
    20. w2+=argument4
    21. h2+=argument5
    22. w1+=argument0
    23. h1+=argument1
    24. return (w2<argument4 or w2>argument0) and (h2<argument5 or h2>argument1) and (w1<argument0 or w1>argument4) and (h1<argument1 or h1>argument5)
    Alles anzeigen


    Das ist eine Methode, eine wohl nicht ganz optimale Methode, sowas zu bewerkstelligen.
    "das war meine letzte flamewar PM an dich ."