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

1

10.02.2008, 19:45

Soundbuffer löschen

Hallo,
wie kann man einen Soundbuffer (mit LPDIRECTSOUNDBUFFER erstellt) wieder löschen??
mit

C-/C++-Quelltext

1
dsbSound->Release();
wird er ja nicht aus dem RAM entfernt..

Macht man das so?

C-/C++-Quelltext

1
delete dsbSound;


Das Problem ist, wenn ich nur Release() verwende, füllt sich der Ram immer weiter (von 6MB auf 50MB innerhalb 30sec.). Komisch ist: Wenn ich das Fenster minimiere und dann wiederherstelle, sind es wieder nur 6MB ramverbrauch

Ich arbeite übrigens mit VC++ 2005 unter WinXP mit DirectSound..

MfG,
Max

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

2

11.02.2008, 08:36

Zitat

(mit LPDIRECTSOUNDBUFFER erstellt)


? :? LPDIRECTSOUNDBUFFER is doch n Format... aber mal angenommen du hast nen LPDIRECTSOUNDBUFFER* dann hast du doch irgendwo malloc(numBytes) aufgerufen um ihn zu füllen? also musst du entsprechend wieder free(Buffer) aufrufen um ihn freizugeben ;)

Jede Speicherallocierungsfunktion hat eben seine Gegenfunktion:

new -> delete
new[] -> delete[]
malloc() -> free()
...

das du vorm Freigeben noch was aufrufen müsstest wär mir nicht bekannt... du solltest deinen Buffer aber besser vorher stoppen falls du ihn auf play gestetzt hast :idea:
Hältst du nicht den Bug in Ehren, wird er dich noch manches Lehren.

Ein Gespräch setzt voraus, dass der andere Recht haben könnte.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

11.02.2008, 11:46

Release ist richtig, wie jedes com-objekt aus directx.

4

12.02.2008, 20:02

Danke für die Antworten!

Ich bin nicht sicher wo genau eigentlich dieses Speicherleck herkommt.
Zunächst erstelle ich mit DirectSoundCreate das DS Objekt und weise SetCooperativeLevel DSSCL_NORMAL zu.
Jedesmal, wenn ein Sound abgespielt werden soll rufe ich folgenden Code auf:
(ich habe ein Array von 10 Soundbuffern, übergeben wird iSoundBuffer und Filename)

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
//Global:

LPDIRECTSOUNDBUFFER dsbSound[9];
//in Funktion:

    if (dsbSound[iSoundBuffer] != NULL) {
        dsbSound[iSoundBuffer]->Release();
        dsbSound[iSoundBuffer] = NULL;
    }

    hWaveData = mmioOpen(Filename, 0, MMIO_READ | MMIO_ALLOCBUF);

    if (hWaveData == NULL) return -6;

    MMCKINFO parent;
    memset(&parent, 0, sizeof(MMCKINFO));
    parent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
    mmioDescend(hWaveData, &parent, 0, MMIO_FINDRIFF);

    MMCKINFO child;
    memset(&child, 0, sizeof(MMCKINFO));
    child.fccType = mmioFOURCC('f', 'm', 't', ' ');
    mmioDescend(hWaveData, &child, &parent, 0);

    WAVEFORMATEX wavefmt;
    mmioRead(hWaveData, (char*)&wavefmt, sizeof(wavefmt));
    if (wavefmt.wFormatTag != WAVE_FORMAT_PCM) return -7;

    mmioAscend(hWaveData, &child, 0);
    child.ckid = mmioFOURCC('d', 'a', 't', 'a');
    mmioDescend(hWaveData, &child, &parent, MMIO_FINDCHUNK);

    DSBUFFERDESC bufdesc;
    memset(&bufdesc, 0, sizeof(DSBUFFERDESC));
    bufdesc.dwSize = sizeof(DSBUFFERDESC);

    bufdesc.dwFlags = DSBCAPS_GLOBALFOCUS;
    bufdesc.dwBufferBytes = child.cksize;
    bufdesc.lpwfxFormat = &wavefmt;
    if((lpDirectSound->CreateSoundBuffer(&bufdesc, &dsbSound[iSoundBuffer], NULL)) != DS_OK) return -8;

    void *write1 = 0, *write2 = 0;
    unsigned long length1, length2;
    dsbSound[iSoundBuffer]->Lock(0, child.cksize, &write1, &length1, &write2, &length2, 0);
    if (write1 > 0)
        mmioRead(hWaveData, (char*)write1, length1);
    if (write2 > 0)
        mmioRead(hWaveData, (char*)write2, length2);
    dsbSound[iSoundBuffer]->Unlock(write1, length1, write2, length2);

    mmioClose(hWaveData, 0);

    dsbSound[iSoundBuffer]->SetCurrentPosition(0);
    dsbSound[iSoundBuffer]->Play(0, 0, 0);


