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

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

1

24.10.2007, 19:30

m_pEffect->Begin mit D3DERR_INVALIDCALL

Hallo, ich hab leider ein kleines Problem mit Effekten:

Ich habe meine Struktur des Spiels auf die von Galactica aufgebaut. Der Unterschied ist, dass wenn auf Spielstarten geklickt wird, wird ein neuer Thread gestartet, der vor allem die Modelldateien einliest. Ein selbstprogrammierter Fortschrittsbalken zeigt den Fortschritt an.
Unter 10 Mal starten des Spiels kommt es aber ca. 4 mal vor, dass während des Ladeschirms das Bild plötzlich aufblitzt.
Wenn man dann die Log anschaut steht da:

FEHLER: Der Aufruf von m_pEffect->Begin verursachte den DirectX-Fehler D3DERR_INVALIDCALL! Beschreibung: Invalid call

Ich hab in der Forensuche mal geschaut, da steht das so ein Fehler im allgemeinen vorkommt, wenn man falsche Parameter angegeben hat.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Starten eines Effekts

int tbEffect::Begin(BOOL bSaveState,        // = TRUE

                    BOOL bCaptureOnFinish)  // = TRUE

{
    HRESULT         hResult;
    unsigned int    uiNumPasses;


    // Die Begin-Methode aufrufen

    if(FAILED(hResult = m_pEffect->Begin(&uiNumPasses,
                                         bSaveState ? 0 : D3DXFX_DONOTSAVESTATE)))
    {
        // Fehler!

        TB_ERROR_DIRECTX("m_pEffect->Begin", hResult, -1);
    }

Mittlerweile hab ich rausgefunden, das es sich bei dem Effekt um den GUI Effekt handelt. Aber wie kann der Aufruf manchmal illegal sein, ich habe doch nie einen direkten Einfluss auf den Aufruf von m_pEffect->Begin, da ich int tbEffect::Begin ohne Parameter aufrufe.
Wo kann den dann der Fehler liegen?

Ansich wäre es nicht so schlimm, aber von 1 Mal unter den 10 Mal passiert es auch noch, dass Present() fehlschlägt, ich hoffe das das mit dem obigen Fehler zusammenhängt, oder hat jemand da andere Erfahrung gemacht?

Vielen Dank für einen Hinweis, viele Grüße
Andreas

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

2

25.10.2007, 13:53

ich bin mir net ganz sicher da ich mich nie wirklich mit dx beschäftigt habe.
Aber gab es nicht spezielle parameter für multithreaded anwendungen beim erzeugen des Device?


Socke

3

25.10.2007, 14:10

Ich wiederum verwende die TriBase-Engine nicht.
Aber das sieht für mich so aus, als ob dein Programm bereits versucht zu rendern, während der gestartete Thread noch die Modelldaten lädt.
fka tm

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

25.10.2007, 20:40

Hi, in wiefern sieht denn das Laden und das Zeichnen aus?
Weil programmieren mit mehreren Threads ist komplizierter als es oft den Anschein macht und die Tribase ist nach meinem Wissenstand nicht von Haus aus threadsicher. Auch muss man schauen in wiefern DX threadsicher ist, bzw. was noch vom Programmierer getan werden muss um es threadsicher zu machen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

5

26.10.2007, 14:26

Hi, danke für die Antworten!!
Er lädt die Modelldateien, während der Fortschrittsbalken den Fortschritt anzeigen soll, also gleichzeitig rendern und laden.

Ich hab jetzt mal ein bischen Debugged und herausgefunden, dass z.b. BeginScene fehlschlägt, wenn ich gleichzeitig die Methode SetTechnique(-1) für einen Effekt auswähle, da er in dieser Methode irgendwie Daten sammeln muss.

In einer Referenz über C++ hab ich folgendes gefunden:

Zitat

Wenn Sie MFC-Klassen in Ihren normalen DLLs verwenden, müssen Sie das Makro
AFX_MANAGE_STATE als erste Codezeile in allen exportierten Funktionen aufrufen. Das ist
erforderlich, um die exportierten Funktionen thread-sicher zu machen.


Zitat

Aber gab es nicht spezielle parameter für multithreaded anwendungen beim erzeugen des Device?


Ich hab da mal einen Beitrag dazu gefunden:
http://www.zfx.info/DisplayThread.php?TID=22716

Muss ich dann das, was in der C++ Referenz steht auch noch machen, oder reicht es, wenn ich D3DCREATE_MULTITHREADED angebe?

Was würdet ihr mir denn empfehlen, das Spiel ist eigentlich immer Single Threaded, nur beim Laden kommt der "Ladethread" hinzu. Soll man dann auf D3DCREATE_MULTITHREADED zurückgreifen oder manuell das Rendern und Laden in Critical Sections packen?

Vielen Dank für eine Antwort, viele Grüße
Andreas

[/quote]

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

26.10.2007, 14:45

Am einfachsten und effektivsten sollte D3DCREATE_MULTITHREADED sein. Alternativ könntest du natürlich die Daten anstatt direkt in die Device zu laden, erstmal im Speicher zwischenspeichern. Es ist natürlich fraglich in wiefern, dass noch Geschwindigkeitsvorteile bringt. Dazu kann man aber nur eine Aussage machen, wenn man weiß wie sich die genötigte Zeit auf Teilbereiche des Ladens verteilt.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

7

26.10.2007, 15:06

Hi, ich hab jetzt gerade mal in der Engine nachgeschaut und in tbConfig in Zeile 700 steht schon
pOut->Direct3D.dwFlags = D3DCREATE_MULTITHREADED;
D.h. doch, dass das Flag die ganze Zeit vorhanden war und trotzdem ist der Fehler aufgetreten, was ist denn dann noch falsch?

Viele Grüße
Andreas

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

8

30.10.2007, 18:47

Hallo,
ich hab jetzt einfach SetTechnique(-1) und die Rendermethode in Critical Sections eingefasst und seitdem ist der Fehler nicht mehr aufgetreten, trotzdem danke

Viele Grüße
Andreas

Werbeanzeige