Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   14.07.17 19:52

Hallo Leute!

Ich bin neu hier. Habe mich ein wenig mit xProfan x3 beschäftigt und ein kleines oGL-Demo geschrieben, was eigentlich eine Diashow werden soll(te).
Das Programm läuft und sieht schon recht professionell aus. Ein Demo wie aus den 80'ern: Scrollbalken, Sprites und Bild im Hintergrund in einer 3D-Welt mit Musikuntermahlung. Alles Top und flüssig. Jetzt stieß ich aber an meine Grenzen - ein Problem das ich nicht lösen kann.

Lade ich nun Bilder (jpg's) nach, bleiben sämtliche Animationen stehen. Die Hintergrundmusik läuft weiter. Das Programm wird dann erst fortgesetzt wenn das Laden der Bilder komplett abgeschlossen ist.

Zum Laden der Bilder habe ich folgenden Code benutzt...

   'Bildverzeichnis Initialisieren
   path$ = $ProgDir + "Bilder\" + folder$ + "\"
   ChDir path$
   path$ = path$ + "*.jpg"
   bilder$ = FindFirst$(path$)
   AddFiles bilder$
   'sucht nach Bilder und weist Diese der Variable Bilder$ zu
   WhileNot %IOResult
     bilder$ = FindNext$()
     AddFiles bilder$
     Inc cnt%
   EndWhile
 


... ab hier wird es dann problematisch. Die Zuordnung der JPG's in das TexturArray dauer ewig.

Wie kann ich den Code so ändern das die Bilder im Hintergrund, bzw zur Programmlaufzeit nachgeladen werden ohne das es hakelt?

   'ordnet die geladenen Bilder dem TexturArray zu
   WhileNot anz% = cnt%
     file$ = ListBoxItem$(anz%)
     pic& = Create("hsizedPic",-1,  file$,1280,780,1)
     Casenot pic& : continue
     textur%[j% + 1] = oGL("getTextureBMP",pic&,1)
     DeleteObject pic&
     Inc j%
     Inc anz%
   EndWhile
 


Wäre schön wenn ihr mir da helfen könntet.



Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   15.07.17 07:15

Wie sieht es denn aus, wenn du die Bilder
bei Programmstart z.B. in ein Array lädst ?

Da bräuchte das Programm beim Starten nur etwas
länger, hätte aber die Bilder bereits im Speicher.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   19.07.17 22:40

Hallo Heinz,

wie meinst Du das mit dem Array? Habe ich das nicht so in meinem obigen Beispiel? Oder hast du da an etwas gedacht das möglicherweise schneller geht?

M.Barkholz

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   20.07.17 07:01

Hallo,
im ersten Code brauchst du keine Schleife, wenn
du AddFiles benutzt. Du suchst ja hier doppelt.
Also, entweder mit AddFiles oder halt in einer
Schleife mit FindFirst$() und FindNext$.

Im zweiten Code war halt für mich nicht ersichtlich,
ob der Code am Programmanfang oder während des
Programmlaufes ausgeführt wird. Wie gesagt :
Werden beide Codes bei Programmstart ausgeführt,
dürft es normalerweise später beim Abspielen der
Demo nicht hakeln.

Wieviele Dateien hast du ungefähr ?

Es könnte nun aber auch sein, daß sich beide Threads
(Abspielen der Hintergrundmusik und Anzeigen der Demo)
da etwas Zeit rauben.

Um das rauszubekommen, laß doch mal einfach die Hintergrund-
musik weg. Wenn es dann flüssiger abgespielt wird, wissen wir
schon mal, wo es hängt. Abhilfe könnte man dann schaffen, wenn
man entweder die Musik oder das Abspielen der Bilder in einen
eigenen Prozess verlagert.
Siehe hierzu in der Hilfe das Kapitel Multiprozessing.

PS: Mit welchem Befehl spielst du deine Musik ab
PlaySound oder Midi() ? Da gibt es ja den Parameter N,
der das Abspielen entweder im Vordergrund oder aber
auch im Hintergrund regelt. Evtl. brauchen wir da keinen
extra Prozess.

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (20.07.17 07:34)

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   21.07.17 19:11

Hallo,
zu Deinen Fragen:

- eigentlich soviele Dateien, das ich einen ganzen Abend lang das Programm, z.B. auf einer Party als Hintergrundberieselung laufen lassen kann. Aber das muss jetzt auch nicht zwingend sein - wäre aber meine Idealvorstellung.

- Das Demo an sich läuft sehr flüssig. Selbst mit der Musik im Hintergrund.

- Die Musik habe ich mit MCISend abspielen lassen. Das läuft auch sehr flüssig. Selbst mit 8 Sprites, Scrollbalken und Laufschriften vollgepackt liegt die Prozessorauslastung knapp bei 15% laut Taskmanager. Das Abschalten der Musik bringt da wenig bis keine Differenzen.

- Ich habe wohl alles zum laufen gebracht indem ich die eigentliche Diashow in einen seperaten Prozess laufen lasse. Also mit pExec("|Prozedur für Diashow").
Sobald die Bilder (50Stück zu Testzwecken) im 2.Prozess geladen sind, verfrachte ich das Demo, das nur die Wartezeit überbrücken soll in den Hintergrund und alles ist gut - ersteinmal!
Das Problem dabei ist, dass das komplette oGL ein zweites Mal initialisiert werden muss und dann natürlich auch seine 15% Prozessorlast verbraucht. Das ist zwar kein Problem bei einem OctaCore AMD, ich empfinde es aber als unsauber programmiert.

Außerdem kommt es dann zu Problemen. Die Diashow wird von Minute zu Minute langsamer. Nach 10Minuten ist dann schluss mit lustig. Der PC ist blockiert, Musik läuft aber weiter. Tastatur- und Mauseingaben funktionieren nicht mehr. Resultat ist dann ein Hardreset!

Ich nehme an es liegt an der Doppelinitialisierung von OpenGL.

Ja, und genau ab hier bin ich dann ratlos.

Das Nachladen der Bilder zur Laufzeit wäre optimal aber wie erwähnt, stoppen die Animationen. Musik läuft natürlich. Wenigstens ein Anfang.

Die Idee von Dir die Bilder vorab in den Speicher zu laden wäre natürlich eine Lösung.

Aber im Grunde scheitert es genau an diesen beiden Codezeilen:

pic& = Create("hsizedPic",-1, file$,1280,780,1)
textur%[j% + 1] = oGL("getTextureBMP",pic&,1)

Die Übergabe an das oGL-Frame bei einer Bildgröße von 1280x720 Punkten braucht alleine 3Sekunden. Selbst wenn keine Beeinträchtigung durch Musik und Animationen vorhanden sind. Wenn ich nur diese Übergabe in einem eigenen Prozess legen könnte, gäbe es keine Probleme.

Und wie würdest Du das mit AddFiles, FindFirst$() und FindNext$ lösen?
Hättest Du da ein Beispiel für mich.

Gruß
Markus Barkholz

In einem anderen Forum habe ich einen Tipp zum Thema Callback bekommen. Aber damit kann ich nicht anfangen.

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   22.07.17 07:46

Zitat:

Und wie würdest Du das mit AddFiles, FindFirst$() und FindNext$ lösen?

Ob nun AddFiles allein oder FindFirst$() und FindNext$ in einer
Schleife. Das ist das gleiche.

AddFiles ist halt die Quick & Dirty - Lösung und
bei FindFirst + FindNext muß man halt selber
Hand anlegen, indem man FindNext in einer Schleife
aufruft. Was du nun von beiden verwenden willst,
ist reine Geschmacksache.

Vom Aufwand her ist halt AddFiles mit einer Zeile
kürzer. Die andere Version verwendet man immer
dann, wenn z.B. im Vorfeld nur Dateien ab einem
gewissen Datum gebraucht werden. Die übrigen
Dateinamen verwirft man einfach und werden nicht
z.b. in die Listboxliste geschrieben.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   24.07.17 13:39

Hallo Heinz!

Danke erstmal für Deine Hilfe.

Ich habe nun nach Deinem Vorschlag den Code entsprechend abgewandelt. Es ist tatsächlich schneller geworden. Befriedigt allerdings meine Ansprüche noch immer nicht vollständig. Aber damit kann ich schon was anfangen.

Nur das eigentliche Vorhaben, Animationen zu benutzen und ein Wartedemo anzuzeigen bis die Bilder geladen werden, funktioniert leider nicht wirklich. Das hängt noch immer.

Die Zeile(n)

pic& = Create("hsizedPic",-1, file$,1280,780,1)

und

textur%[cnt%-1] = oGL("getTextureBMP",pic&,1)

fressen unheimlich Zeit.

Mal nur so angedacht:

Create("hsizedPic"....." erzeugt beim Auslesen mit Print einen recht großen Zahlenwert. Was beinhaltet der eigentlich? Was wird denn da eigentlich ausgegeben?

Und was wäre, wenn ich diesen Vorgang in eine SQL-Datenbank schreibe....
würde das möglicherweise eine Beschleunigung bewirken wenn ich den Wert dann an das Array textur%[xy] übergebe?

Würde das möglicherweise etwas bringen?

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   24.07.17 15:37

Du hast ja noch eine Möglichkeit :
Mach mal vielleicht den Weg über MLoadBmp und bei
Create("hSizedPic", 0, "&MEMBMP" , 1280, 780, 1).

Vielleicht geht das etwas schneller, weils direkt über den Speicher geht.
An den OGL-Sachen kann man leider nichts schrauben.

PS: Die riesigen 6stelligen Zahlen sind die Handles, die
Windows vergibt. Hat also damit nichts zu tun.

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (24.07.17 15:40)

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   24.07.17 16:30

Habs grad mal in den Code eingebaut. Braucht ein wenig länger als meine Methode. Wenn auch nicht viel. Half haber den Code nochmals zu optimieren und spart ein paar Variablendeklarationen.

Das Ganze sieht jetzt so aus:

 /* Bildverzeichnis Initialisieren */
 Proc Bilder
   Declare path$, cnt%
   Var Folder$ = "1"
   path$ = $ProgDir + "Bilder\" + folder$ + "\"
   ChDir path$
   path$ = path$ + "*.jpg"
   AddFiles FindFirst$(path$)
   'sucht nach Bilder und weist Diese der Variable Bilder$ zu
   WhileNot %IOResult
     AddFiles FindNext$()
     Inc cnt%
     textur%[cnt%-1] = oGL("getTextureBMP", Create("hsizedPic",-1, ListBoxItem$(cnt%-1),1280,780,1),1)
     print int(100/40*(cnt%-1)), " %"
   EndWhile
 EndProc
 


Ich glaube, besser wird es nicht.
Findest Du an der Proc noch optimierungsmöglichkeiten?

Danach lasse ich Dich auch wieder in ruhe ;-)
Den Rest werde ich wohl auch alleine schaffen.

Gruß

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   24.07.17 17:53

Ich weiß ja nicht, warum du so eine Freude hast,
AddFiles und FindNext zu kombinieren. Entweder
das eine oder das andere. Hab ich dir schon einen
Post vorher erklärt.
Das sind ja auch Sachen, die funktionieren zwar, aber
bremsen zusätzlich. Alleine das AddFiles in einer
Schleife verbrät schon einige Zeit. Das kann ruhig
vor der Schleife stehen.

Also ich würde das so machen :

 Proc Bilder
    ClearList
    Declare path$
    Var Folder$ = "1"
    path$ = $ProgDir + "Bilder\" + folder$ + "\" ' Da sind deine Bilder drin
    ChDir path$
    AddFiles "*.jpg"
    If %GetCount > 0 ' stehen auch mind. 1 Datei in der Listboxliste drin ?
       WhileLoop 0, GetCount(0) - 1
         textur%[&LOOP] = oGL("getTextureBMP", Create("hsizedPic", -1, ListBoxItem$(&LOOP), 1280, 780, 1), 1)
       EndWhile
    EndIf 
    ' Im Array textur%[], das du vorher am Programm - Anfang definiert hast,
    ' stehen jetzt deine Texturnummern.
  EndProc
 


cnt% hab ich zwar jetzt rausgenommen, kannst es aber für deine
Zwecke wieder einbauen. Oben ist nur das Notwendigste.

Probier mal das aus.

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (24.07.17 17:58)

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   24.07.17 18:42

Das funktioniert ziemlich gut. Danke :-)

