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

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

11

21.04.2009, 18:48

Ähm, der Aufruf von GetDevice von der Engine wird wohl kaum den Besitz von dem Objekt auf dich übertragen. Freigeben musst du also nichts.
Du solltest natürlich nur dafür sorgen, dass du das Device zum richtigen Zeitpunkt benutzt, also wahrscheinlich bevor EndScene aufgerufen wird.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Heiko

Frischling

  • »Heiko« ist der Autor dieses Themas

Beiträge: 19

Wohnort: @home

  • Private Nachricht senden

12

21.04.2009, 19:17

ja genau.
also es gibt bereits ein addon welches so funktioniert.
Und zwar hab ich mal ein beispiel....



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
//  GUIw512 Test


#pragma comment(lib,"libs/xors3d.lib")
#include "xors_include/xors3d.h"
#include "FastImageXors.h"

int WINAPI WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int nCmdShow)
{
    xAppTitle("GUIw512 Test");
    xGraphics3D(800,600,32,false,false);

    /* Çàãðóçêà FastImage */
    if ( !LoadFastImage() ) {
        MessageBoxA(NULL,"LoadFastImage failure","Error",MB_OK);
        return(0);
    }

    /* Èíèöàëèçàöèÿ FastImage */
    if ( !pInitDraw(xGetDevice(), 0) ) {
        MessageBoxA(NULL,"pInitDraw failure","Error",MB_OK);
        return(0);
    }


    int tex = xLoadTexture("icon_open.png",2);
    //int img = fLoadImage("icon_open.png",2,0);

    int img = fCreateImage(tex,16,16,0);
    int cam = xCreateCamera();
    int cub = xCreateCube();
    xEntityTexture(cub,tex);
    xPositionEntity(cam,10,10,10);
    xPointEntity(cam,cub);

    int font = fLoadImageFont("media/font.txt",FI_SMOOTHFONT);
    pSetImageFont(font);

    while (xWinMessage("WM_CLOSE")==0 && xKeyHit(1)==false) {
        xRenderWorld();

        if (!pStartDraw()) {
            MessageBoxA(NULL,"pStartDraw failure","Error",MB_OK);
            return(0);
        }
        pSetBlend(FI_ALPHABLEND);

        fDrawImage(img,200,200);
        fDrawText("Ìíîãà áóêàô",100,400);

        pDrawRect(180,180,20,20,1);
        pDrawRect(180,216,20,20,1);
        pDrawRect(216,180,20,20,1);
        pDrawRect(216,216,20,20,1);

        pEndDraw();
        
        xFlip();
    }

    fFreeImage(img,1);
    fFreeImageFont(font);

    return(0);
}


interessant ist hier :

Quellcode

1
pInitDraw(xGetDevice(), 0)


das gehört zu der 2D engine-addon

und:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    if (!pStartDraw()) {
            MessageBoxA(NULL,"pStartDraw failure","Error",MB_OK);
            return(0);
        }
        pSetBlend(FI_ALPHABLEND);

        fDrawImage(img,200,200);
        fDrawText("Ìíîãà áóêàô",100,400);

        pDrawRect(180,180,20,20,1);
        pDrawRect(180,216,20,20,1);
        pDrawRect(216,180,20,20,1);
        pDrawRect(216,216,20,20,1);

        pEndDraw();
....ist der 2d engine addon code.


und FLIP(); ist wohl endscene, weil da alles geflippt wird.
allerdings weiter oben im code xRenderWorld(); rendert alles.

irgendwelche vorschläge?


[edit] würde es nicht reichen, wenn man in eine eigene engine einfach einen INIT befehl einbaut, der sich intern mittels getdevice die device holt, und in einem internen pointer speichert.
Und dann alles was es an funktionen gibt, die man einbauen möchte, eben zu dieser device schickt?

mehr nicht?

allerdings verstehe ich dann nicht, warum das addon ein startdraw enddraw in eben diese initgeschichte hat, ein einziger befehl würde doch reichen, oder?

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

22.04.2009, 09:43

Zitat von »"Helmut"«

Ähm, der Aufruf von GetDevice von der Engine wird wohl kaum den Besitz von dem Objekt auf dich übertragen. Freigeben musst du also nichts. [...]


Es sollte auf jeden Fall geprüft werden, ob nicht doch noch ein Release aufzurufen ist, sobald das Device nicht mehr benötigt wird. Ich würde zumindest von der xGetDevice-Funktion erwarten, dass sie den Referenzzähler der Device-Schnittstelle erhöht.

Zitat von »"Heiko"«

[...] allerdings verstehe ich dann nicht, warum das addon ein startdraw enddraw in eben diese initgeschichte hat, ein einziger befehl würde doch reichen, oder?


So ein "Rahmen" ist nie verkehrt. Mit dessen Hilfe lassen sich ganz wunderbar z.B. Render-States am Anfang individualisieren und am Ende wieder auf vorherige Werte zurücksetzen.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

Heiko

