Problem mit Thread und Sprites

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Problem mit Thread und Sprites

Beitrag 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...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Problem mit Thread und Sprites

Beitrag 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
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
Dave
Beiträge: 22
Registriert: 12.06.2011 21:39
Computerausstattung: Windows 10 x64, Intel Core i7 7700k @4.2Ghz, 16GB RAM, PureBasic 5.72

Re: Problem mit Thread und Sprites

Beitrag 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
Bild Bild Bild
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Problem mit Thread und Sprites

Beitrag 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...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Problem mit Thread und Sprites

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Problem mit Thread und Sprites

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Problem mit Thread und Sprites

Beitrag 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.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Problem mit Thread und Sprites

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Problem mit Thread und Sprites

Beitrag 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 ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Problem mit Thread und Sprites

Beitrag 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?
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten