Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

1

24.09.2009, 17:19

Direct-X Resourcen in Thread laden

Hi

Ich überlege gerade das Laden von Direct-X Resourcen in einen Thread zu verlagern, so dass sie neben dem eigentlichen Spiel geladen werden können...

So jetzt bin ich aber noch am grübeln, wie ich das machen soll. Und da wollt ich mal Fragen, wie andere Spiele das machen, die beim
Laden immer noch irgendwelche videos zeigen, wie zum Beispiel C&C Generals oder Assassin's Creed ?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.09.2009, 17:46

Re: Direct-X Resourcen in Thread laden

Zitat von »"Databyte"«

Und da wollt ich mal Fragen, wie andere Spiele das machen, die beim
Laden immer noch irgendwelche videos zeigen, wie zum Beispiel C&C Generals oder Assassin's Creed ?


Vermutlich laden die die Sachen in nem eigenen Thread während das Video spielt ;)

3

24.09.2009, 21:08

Naja würde ich auch sagen, einfach alles in einem Thread laufen lassen und da die Daten in den Ram laden und dann aber im Mainthread die Daten an die Graka senden. Denn wenn man DX auf Multithreading stellt soll es nicht sehr schnell sein.

4

24.09.2009, 21:33

Zitat von »"Zero"«

Naja würde ich auch sagen, einfach alles in einem Thread laufen lassen und da die Daten in den Ram laden und dann aber im Mainthread die Daten an die Graka senden. Denn wenn man DX auf Multithreading stellt soll es nicht sehr schnell sein.


Das ist wohl (laut DirectX-Doku) richtig, dass die Performance etwas runtergeht.
Allerdings geht es auch ohne das Multithreading-Flag.
Also muss man deswegen nicht gleich Single-Thread fahren.
Die Anzahl der Threads werden sich in Databytes Anwendung wohl auch in Grenzen halten.
Denke ich mal. ;)
fka tm

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

24.09.2009, 23:07

Zitat von »"TrikkieMikkie"«

Zitat von »"Zero"«

Naja würde ich auch sagen, einfach alles in einem Thread laufen lassen und da die Daten in den Ram laden und dann aber im Mainthread die Daten an die Graka senden. Denn wenn man DX auf Multithreading stellt soll es nicht sehr schnell sein.


Das ist wohl (laut DirectX-Doku) richtig, dass die Performance etwas runtergeht.
Allerdings geht es auch ohne das Multithreading-Flag.
Also muss man deswegen nicht gleich Single-Thread fahren.
Die Anzahl der Threads werden sich in Databytes Anwendung wohl auch in Grenzen halten.
Denke ich mal. ;)


Joa hatte so an 3 gedacht: Main-thread, Lade-thread, script-thread :)
Joa ich hatte mir das mit dem in ram laden auch so vorgestellt ... werd das mal testen :)

6

26.09.2009, 11:41

Etwa so in etwa, das ist dann eine Konsolenanwendung und nur als kleines Beipsiel gedacht.:



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#define WIN32_LEAN_AND_MEAN  // Kein MFC Zeugs *arg*


#include <windows.h>
#include <windowsx.h>
#include <stdio.h>

// --------------------------------------------------------------------------------------------



// ============================================================================================

// Definitionen

// ============================================================================================


#define MAX_THREADS 3 

// --------------------------------------------------------------------------------------------



// ============================================================================================

// Funktionen

// ============================================================================================


DWORD WINAPI ThreadFunc(LPVOID data)
{
    // Gibt 50 ein Zeichen mit einer Verzögerung aus


    for (int index=0; index<50; index++) {
        printf(" Thread: %d ",(int)data);
        printf(" Index: %d " ,index);       // Wert ausgeben

        Sleep(100);                         // Verzöger ein bisschen das ganze

    } // end for index



    // gibt den Wert zurück den du bekommen hast

    return((DWORD)data);

} // end ThreadFunc


// --------------------------------------------------------------------------------------------


void main(void)
{

    HANDLE hThread[MAX_THREADS];            // Handles auf die Threads

    DWORD  dwThreadID[MAX_THREADS];     // IDs der Threads



    printf("\nAlle Threads starten...\n");

    // Alle Threads starten

    for (int index=0; index<MAX_THREADS; index++) {

        hThread[index] = CreateThread(NULL,                     // Sicherheitsinfos

                                                0,                          // Größe des Stack

                                            ThreadFunc,             // Threadfunktion

                                                (LPVOID)index,          // 32-bit paramter der Threadfunktion übergeben wird

                                                0,                          // Creation Flags, 0=sofort starten.

                                                &dwThreadID[index]);    // Id speichern

    } // end for index



    // Hauptthread gibt nun auch Zeichen aus; Nur 25 dadurch weniger als die erzeugten Threads

    for (int index=0; index<25; index++) {
        printf("  Main  ");
        Sleep(100);
    } // end for index


    // Auf die Threads warten, bis sie fertig sind

    WaitForMultipleObjects( MAX_THREADS,    // Anzahl der Threads, auf die gewartete werden muss

                                    hThread,            // Handles der Threads

                                    TRUE,               // Für alle warten?

                                    INFINITE);      // Wie lange soll gewartet werden, INFINITE = unendlich lange


    // Alle Threads sollten beendet sein


    for (int index=0; index<MAX_THREADS; index++)
        CloseHandle(hThread[index]);

    printf("\nAlle Threads beendet.\n");
    Sleep(100000);

} // end main


// --------------------------------------------------------------------------------------------




Zod saves us... !!!! Yeaah !!!


____________________
Edit von TrikkieMikkie
Nochmal: Wenn du möchtest, dass jemand den Code liest,
dann verwende für C++ Code entsprechende Tags!
(Button "C++-Code") ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

26.09.2009, 12:34

WIN32_LEAN_AND_MEAN hat nichts mit der MFC zu tun... *arg*

8

26.09.2009, 12:57

Siehe VC_EXTRALEAN... *örpps*
fka tm

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

9

29.09.2009, 23:45

Joa ich hab das jetzt mal getestet und es scheint, dass DirectX das auch ohne
multithreading-flag ganz gut hinbekommt

Der Test war:

Thread 1:
Normale gameloop; rendert 2 Dreiecke mit einer Textur :)

Thread 2:
Läd eine neue Textur und ersetzt die von Thread 1.

Das funktioniert eigentlich ganz gut:)
Die Frage ist jetzt halt nur wie groß die wahrscheinlichkeit ist dass es auch
immer funktioniert :) Egal ich mach das jetzt mal so... no risk no fun ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

29.09.2009, 23:51

Ich denke da du nur Ressourcen lädst sollte es da keine Probleme geben. Problematisch wirds wenn du aus verschiedenen Threads z.B. DrawPrimitive Aufrufe machst...

Werbeanzeige