Die Sache mit AddFiles und FindNext hatte sich irgendwie so ergeben. Ich programmiere erst seit 8 oder 9 Wochen mit xProfan. Das sind schlicht Anfängerprobleme. Auch wenn ich seit den 80'ern in BASIC programmiere und auch Visual Basic nutzte, kann ich leider nicht von mir behaupten, effizienten Code zu produzieren. Ich mache das ja auch nur als Freizeitbeschäftigung nach der Arbeit. Und da ich meist erst nach 22h damit anfangen kann, ist es auch mit er Konzentration dahin.
Ich bin aber trotzdem sehr froh etwas basteln zu können das mir Spass macht :-)

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   24.07.17 18:59

Hab jetzt auch mal einen kleinen Test gemacht und
30 Bilder (Texturen) geladen. Das dauert doch schon
ca. 10 Sekunden im Interpreter.

Wenn man die Bilder im Programmlauf zügig braucht,
ist es ratsam, diese bei Programmstart zu laden. Besser
braucht das Programm beim Starten etwas länger, als daß
es bei anschließenden der Demo ruckelt.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.dyn.telefonica.de)
Datum:   26.07.17 12:02

Ja, da hast Du recht. Da mein Vorhabe nicht ganz meinen Wünschen entspricht, stelle ich die Diashow nun etwas um. Laden der Texturen in Kombination mit einem Fortschrittbalken. Danach kann die Show ja beginnen.

