View flimmert beim Scrollen

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

  • View flimmert beim Scrollen

    Eins vorweg: Ich habe die SuFu benutzt und keine brauchbare Lösung gefunden, es gibt auch ein ungelöstes Thema dazu, aber das wäre Necroposting extreme (August 2007)...

    Ich hab ein kleines Problem mit der Grafik-Engine des GM, vielleicht kennen es einige, sobald der Room größer ist als der View flimmert das Bild wie verrückt beim Scrollen... das geht mir ziemlich auf die Nerven, weil es auf dauer derbst ermüdend für die Augen wird, vor allem wenn man (wie ichs mir eigentlich bei meinem Spiel so vorstelle) durch recht große und umfangreiche Rooms gehen wird... im Anhang eine Beispiel-exe, sie soll nur das Flimmern demonstrieren, die Grafik ist noch alles andere als final und ja ich weiß, dass man auf Häusern laufen kann und aus dem Room rauslaufen kann... Hier bitte ich nur um etwas Hilfe bei der Abschaffung bzw. Verminderung des flimmerns.

    Hier die Datei: ultrashare.de/f/3973/zombie_graphics_test_0.1.exe.html

    In der Version wird der View durch ein Stepevent gesteuert:

    GML-Quellcode

    1. view_xview=round(x)-view_wview/2;
    2. view_yview=round(y)-view_hview/2;

    Es gibt aber keinen Unterschied dazu wenn man den View in den Eistellungen des Rooms auf den Held fixiert, was das Flimmern angeht.

    Falls es wichtig ist - mein Laufscript:

    GML-Quellcode

    1. if (keyboard_check(ord('A'))) {image_speed=1/3
    2. if (keyboard_check(ord('W')))
    3. motion_set(135,5) else
    4. if (keyboard_check(ord('S')))
    5. motion_set(235,5) else
    6. motion_set(180,5)};
    7. if (keyboard_check(ord('D'))) {image_speed=1/3
    8. if (keyboard_check(ord('W')))
    9. motion_set(45,5) else
    10. if (keyboard_check(ord('S')))
    11. motion_set(315,5) else
    12. motion_set(0,5)};
    13. if (keyboard_check(ord('W'))) {image_speed=1/3
    14. if (keyboard_check(ord('A')))
    15. motion_set(135,5) else
    16. if (keyboard_check(ord('D')))
    17. motion_set(45,5) else
    18. motion_set(90,5)};
    19. if (keyboard_check(ord('S'))) {image_speed=1/3
    20. if (keyboard_check(ord('A')))
    21. motion_set(235,5) else
    22. if (keyboard_check(ord('D')))
    23. motion_set(315,5) else
    24. motion_set(270,5)};
    Alles anzeigen


    Und der Script durch den der Held immer zum Mauszeiger schaut (der ist nicht wirklich kompliziert, war aber für mich ne Heidenarbeit ihn zu schreiben und zu vervollständigen, also wenn ihn schon jemand copy&pasten für sein eigenes Projekt will dann bitte PM an mich):

    GML-Quellcode

    1. global.grad=0;
    2. if mouse_x>x {if mouse_y<y
    3. global.grad =radtodeg(arctan((y-mouse_y)/(mouse_x-x))) //oben rechts
    4. else if mouse_y>y
    5. global.grad =360-radtodeg(arctan((mouse_y-y)/(mouse_x-x)))} //unten rechts
    6. else if mouse_x<x {if mouse_y>y
    7. global.grad =180+radtodeg(arctan((mouse_y-y)/(x-mouse_x))) // unten links
    8. else if mouse_y<y
    9. global.grad =180-radtodeg(arctan((y-mouse_y)/(x-mouse_x)))}; // oben links
    10. if mouse_x=x {if mouse_y>y global.grad = 90 else grad = 270} else
    11. if mouse_y=y {if mouse_x>x global.grad = 0 else grad = 180};
    12. image_angle = global.grad;
    Alles anzeigen


    Der Roomspeed ist 30, Abmessungen sind 1280x960, die Abmessungen vom View sind 800x600.

    Bin für jede Hilfe dankbar.

    Gruß,
    Logan
  • Eine gmk-Datei wäre besser gewesen. Dann hätte man das gleich mal unter die Lupe nehmen können. Ursprünglich dachte ich, dass du von Tearing sprichst, was dadurch entsteht, dass die Roomspeed (FPS) nicht der Bildwiederholfrequenz (Hz-Zahl des Monitors) entspricht. Aber nach einem Testlauf vermute ich, du redest eher von dem Flimmern, was z.B. von diesen weißen Strichen der Bodentextur ausgeht. Eventuell hilft es, wenn du in den Global Game Settings mal das Häkchen bei "Interpolate colors between pixels" setzt (gleich der erste Reiter "Graphics"). Ansonsten kannst du ja mal versuchen, die Roomspeed deiner Hz-Zahl anzugleichen. Diese zwei Dinge würden mir jetzt spontan einfallen. Ich hoffe, es hilft.

    Edit: Noch ein kleiner Tipp - wenn du mehr grafische Details und mehr Farbvariation reinbringst, dürfte das Problem weniger auffallen. Der Kontrast ist an den besagten Stellen einfach zu stark.
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Geht dein unglaublich langes Script nicht auch einfach so?

    GML-Quellcode

    1. image_angle = point_direction(x,y,mouse_x,mouse_y);

    Es wäre auch einfacher gewesen, wenn du abs() benutzt hättest - dann hättest du direkt die Differenzen gehabt und hättest nicht überprüfen müssen, welcher Wert der größere ist.

    Bezüglich des Flimmerns verdächtige ich auch die Vsync. Schalte sie einfach mal in den Game Settings ein und lass vom GM auch dann evtl. die Hertzzahl bestimmen.
  • MewX schrieb:

    Geht dein unglaublich langes Script nicht auch einfach so?


    GML-Quellcode

    1. image_angle = point_direction(x,y,mouse_x,mouse_y);

    Wenn ich den Code richtig verstanden habe(von den Kommentaren her) würde ich sagen, dass es den Sprite nur die 4 Himmelrichungen gucken lässt.
    Also nicht im Winkel dreht, sondern immer nur zur Maus, wenn die in der Richung einer der 4 Hr. ist.
    Kann mich auch vertan haben, will jetzt auch keinen Gml Experten anzweifeln :whistling:
  • HIM666 schrieb:

    schonmal versucht den view nicht im stepevent sondern im draw_event zu steuern?

    Die View im Draw-Event zu steuern dürfte äußerst interessante Ergebnisse haben.
    Wenn mich nicht alles täuscht, werden zuerst Backgrounds etc. gezeichnet und dann Tiles/Instanzen entsprechend ihrer Depth.
    Wenn du in diesem Vorgang mittendrin die View änderst, verschiebst du entweder die Positionen aller nachfolgenden Instanzen im Bild oder, wenn der GM das nicht sofort umsetzt, änderst du die View erst für den nächsten Step. Dann würde die View immer einen Step hinterherhinken.

    Kann natürlich sein, dass das auch anders abläuft, aber das bezweifle ich doch stark.

    Prustel schrieb:

    Wenn ich den Code richtig verstanden habe(von den Kommentaren her) würde ich sagen, dass es den Sprite nur die 4 Himmelrichungen gucken lässt.
    Also nicht im Winkel dreht, sondern immer nur zur Maus, wenn die in der Richung einer der 4 Hr. ist.
    Kann mich auch vertan haben, will jetzt auch keinen Gml Experten anzweifeln :whistling:

    Du hast dich vertan. Zwar gibt es die von dir beschriebenen Abfragen am Ende des Scripts, allerdings sind die nur für die Fälle, wenn die x- oder y-Werte identisch sind.
    Dann würde er nämlich in seinen Berechnungen durch 0 teilen, deshalb muss er dafür eine Fallunterscheidung machen.
  • MewX schrieb:

    HIM666 schrieb:

    schonmal versucht den view nicht im stepevent sondern im draw_event zu steuern?

    Die View im Draw-Event zu steuern dürfte äußerst interessante Ergebnisse haben.


    hmm meinst du? .. aber da sonst alles was im step-event ruckelt oder hinterherhängt im draw-event nichtmehr hinterher hängt, hab ich haltg
    gedacht, dass es damit vielleicht auch zu beheben wäre.
  • Normalerweise sollte man auch das View im StepEvent verschieben könne, solag man es am Anfang macht. Nach meiner Erfahung, würde das aber nicht das Problem lösen, denn es verhindert lediglich, dass das View hinterherhinkt - das heißt, dass der Spieler, wenn er eigetnlcih immer mittig sein sollte, oft seinen 'Mittelpukt' um speed Pixel verläst. Das flimmern kommt wahrscheinlcih dadurch zustande, dass es um Teil Pixel - also ein Bruch - verschoben werden soll, was dazu führt, das es in einem Step 1 Pixel weiter vorne und im nächsten step ein pixel weiter hinten ist. In diesem Falle müssten man ausprobieren, wie man das verhindern kann. Mit einer der folgenden Methoden sollte es gehen (sie wurden zwar schon gennant, aber ich wollte das noch mal verstärken) :
    • Den Code durch view_xview=round(x)-round(view_wview/2);
      view_yview=round(y)-round(view_hview/2); ersetzen
    • Ein häckchen bei "Interpolate colors between pixels" setzten
    Ich persönlich glaube nicht, dass es an irgendwelchen Herzzehlen o.ä. liegt, lasse mich aber auch eine besseren belehren.

    Viele Grüße, maxda
  • Nein, die View niemals im StepEvent verschieben, nur im EndStep-Event.

    Und die Vershciebung sollte konstant sein, ja. Eine Verschiebung von 2.5 würde in der Realität ja 3 2 3 2 3 2 3 2 3 2 etc. bedeuten, das sieht komisch aus.
    Bei keinem Vsync wird man aber besonders bei vertikalen Verschiebungen einen unschönen Effekt haben.
  • Benutzer online 1

    1 Besucher