Mir ist außerdem gekommen, dass es wohl sinnvoller ist, von jeder Sounddatei zu Beginn mehrere Buffer zu erstellen,
sodass beim Abspielen nur ein gerade nicht-spielender Buffer genommen wird, anstatt die Wavedatei jedesmal einzulesen.

Das ist jetzt villeicht etwas verwirrend, aber eine konkrete Frage habe ich: Muss man einen Soundbuffer, der mit Release() zunichte gemacht wurde, noch irgendwie löschen, oder ist das bereits von Release() übernommen worden?

MfG,
Max

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

5

12.02.2008, 20:16

Nein. Man muss ihn nicht löschen.(Wie auch schon TrommlBomml sagte):

Zitat

Release ist richtig, wie jedes com-objekt aus directx.

Außerdem ist ein Speicherleck nur dann ein Speicherleck, wenn es nach dem Beenden des Programmes noch da ist.
Signaturen werden überbewertet

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

12.02.2008, 22:04

Zitat von »"GR-PA"«

Nein. Man muss ihn nicht löschen.(Wie auch schon TrommlBomml sagte):

Zitat

Release ist richtig, wie jedes com-objekt aus directx.

Außerdem ist ein Speicherleck nur dann ein Speicherleck, wenn es nach dem Beenden des Programmes noch da ist.


Naja, da bin ich anderer Meinung.
Stell dir mal vor, wenn du in deinem Spiel jede Minute 1000 Objekte erstellt und zerstört werden. Wenn die dann nicht richtig freigegeben werden ist das für mich ein Speicherleck, da der RAM sich dann einfach füllt, ohne freigegeben zu werden. Das kann sich ja noch nachteilig auswirken.

Anderseits habe ich die Erfahrung gemacht, dass wenn ich ein Speicherleck "erzwinge" (habe ich mal mit Absicht gemacht), dass es nach dem Programmende alles wieder freigegeben worden ist. Weiss jetzt aber nicht, ob das nur in einem bestimmten Modus von VC geht.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

13.02.2008, 08:02

Gilt immer, aber wenn ihr wissen wollt was ihr da für dreck hinterlasst:
http://msdn2.microsoft.com/en-us/library/5at7yxcs(VS.71).aspx
oder einfach

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define MY_DEBUGNEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define MY_DEBUGNEW new
#endif
[...]
#define new MY_DEBUGNEW
[...]
#ifdef _CRTDBG_MAP_ALLOC
   _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
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.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

8

13.02.2008, 16:32

Hmm, das klingt interessant.

Werde ich gleich Heute mal noch testen. ;)

Wenn ich mich recht erinnere, gibt es ja auch noch diverse Tools, um solche Lecks zu finden. Was benutzt du/ihr so?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

13.02.2008, 17:17

das würde mich auch mal reizen, nur so aus reiner neugier wie sauber meine progs sind!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

13.02.2008, 19:34

Also ich nutze das, was ich da oben gepostet habe.
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.

Werbeanzeige