Du lädst 10 sek. bei 30Bildern? Dann ist die Bildgröße aber nicht sehr hoch oder?
Das Format 1280 x 7xx braucht pro Textur ca. Eine Sekunde. Ein kleineres Format sieht bescheiden aus. Also 60Bilder = 1Minute. 250 Bilder wollte ich laden, naja.

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   26.07.17 16:09

Ja, die .jpg haben alle ca. 30 KB und ein paar
150 KB.

Was ich jetzt festgestellt habe, ist, daß das Create("hSizedPic",...)
alleine nur 2 Sekunden für die 30 Bilder braucht. Also scheint es
mehr an dem OGL-Zeug (oGL("getTextureBMP",....) ) zu bremsen.

Die 250 Bilder als Ressourcen in die Runtime (prfrun32.exe)
bzw. in den Interpreter (Profan.exe) mit dem ResHacker
zu packen ist wohl eine Heidenarbeit. Das kann man mal mit
10 Bildern so machen.

Das ist jetzt halt so eine Sache, an welchen Schrauben man da noch
alles drehen kann. Läuft denn die Sache ohne Musik etwas schneller ?

PS:
Alternativ wäre da noch die Prospeed.dll zu erwähnen. Die macht
zwar kein OpenGL, kann aber auch Sprites usw. verarbeiten.
Frank Abbing hatte die damals in reinem Assembler geschrieben
und dürfte an Speed nicht mehr zu überbieten sein. Die ist
mittlerweile auch Freeware.

