Seite 2 von 2

Verfasst: 12.06.2006 23:42
von PMV
Hm, GrabSprite() ist ein sehr langsamer Befehl ... den selbst aktuelle
Rechner nur ungern innerhalb jedes Frames ausführen wollen. :wink:

GrabSprite() ist wirklich nur dafür geeignet um Screenshots zu realisieren.
Aber nicht, um ständig den Screen in Echtzeit zu sichern.
Hattest du nicht mal nen Thread wo das Thema vorkam, das sämtliche
Grafiken in jedem Frame neu gezeichnet werden sollten? :wink: ... das ist
sicher schneller als deine aktuelle Methode, wobei ich natürlich jetzt nicht
genau weis was du machst. Aber ich glaub ich kanns mir zusammen
reimen :D ... wobei ausfürbarer Code da sicher wertvoller wäre *g

MFG PMV

Verfasst: 13.06.2006 09:50
von Kurzer
Hallo PVM,
PMV hat geschrieben:Hm, GrabSprite() ist ein sehr langsamer Befehl ... den selbst aktuelle
Rechner nur ungern innerhalb jedes Frames ausführen wollen. :wink:

GrabSprite() ist wirklich nur dafür geeignet um Screenshots zu realisieren.
Aber nicht, um ständig den Screen in Echtzeit zu sichern.
Hattest du nicht mal nen Thread wo das Thema vorkam, das sämtliche
Grafiken in jedem Frame neu gezeichnet werden sollten? :wink: ... das ist
sicher schneller als deine aktuelle Methode, wobei ich natürlich jetzt nicht
genau weis was du machst. Aber ich glaub ich kanns mir zusammen
reimen :D ... wobei ausfürbarer Code da sicher wertvoller wäre *g
Nein, das Grabsprite() wird nur einmal ausgeführt, wenn der gesamte Aufbau des "Kartentisches" sich verändert hat. So z.B. nur zu beginn des Programms oder wenn man rechts auf Testbutton "SetScreen" klickt.

Danach besteht der Loop nur noch aus

1) Großes Hintergrundsprite zeichenen
2) Kleinen Mauszeiger zeichnen
3) Evtl. Animation zeichnen
4) FlipBuffers()

Mehr nicht. Und das ist schneller, als würde ich im Schritt 1) alle Karten als einzelne Sprites immer wieder neuzeichnen. Wenn alle Karten in jedem Frame neugezeichnet werden sollen, bricht die FPS auf einer alten ATI Rage 128 auf ca. 13-18 fps ein. Mit dem einzelnen "Rettungssprite" liegt sie bei 41 fps.

Ich hoffe, ich konnte das einigermaßen erklären. :)

Der gesamte Sourcecode und alle Daten sind übrigens im ersten Beitrag verlinked (ca. 200KB zip Datei). ;) Das ist jetzt aber bereits der aktuelle, funktionierende Code.

Gruß Markus

PS: Trotzdem würde mich mal interessieren warum der Mauszeiger so stockt bzw. sich gummiartig in Zeitlupe bewegt, wenn das große Sprite in den Videospeicher geGrabbed() wird statt ins RAM.

Verfasst: 13.06.2006 11:08
von Kaeru Gaman
> wenn das große Sprite in den Videospeicher geGrabbed() wird statt ins RAM.


den hinweis hättest du auch schon vorgestern geben können.

if you have a question, back it up with information!

Verfasst: 13.06.2006 12:50
von Kurzer
Kaeru Gaman hat geschrieben:> wenn das große Sprite in den Videospeicher geGrabbed() wird statt ins RAM.
den hinweis hättest du auch schon vorgestern geben können.
Ich habe das doch erst gestern abend rausgefunden, daß das definitiv daran liegt.
Und in meinem Beitrag von gestern (12 Jun 2006 23:14:06) habe ich das auch anhand des Hilfe-Ausschnitts "GrabSprite()" erklärt (guck mal auf Seite 1 :) ).

Meine erste Vermutung, daß es am Verstecken des Mousepointers liegt war falsch.

Gruß Markus

Verfasst: 13.06.2006 16:08
von PMV
So, ich hab mir das jetzt mal angeschaut ... also deinen Quellcode, hatte
garnicht mit bekommen, das du den gepostet hattest ^_^ ...

Also ich hab keinerlei Probleme feststellen können, ob
#PB_Sprite_Memory gesetzt ist oder nicht ... hat bei mir keine Auswirkung
auf die Maus. Lediglich an der FPS ändert sich was.

Wenn sich die Grafik im RAM befindet (also #PB_Sprite_Memory gesetzt
ist) wird dsa ganze etwa zu 33% langsamer, ich hab etwas über 2000 FPS.
Befindet sich das Sprite aber im Videospeicher sinds 3000 FPS.

Mit eingeschalteter Animation (und dem ganzen Rest) sinds 114 gegen 250
FPS, da wird der Unterschied also noch deutlicher. Vermutlich ist deine
Grafikkarte einfach nur überfordert :wink: ...

Oder aber, mir ist aufgefallen, du grabst immer ein Sprite aber da steht
kein FreeSprite() ... vielleicht läuft der Speicher der Grafikkarte einfach
nur über? Oder wird durch eine feste Nummer immer das neue Sprite
über das vorheriege gelegt und so ist ein FreeSprite() nicht mehr nötig?

MFG PMV

Verfasst: 15.06.2006 12:52
von Kurzer
Hallo PVM,

erstmal danke fürs testen.
PMV hat geschrieben:...Oder aber, mir ist aufgefallen, du grabst immer ein Sprite aber da steht
kein FreeSprite() ... vielleicht läuft der Speicher der Grafikkarte einfach
nur über? Oder wird durch eine feste Nummer immer das neue Sprite
über das vorheriege gelegt und so ist ein FreeSprite() nicht mehr nötig?
DAS ist ja mal ne sehr gute Frage. :allright:
Bisher ging ich davon aus, daß bei einer festen Spritenummer vor einem Grabsprite() dieses nicht erst freigegeben werden muß.

Aber ich arbeite noch nicht lange genug mit PB, um das beantworten zu können. Wäre also prima, wenn das ein "Interna-freak" sicher beantworten könnte.

Gruß Markus