Von GDI nach Prospeed ...Logik-Problem!

  • Moin!

    Ich habe ein 1800 Zeilen Script welches ich erst auf GDI+ aufgebaut habe; dieses war aber zu langsam. Dann habe ich es auf Quickdraw umgebaut und es lief schon besser, aber mir fehlen einfach noch zu viele Funktionen. Jetzt habe ich mir die Prospeed30 mit diesem Mega-Demo runtergeladen; ich musste es erst auf die aktuelle AutoIt Version anpassen weil es nich lief - Sie schaut aber gut aus. Nur jetzt kommt mein Problem, nähmlich das die ersten beiden 'Engines' auf FPS-Programmierung (ich weiß net wie ich´s nennen soll) basieren. Also muß man jeden Frame 'von der Pike auf an' neu aufbauen; diese Art der Programmierung bin ich ja auch gewohnt.
    Nur jetzt mit der Prospeed ist alles anders, sie basiert ja auf 'Grafik-Objekte' also müssen diese erstellt und später ausgelöscht werden. Is ja im Prinzip 'OOP'. Aber wie passe ich jetzt ein Funktionierendes Script auf OOP an? Im Main-Loop hatte ich folgenden Aufbau:

    [autoit]


    Func Loop()
    while 1
    ; Grund-Grafiken Anzeigen
    ShowGfx()
    ...
    ; Grafik-Effekte
    GfxEffektKontrolle()
    ...
    ; Steuerungskontrolle abfragen
    SteuerungsKontrolle()
    ...
    sleep(2)
    wend
    endfunc

    [/autoit]


    In der Funktion 'ShowGfx()' werden eben alle benötigten Grafiken Aufgebaut, und die 'GfxEffektKontrolle()' steuert zur Laufzeit diverse Effekte auf dem Bildschirm welche (teilweise) von der 'SteuerungsKontrolle()' aufgerufen werden. Die erste Funktion habe ich jetzt quasi vor dem 'Loop()' gesetzt (natürlich komplett geändert), aber die zweite Funktion macht mir echt zu schaffen... Ich kriegs nich gebacken, ohne ständig ALLE Grafik-Effekte zu erstellen und auszulöschen (weil einer nicht gebraucht wird), dieses vernünftig zusammen zu Basteln... Ich habe da ein kleines Logik-Problemchen ?(
    Ich denke das ich auch die Funktion 'GfxEffektKontrolle()' vor dem Loop aufrufen muss, und diese alle erstellen lassen, und dann bei Bedarf Anzeigen lassen... nur wie??

    Ich weiß das einige hier schon Erfahrung mit der Prospeed haben, wie seit Ihr das angegangen?? Ich meine jetzt habt Ihr komplett eure Scripte (im vorraus) schon auf OOP ausgelegt; oder wie kann ich eben ein Script welches die 'Klassische' GDI Technik verwendet auf die Objekt Technik umbauen???

    Ich weiß es ließt sich etwas Konfus :D aber ich binn momentan mehr mit Grübeln beschäftigt als ich Programmieren kann; 30min Denken 2 Zeilen schreiben 8| Ich habe mir (natürlich) die Doku reingezogen, welche ja glücklicherweise sogar auf Deutsch ist, und die 2000 Zeilen Demo habe ich auch durchforstet, in der UDF konnt ich auch noch 2 fehlende Funktionen einbauen (welche auch Funzen); ich habe mir sogar ein altes Script von 'Greek' aus nem anderen Forum angeschaut und angepasst und verändert, und und und... Alles krieg ich hin, ich kann dinge erstellen und bewegen und auslöschen; nur nicht in meinem Script!! Weil ich einen grundlegenden anderen Programmierstil verwendet habe. Ich bin jetzt schon 4 Tage am umbauen, und es läuft immer noch net. So langsam verzweifel ich daran...

    Weiß jemand ein (gutes) Tutorial von Prospeed und AU3; ich habe nähmlich keins gefunden?!?!?
    Oder kann mir jemand so ein paar Denkanstösse (in die richte richtung) auf dem Weg geben...


    Verzweifelte Grüsse von Techmix!!

    P.S:
    Diese Objektprogammierung ist daran schuld das ich kein C++ sondern nur C kann, ich hab´s nie zu 100% verstanden ;(

  • Hi,
    Ich verwende einige der Prospeedfunktionen, von OOP habe ich da aber nicht viel gemerkt^^
    Prospeed lehnt sich m.E. sehr stark an GDI an, die Funktionen haben teilweise identische Parameter. was wohl auch daran liegt, dass der Autor Frank Abbing viele API-Funktionen verwendet.
    Bei einigen der Funktionen, die nicht durch API-Funktionen abgedeckt werden (Bildbearbeitung), sind allerdings "schnelle" Assemblerroutinen verwendet.

    Leider hast du kein "typisches Beispiel" angehängt, welches dein(e) Problem(e) mit der Geschwindigkeit bei deinem Script verdeutlicht. Ich vermute allerdings beim "zwischen den Zeilen lesen" dass das eigentliche Programm nicht ganz unschuldig an der "Langsamkeit" ist. Manchmal ist Autoit einfach am Limit angelangt, und da helfen dann auch die allerschnellsten Funktionen nicht mehr weiter.
    Mach doch mal Nägel mit Köpfen und poste zeitkritische Ausschnitte aus deinem Script.

  • Hi Andy!
    Nun ja, mit GDI+ kam ich mit 80% Cpu Last auf gradmal 6-8 Frames; mit der Quickdraw waren es schon 20 Frames bei etwa 20% Cpu in kritischen Passagen. Deswegen hatt ich mir auch immer schnellere Grafik-Engines gesucht und auch eingebaut, um die Rechnegeschwindigkeit von AutoIt einigermaßen zu Kompensieren. Deswegen kam ich auf Prospeed welches ja anscheinend auf Assembler basiert, oder wie du sagst eben teilweise. Und ich erhoff mir dadurch einen Performancevorteil um etwas mehr 'Leichtigkeit' in das Programm und in den ganzen Funktionssalat zu bekommen. Ja und ein Beispiel ist schwierig, weil halt momentan das ganze Programm nicht läuft. Aber ich mach gleich mal ne RAR Datei und lad sie hoch; darin kann ich ja die 'alte' Quickdraw Version mit beifügen und eben das Aktuelle Script (sind dann aber schon knapp 13MB) ist aber teilweise nicht ganz sauber. Und veröffentlichen will ich es eigentlich erst wenn es 'Vorzeige' bereit ist, ab Beta Stadium (ich da so mein System)...
    Es kann sein das ich mich mit OOP falsch ausgedrückt habe, ich meinte im allgemeinen das ja 'einmalig' Grafik-Objekte erstellt und verwendet werden, statt sie ständig neu mit AU3 berechnen zu müssen... :whistling: Ich verwende auch (im gegensatz zu früher) saubere Techniken, wie z.B. BugFix´s Enum-Globals. Und ich Programmiere ja auf nem 600Mhz Rechner und das hat im Endeffekt aber einen riesen Vorteil, und zwar bin ich gezwungen auf die Programm-Performance zu achten; und läuft es auf meinem Schrotti gut, rennt es auf meinem Familien Rechner :D

    Grüsse!

  • Sooo, hier der LINK (entfernt).

    Wenn du den 'SessionLoader' verwendest hast du auch gleich meine Sicht der Dinge, hab da noch einige schwere Geburten vor mir :D

    Tab 1 - Neues, nicht Funktionierendes Script

    • Warum stürzt es direkt nach dem ersten Zeichnen ab, und warum werden die Systempunkte schwarz und nicht Farbig dargestellt?? Hat Prospeed ein anderes RGB Format als '0xFFFFFF' (ich seh grad hab in Zeile 260(+2, +2) noch den RGB Wert aus der Quickdraw gehabt '0xFFFFFFFF'...SchlagGegenDenKopf)
    • In Zeile 266 ist das richtig oder falsch??? Wird jetzt ja immer wieder neu aufgebaut/erstellt...
    • Oder Zeile 1326 die 'Func _SetText' kann ich jetzt ja erstellen und auslöschen, oder?!?
    • Und dann das große Problem in der 'Func MenuEngine' ab Zeile 851. Da wird ein In-Game Menü erstellt und bei der Anzeige ab Zeile 1057 weiß ich nicht weiter, ich habe da die Quickdraw sachen ausgeblendet weil mich die fehlermeldungen Nervten (die Quickdraw UDF ist nimmer eingebunden), und wenn es dich interessiert wird diese Func von Tab 8 gesteuert. Ich muß ja eigentlich die 'Grafik-Objekte' nur einmal erstellen, und nicht wie momentan bei jedem Durchlauf...
    • In den 3 'Editor-Modis' (Z. 230-355) sollen jetzt die 'Grafik-Objekte' erstellt werden, vorher wurden sie in der 'Func GrafikEngine' abgearbeitet. Ist die Funktion 'Func Mode_GalaxyEditor' (1.ter Editor-Modi) so Korrekt, oder doch anders
    • Die 'Func _GalaxyCursor' (Z. 1198 ) und die 'Func _PlanetMarker' (Z. 1231) werden jetzt in der 'Func GfxEffektKontrolle' (Z. 1127) aufgerufen. Vorher waren sie Bestandteil der 'Func GrafikEngine'. Die Zeilen 731-745 sollten eigentlich garnet mehr Existieren, wird auch noch so eine Func im Stile von 'GalaxyCursor'; kam ich nur noch nicht zu. Habe ich diese so richtig angelegt, also im Gegensatz zu den Funktionen in Tab 2 (Z. 693 - 697 und 734 - 746)

    Tab 2 - Funktionierende Quickdraw Programm-Refferenz
    So soll es eigentlich aussehen...

    Tab 4 - Das Spiel von 'Greek'
    Etwas angepasst von mir, und den Source leserlicher Gestaltet. Nutze ich als Beispiel. Gefunden : keine Ahnung wo, ich glaub bei dem Download der Prospeed.

    Tab 5 - Ein Beispiel von 'Faweyr'
    Auch etwas angepasst von mir, und den Source leserlicher Gestaltet. Nutze ich auch als Beispiel.

    Tab 6 - Prospeed30 UDF
    Musste ich auch etwas anpassen, lief nicht mit der aktuellen Au3 Version. Habe den Source für meine Zwecke leserlicher gestaltet.

    • Habe die 'Func GetWindowHDC' (Z. 70) geändert, ist jetzt einfacher zu verwenden.
    • Dadurch das die Prospeed UDF nicht sofort mit der Aktuellen Au3 Version lafen wollte, muss man jetzt die 'Func Close_DLL' manuell am ende des Programmes aufrufen.
    • Habe ich die 'Func ExistSprite' (Z. 626) richtig erstellt??

    Tab 7 - Ist auch sehr Interessant
    Dieses Script steuert ein 'Externes' Programm welches mir ziemlich Coole Grafiken erstellen kann, welche ich auch gerne als Sprites verwenden möchte (Editor\data\planet\Neu\PlanetTurn.jpg). Dem Programm liegt auch der C++ Source bei ;)und zwar in

    Tab 10 - Das ist der Source des 'Externen' Programmes

    • Du Andy (my King of Assembler) kann man iwie die Funktion 'void orthographic' (Z. 1043) in Assembler konvertieren, mit der Veränderung das es eine vorhandene (oder bereits geladene) Grafik statt der Funktion 'planet0(x1,y1,z1)' (Z. 1065) zur Berechnung benutzt?!? Bzw. würde es einen Geschwindigkeitsvorteil gegenüber der C Funktion darstellen? (ja, ich kann C :D (ein wenig))


    Ich Denke (und hoffe) das war erstmal alles :D Sorry, aber du hattest nachgefragt... Ich hoff du kannst mir etwas helfen

    Hoffnungsvolle Grüsse von Techmix!

    2 Mal editiert, zuletzt von Techmix (5. Oktober 2010 um 09:43)

  • heyho,

    Zitat

    Warum stürzt es direkt nach dem ersten Zeichnen ab

    die Prospeedfunktion ExistSprite($_GalaxyCursorSprite) stürzt ab, da $_GalaxyCursorSprite zu diesem Zeitpunkt (Sprung in die Funktion _GalaxyCursor() ) noch nicht initialisiert ist bzw es noch kein Sprite(_GalaxyCursorSprite,.....) gegeben hatte! Ich habe mir diesen Teil in der prospeed.dll angeschaut, dort wird nur ein bereits existierendes Sprite abgefragt!

    Zitat

    Und dann das große Problem in der 'Func MenuEngine' ab Zeile 851

    so wie ich das sehe, identisches Problem, es wird ein

    [autoit]

    DeleteSprite($_MenuBackground)
    FreeImage($_MenuImage)
    $_MenuImage = CreateImage(800, 800)

    [/autoit]

    FreeImage($_MenuImage) gemacht, bevor $_MenuImage einen Wert hat!

    Habe jetzt nur mal drübergeschaut und per trace die offensichtlichen "Fehler" gefunden und auskommentiert, dann läuft das Script bis man auf einen Planeten klickt. Daraufhin erscheint ein ziemlich großer (1/2 Bildschirm), schwarz gefüllter Kreis(Ellipse) und ein transparentes "Minimenü" mit unleserlicher Schrift^^

    Ich bleib am Ball......
    Der große Vorteil von Prospeed ist, das parallel mehrere Threads erstellt und abgearbeitet werden. Aber ich finde die Performance jetzt schon nicht schlecht! Wenn ich weiter durchgestiegen bin, geht da sicherlich noch was...

    Zitat

    kann man iwie die Funktion 'void orthographic' (Z. 1043) in Assembler konvertieren

    sicher geht das^^

    Zitat

    abe ich die 'Func ExistSprite' (Z. 626) richtig erstellt??

    yepp, allerdings wird dort nur auf bereits erstellte Sprites getestet. Prospeed erstellt den Handle des Sprites und lässt ihn im Speicher. Mit ExistSprite($handle) MUSS also immer ein gültiger Handle getestet werden!

    Ich kämfe mich mal weiter durch^^

  • Ich hab so ein Gück das du dir das anguckst!!!!

    Dicken Dank dafür, schon mal im vorraus! Ich Arbeite jetzt schon nen ganzen Monat daran rum, und es wird ja auch immer besser. Und durch die Prospeed erhoff ich mir das ganze wieder ordentlich Grafisch auzupeppen sowie um die Performance eben schön oben halten zu können. Nur hab da eben so ein paar 'Denkfehler' mit der Prospeed, weil mir eben einiges noch nicht klar war bzw. ist ;)

    Muss jetzt erstmal mit meiner Familie was machen gehen, ist Familien-Wochenende :)

    Grüsse!

  • Zitat

    Muss jetzt erstmal mit meiner Familie was machen gehen, ist Familien-Wochenende

    So siehts aus! Man muss Prioritäten setzen! Wie war der Lieblingsspruch einer meiner ehemaligen Profs zum Thema Lernen (ich berücksichtige das immer beim Programmieren^^)?
    "Was macht ihr nachts?"

  • Hallöle,

    ich habe jetzt die Funktion:

    [autoit]

    Func ExistSprite($S_handle)
    If $S_handle <> "" then
    $Sprite_ID = DllCall($S_DLL, "long", "ExistSprite", "long", $S_handle)
    Return $Sprite_ID[0]
    Else
    Return -1
    EndIf
    EndFunc

    [/autoit]


    etwas geändert und habe keinen Absturz mehr :thumbup: Dank deinem Hinweis!

    Ich pule später noch etwas im Programm rum, und werd mal den (eher die) Teufel suchen ^^

    Zitat

    "Was macht ihr nachts?"

    :rofl: Wie geil, kenn ich auch!

    Grüsse!

    [Edit]
    Läuft eigentlich der Tab 2 fehlerfrei bei dir, und welches System benutzt du, und welche Auflösung :) Bei mir XP und 1024x768, würd mich Intessieren ob es auch auf anderen Systemen läuft; bei meinem Familienrecher mit Win7x64 nähmlich nicht (weil nicht unterstützte GraKa), und bei anderen Systemen (mit Geforce) hatte ich komischerweise häufig keine Mauspositionenrückgabe ?( . War auch ein Grund von Quickdraw zu Prospeed zu wechseln.

    4 Mal editiert, zuletzt von Techmix (4. Oktober 2010 um 13:10)

  • XP32 und mehrere Auflösungen bis zu 1680x1050, hat bei allen gut geklappt beim Tab2, bei Tab 1 ist die Galaxie aber kein Fullscreen!

  • Da mich (natürlich) die Problematik nicht losließ, habe ich noch ein wenig rumgebastelt. Ich habe alle deine Ratschläge befolgt und es sieht auch schon besser aus; ist zwar noch kein Vergleich zur Quickdraw Version aber schonmal ein Anfang :D Hier , noch ein Update meines Projektes (sry. hatte den falschen Link hochgeladen... jetzt isses recht so, 25MB sind´s schon...)

    Den SessionLoader verwenden, und schon geht´s los...

    Tab1:

    • Z.216 - Hier versuche ich einen Background zu erstellen, scheint gar net so einfach zu sein... Ich habe es zwar jetzt geschafft das Hintergrundbild zu 'Re-Sizen' so das es jetzt Fullscreen ist, aber es wird vor allen anderen Sprites erstellt so das man diese nicht sieht Dazu musste ich die 'Func Background' aus Tab4 Z.1270 anpassen ?( Wieso funzt das nicht richtig, hab da erst so´n Problem mit nem Pointer der keinen Wert inne hat und jetzt werden andere Sprites nicht angezeigt...
    • Z.216 - Da hab ich noch ne Frage, warum wird das 'Background' Sprite nicht automatisch Aktuallisiert?
    • Z.264 - Es werden hier die verschiedenen Systeme sichtbar gemacht, wird auch noch als Sprite geändert, nur wie kann ich diese Sprites transparent darstellen? Bei der Quickdraw war es so einfach :D
    • Z.999 - Hier erstelle und lösche ich den Gallaxy-Cursor, Er ist sogar animiert! Und als ich noch mit nem Image statt mit dem Background gearbeitet habe, stand die 'Func _SetText' Z.1218 solange still bis ich auf dem Hintergrund mit der Maus geklickt habe; wieso das denn?? Der Text (aus _SetText) wird ja ständig Aktuallisiert also auch neu gezeichnet, nur sieht man das nicht...
    • Z.682 - Ich habe jetzt erstmal das Menü ausgeblendet, weil ich mom die 'GfxEffektKontrolle' Z.963 aufarbeite...
    • Z.1218 - 'Func _SetText' Ist diese richtig erstellt?? Sie zeigt zwar an aber wird Optisch nicht ausgelöscht (oder liegt das an Punkt 2)

    Tab4:

    • Z.1270 - 'Func Background' Diese Funktion habe ich gestern Abend versucht zum laufen zu Bewegen... mit teilweisen Erfolg. Das große Problem ist das '$C_createBMP' trotz Ausführung ohne Wert blieb!! Also wurde nichts Angezeigt... blöd! Habe ich bestimmt X.mal geändert und wird ja endlich auch 'Re-Sized' angezeigt, aber iwie nicht richtig...
    • Kann es sein das die Prospeed entweder nicht sauber in AU3 konvertiert wurde oder ich bilde mir das ein??? Warum muss ich Funktionen anpassen damit sie laufen, obwohl sie ja schon vorrätig sind?!?

    Tab7:
    Andy: Hier gibt es zwar keine Problematik, aber vielleicht kannst du mir ja trotzdem helfen... Dieser Ortographic-Effekt lässt mich nimmer los :rolleyes: Wenn du vielleicht mal Langeweile hasst, dann....

    ?? Und warum startet AutoIt3 manchmal zweimal statt nur eben einmal???


    Wie gesagt es läuft zwar, ist aber noch lange kein Vergleich zur Quickdraw Refferenez. Vielleicht magst es dir ja nochmal angucken und mir sagen was ich besser oder anders machen könnte :D Oder hat jemand eine (richtig) lauffähige Version der 'prospeed30.au3' für mich???

    Grüsse von Techmix!

    [Edit]

    Zitat

    und per trace die offensichtlichen "Fehler" gefunden

    Diese Trace Funktion kenn ich gar net, und hab´s mal auf meinem Programm angewendet ...hat mir die ganze Formatierung zerschossen... Wie gehe ich mit dieser Funktion (richtig) um?? Hab´s auch noch auf einem anderen Script angewendet, und nachdem ich es beendet habe zeigte mir SciTe iwas in der Konsole an. Und zwar sooo lange das ich den Wrapper Prozess beenden musste. Aber eine Auswertung oder so erhielt ich nicht...

    [Edit2]
    Sorry, der Downloadlink war nicht der richtige ...hab ich jetzt geändert.

    2 Mal editiert, zuletzt von Techmix (5. Oktober 2010 um 12:02)