Wenn du sie hier bzw. im Netz nicht findest, ich habe diese noch
auf USB-Platte.

Achso : welche Bildformate (.bmp, jpg, usw.) hast du denn ?

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (26.07.17 18:49)

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   26.07.17 19:29

Ja, das ist mir auch schon aufgefallen. Die oGl-Sache bremst da wohl reichlich. Eigentlich wollte ich ausgewählte Bildverzeichnisse (1 .... 10) per Zufall auswählen. Wenn ein Verzeichnis abgearbeitet ist, sollte das Nächste geladen werden. Aber dann hätte ich ja keine Dia- sondern eher eine Warteshow. Die Bilder selber sind alles JPGs von meiner DigiCam 8MP und sind alle so zwischen 1MB groß. Die Bildgröße sollte allerdings wegen der Anzeigequalität schon so bleiben. Während meines Dienstes kam mir aber heute die Idee die Bilder zu verkleinern und dafür mehrere als Collage auf dem Bildschirm anzeigen zu lassen. Dann sind sie auch kleiner und es dürfte schneller gehen beim laden.

Die Musik beeinträchtigt das Laden in keiner Weise. Jedenfalls nicht wenn man es über MCISend abspielen läßt. Über Playsound alledrings dauert es länger. Aber kaum merkbar. MCISend habe ich gewählt, weil damit FadeIn/Out möglich ist und auch Videos abgespielt werden können. Das wollte ich nämlich auch mal ausprobieren. Oder ebend Video in oGL. Da gibt es ein Video-Sprite-Würfel. Fand ich ganz interessant. Aber teste ich erst, wenn mal alles läuft.