Frischling

  • »Heiko« ist der Autor dieses Themas

Beiträge: 19

Wohnort: @home

  • Private Nachricht senden

14

22.04.2009, 10:34

Zitat

Es sollte auf jeden Fall geprüft werden, ob nicht doch noch ein Release aufzurufen ist, sobald das Device nicht mehr benötigt wird. Ich würde zumindest von der xGetDevice-Funktion erwarten, dass sie den Referenzzähler der Device-Schnittstelle erhöht.


Zitat

So ein "Rahmen" ist nie verkehrt. Mit dessen Hilfe lassen sich ganz wunderbar z.B. Render-States am Anfang individualisieren und am Ende wieder auf vorherige Werte zurücksetzen.



könntest du das beides etwas näher erläutern?
steh da grad aufm schlauch...

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

15

23.04.2009, 09:32

Die Direct3D-Device-Schnittstellt erbt ja von IUnknown, der Basisklasse aller COM-Objekte. IUnknown bietet drei Methoden: AddRef, QueryInterface und Release. Jedes Objekt hinter der IUnknown-Schnittstelle führt einen internen Referenzzähler mit sich, der erhöht wird, sobald von einem Nutzer "Bedarf" an dem Objekt gemeldet wird. Wird das Objekt vom jeweiligen Nutzer nicht mehr benötigt, wird der Referenzzähler wieder verringert (per Release).

Beim Erzeugen des Objekts wird dieser Referenzzähler mit 1 initialisiert. Ein erfolgreicher Aufruf der Methode QueryInterface z.B. erhöht den internen Referenzzähler um 1. Per AddRef kann der Referenzzähler manuell erhöht werden. Mit Release wird das Objekt nicht unbedingt direkt zerstört, sondern nur der Referenzzähler um 1 verringert. Erreicht er den Wert 0, wird das Objekt zerstört.

Bei Texturen ist es bspw. so, dass wenn man die mit der Textur assoziierte Surface abfragt, der Referenzzähler der Surface erhöht wird, weil ein weiterer Nutzer "Bedarf" an diesem Objekt hat. Daher muss man auch ein Release der Surface-Schnittstelle aufrufen, damit das Objekt korrekt zerstört werden kann und nicht als Phantom im Speicher liegen bleibt. Auf der anderen Seite wird dadurch sichergestellt, dass das Objekt (in diesem Fall das Surface-Objekt) nicht zerstört wird, bevor der jeweilige Nutzer es wirklich nicht mehr braucht, was durch seinen individuellen Release-Aufruf mitgeteilt wird.

Ich würde also von einer xGetDevice-Funktion erwarten, dass sie per AddRef manuell den Referenzzähler des Device-Objekts erhöht. Sobald das Device-Objekt "extern" nicht mehr benötigt wird, muss dann halt Release aufgerufen werden, damit das Objekt zerstört werden kann. Zumindest spätestens dann, wenn die das Objekt verwaltende Engine ihrerseits Release aufruft.


Falls du nun beim Benutzen des abgefragten Device-Objekts irgendwelche Render-States änderst (z.B. deaktivierst du den Z-Test oder veränderst den Operator zur Alpha-Wert-Mischung), solltest du sie am Ende deines Zeichenvorgangs möglichst wieder auf die ursprünglichen Werte bzw. Standardwerte zurücksetzen. Da die Engine ja entsprechende Änderungen ihrerseits vorher nicht vorgenommen hat (setze ich für mein Beispiel jetzt voraus), geht sie womöglich davon aus, dass im nächsten Durchlauf immer noch die alten Render-States gesetzt sind. Sofern du also deine Änderungen am Ende deines Zeichenvorgangs nicht rückgängig machst, kann das dazu führen, dass die Darstellung der eigentlich korrekt funktionierenden Engine fehlerhaft erscheint. Durch einen "Rahmen" in Form von zwei Methoden "BeginDraw" und "EndDraw" oder ähnliches, kannst du also anfangs deine Änderungen vornehmen und am Ende wieder rückgängig machen.


Ich hoffe, ich habe mich jetzt nicht zu verwirrend ausgedrückt und es ist dir ein wenig deutlicher geworden.
Kommen Sie nie mit einem Schwert zu einer Schießerei.

Heiko

Frischling

  • »Heiko« ist der Autor dieses Themas

Beiträge: 19

Wohnort: @home

  • Private Nachricht senden

16

23.04.2009, 10:22

oh ja, das hab ich verstanden.war sehr gut erklärt.
Das mit dem Refernzzähler kann ich erfragen, aber was die "Rahmen" Funktionen betrifft, weiß ich momentan niht wirklich in code zu fassen.
Da wäre es schön zu wissen wie solche Funktionen aussehen müssten, um die states vorher zu speichern und hinterher wieder zurückzusetzen.
bzw. in einem beispielcode kommt vor dem einsatz der 2d engine ein xRenderWorld der 3D Engine, vielleicht erübrigt sich das dann schon.

Werbeanzeige