Seite 1 von 2

Problem mit Thread und Sprites

Verfasst: 15.09.2012 04:56
von STARGÅTE
Tachchen,

Da das Laden von vielen Sprites etwas mehr Zeit in Anspruch nimmt, würde ich gerne einen Ladeanimation auf meinem Screen zeigen, während ich die Grafiken (Sprites) einlade.
Leider musste ich nun feststellen, dass sich mein Programm manchmal aufhängt, wenn ich (trotz ThreadSafe Aktivierung) LoadSprite in einem Thread benutze, während in der Hauptschleife der Screen aktualisiert wird (FlipBuffers usw.)
Ist die Sprite-Lib von PB nicht Threadsicher?

Code: Alles auswählen

InitSprite()
InitSprite3D()

Enumeration
	#Window
EndEnumeration

OpenWindow(#Window, 0, 0, 800, 600, "ScreenTitle", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window), 0, 0, WindowWidth(#Window), WindowHeight(#Window), 0, 0, 0)

UsePNGImageDecoder()

Procedure Test(A)
	For n = 1 To 50
		LoadSprite(n, "...") ; Hier bitte irgend ein großes Bild nehmen (zB 2560x1920px)
	Next
EndProcedure

Define Thread = CreateThread(@Test(), #Null)

Repeat
	
	Repeat
		
		Select WindowEvent()
			Case #PB_Event_CloseWindow
				End
			Case #Null
				Break
		EndSelect
		
	ForEver
	
	ClearScreen(0)
	
	StartDrawing(ScreenOutput())
		DrawText(0, 0, Str(ElapsedMilliseconds()))
		If IsThread(Thread)
			DrawText(0, 20, "Ladevorgang")
		Else
			DrawText(0, 20, "Fertig")
		EndIf
	StopDrawing()
	
	FlipBuffers()
	
ForEver
Das nutzen von Mutex ist leider keine echte Lösung, weil dann blockiert ja das Laden wieder den Screen, und dann brauch ich auch keine Animation...

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 06:33
von 7x7
Läuft bei mir in allen Variationen (mit/ohne Thread-Safe, mit/ohne Debugger) absolut problemlos (W7x64, PB4.61, Bild: 3508x2480 pixel). Habe "n" zum besseren austesten auf 50000 gesetzt...läuft ohne Ruckler/Fehler durch

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 09:23
von Dave
Hi STARGÅTE

In der PB-Hilfe steht unter Threads:
Hinweis: Benutzen Sie innerhalb von Threads kein DirectX (MS Windows Einschränkung)! Wenn Sie auf Grafikdarstellung in Threads angewiesen sind, verwenden Sie stattdessen Images und 2DDrawing.
Vielleicht hilft dir das.

Lg Dave

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 10:52
von Bisonte
Loadsprite ist ja keine Darstellung.... und sollte somit eigentlich funktionieren.

Aber ich denke mal das die Spritelib nicht threadsicher ist, ich glaube sowas gelesen zu haben im eng. forum.
Dort war es, glaube ich, J.Baker der das ganze mitteilte...

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 12:59
von PMV
Die Hilfe sagt "kein DX in Threads" ... und das ist eine klare
unmissverständliche Aussage. :wink:

Also DX9 unterstützt kein aufteilen auf Threads. Unter Windows kann
ein Thread gestartet werden der ALLE DX-Aufrufe beinhaltet, oder
aber, so wie ich es gemacht hab für mein Projekt zur Sicherheit, die
DX-Aufrufe nur im Mainthread zu tätigen.

Das Problem mit dem Laden hat somit jeder, sicher auch der Grund,
warum Spiele bis DX9 grunsätzlich nur einen statischen Ladebildschirm
haben und der ruckelt. Entweder du schreibst zwischen den Ladevorgängen
in regelmäßigen Abstenden fest "DisplaySprite(LoadScreen, 0, 0) und
"Flipbuffers()" ... oder du schreibst die eine extra Loop fürs Laden und
füllst vorher eine Liste mit allen zu ladenden Elementen.

Oder du nutzt DX10, aber das hat dann nichts mehr mit PB zu tun. :lol:

MFG PMV

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 15:33
von STARGÅTE
7x7 hat geschrieben:Läuft bei mir in allen Variationen (mit/ohne Thread-Safe, mit/ohne Debugger) absolut problemlos (W7x64, PB4.61, Bild: 3508x2480 pixel). Habe "n" zum besseren austesten auf 50000 gesetzt...läuft ohne Ruckler/Fehler durch
Wie kannst du 50000 Bilder einladen ... bei dem Format wären das 1,739 TB also 1739 GB ... ich bezweifel stark das du so viel Ram hast ... Sicher das die Bilder auch geladen wurden?
PMV hat geschrieben:Das Problem mit dem Laden hat somit jeder, sicher auch der Grund,warum Spiele bis DX9 grunsätzlich nur einen statischen Ladebildschirmhaben und der ruckelt.
Hm, hba ich nie so mitbekommen, bei den Spielen die ich "damals" spielte, gabs u.a. immer n nette Drehscheibe, die sich drehte.
...oder du schreibst die eine extra Loop fürs Laden und
füllst vorher eine Liste mit allen zu ladenden Elementen.
Ich glaube das wäre mit die besste Lösung, so habe ich zugleich bereits am Anfang des Ladens eine Anzahl der zu ladenden Elemente und kann dann auch den Fortschritt anzeigen.
Und das die Animation dann keine 60FPS erreichen wird, muss ich dann halt hinnehmen.

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 17:03
von 7x7
Jetzt wo du es sagst, frage ich mich das auch.

Habe versehentlich ein Bild im JPG-Format angegeben, und da das Ladeergebnis (Result=0) in deinem Code nicht abgefragt wird, habe ich nicht gemerkt, dass das Bild garnicht geladen wird. Sorry.

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 18:50
von PMV
Also ich kenne kein Spiel, das mit DX9 läuft und ne aufwendige
Animation hat ... das ist in 90% nen Ladebalken der sich sehr
unregelmäßig füllt. Und die 10%, die doch ne kontinuierliche
Animation hatten, da war sie zum einen sehr dezent und zum
anderen nie mals durchgängig Flüssig. Ich hab auch oft Fraps
beim laden laufen gehabt und ich hatte sogar min eine, der nur
den Ladescreen zu beginn angezeigt haben und dann tat sich
nix mehr bis laden beendet. Kann mich aber nicht mehr
erinnern welches Spiel das war. Bei allen wars aber so, das
der Screen nur gewechselt wurde, wenn der Ladebalken sich
erhöht hat. Das zumindest meine Erinnerung.

MFG PMV

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 22:37
von Bisonte
diverse games : Schickes Bild... LadeBalken und fertig ist die Laube.

jetzt mal ganz kompliziert gedacht :

Ein externes Programm! Ich meine, der dann per shared memory die daten des Ladefortschritts übergeben und die exe
macht dann die Animation.... Wär das vielleicht eine Idee ?

Re: Problem mit Thread und Sprites

Verfasst: 15.09.2012 22:59
von PMV
daran hab ich auch schon gedacht und für Windowed-Screen wäre
das ganz leicht machbar. Aber ein Fullscreen kann man nicht
verstecken, oder doch?