Die prospeed.dll muss ich mir mal anschauen - klingt vielversprechend

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   26.07.17 19:36

Da fällt mir noch was ein:

Mein Kumpel programmiert in C++ und der läd Bilder vorab in den Speicher und greift dann mittels Pointer darauf zu. Kann man eigentlich den Speicherberei in denen sich die Texturen befinden nicht sichern und als Ganzes ins RAM zurück schreiben? Dann würde das doch auch fix gehen oder?

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: RGH (---.hsi18.kabel-badenwuerttemberg.de)
Datum:   27.07.17 00:07

Bitmaps in den Speicher laden kannst Du auch mit XProfan. Das geht mit den Funktionen hBmp& = create("hPic", ...) und hBmp& = create("hSizedPic", ...). Beide Funktionen geben das Handle der Bitmap im Speicher zurück.

Und mit tnr% = oGL("GetTextureBmp", hBmp&, N%) verwendest Du diese Bitmaps im Speicher als Texturen. Das Ergebnis ist die Texturnummer. Mit oGL("DeleteTexture", tnr%) kannst du nach Gebrauch den Texturspeicher wieder freigeben.

Gruß
Roland

Offizielle Homepage: http://www.xprofan.de
Der neue PROFAN-FAN-SHOP: http://www.spreadshirt.de/shop.php?sid=9330
Das kostenlose Kartenspiel: http://www.rgh-soft.de/sprace/sprace.htm

Beitrag beantworten
 
 Re: oGL - Demo hängt beim Nachladen von Bildern
Autor: Markus Barkholz (---.unity-media.net)
Datum:   22.08.17 20:02

Hallo RGH,

habe mich noch nicht bedankt für Deine Hilfe.
Das möchte ich hiermit nachholen.

Habe mich nun einige Zeit mit GL-BASIC basic beschäftigt und habe nun einen Vergleich durchgeführt.
Ich finde, beide Sprachen haben ihre Vor- und Nachteile. Mächtiger ist allerdings xProfan. Selbst mit den Schwächen des Bilder zur Laufzeit nachladen. Was mich sehr ärgert.

Aber man kann sie ja am Anfang des Programms in den Speicher laden. Was wohl länger dauert aber dafür funktioniert es zuverlässig und schnell.

Nochmals Vielen Dank für Deine Hilfe.

Markus Barkholz

Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org