Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

problem ID3DXFont - DrawText (memory leak)

[es] :: 3D programiranje :: problem ID3DXFont - DrawText (memory leak)

[ Pregleda: 3302 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon problem ID3DXFont - DrawText (memory leak)09.03.2008. u 11:40 - pre 158 meseci
Danima pokusavam da napravim ticker kontrolu (DirectX9 SDK )
tj . prozor u kome je skrolujuci text . Medjutim kada stavim veliki font (>48) ili kad je text preko 30 karaktera ili ucitan preko RSS-a
DrawText metoda ID3DXFont klase jednostavno nedopustivo guta memoriju ...
Probao sam da optimizujuem stvar tako sto joj prosledjujem manje fragmente tj. slogove i to je za nijansu bolje ...
ID3DXFont jednostavno cache-ira bitmape odgovarajucih karaktera i ne uspe da u toku uzastopnih poziva (1ms) oslobodi resurse ..
Da napomenem koristim jednu instancu ID3DXFont-a u svojoj render() metodi ,...
Probao sam i da u svakom pozivu instanciram ID3DXFont i rezultati su drugaciji ..
CPU je skoro zakucan a memorija je OK .

A evo i jednog slicnog problema:
http://forums.microsoft.com/MS...spx?PostID=227431&SiteID=1

Ima li neko ideju ?

Code:

void Render()
{
    if( NULL == g_pd3dDevice )
        return;

    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );
    
   
  if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
  {
            
    RECT rc ; 
    SetRect( &rc, 0, 0, 0, 0 );        
    D3DXCOLOR clrText( 1.0f, 0.0f, 0.0f, 1.0f ) ; 
        
    g_pTextSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );

                        
    RECT rcClient ; 
    GetClientRect(m_hWnd,&rcClient) ; 
    if (g_pPosition.x + rcClient.right <= 0) 
        g_pPosition.x = rcClient.right + 10 ; //vrati text na pocetak tj. na desnu stranu 

    g_pPosition.x -= g_SpeedFactor[FAST][0] ; //brzina skrolovanja 
    rc.left = g_pPosition.x ; //nova pozicija texta 
    rc.top = g_pPosition.y ; 
             //ptInfo->szBuffer buffer u kome drzim manje slogove texta 

             g_pD3DFont->DrawText( NULL,ptInfo->szBuffer,-1, &rc, DT_CALCRECT, D3DCOLOR_XRGB(0,0,0));

    g_pD3DFont->DrawText( g_pTextSprite,ptInfo->szBuffer, -1,&rc, DT_NOCLIP, D3DCOLOR_XRGB(0,0,0));


    g_pTextSprite->End();

        
        g_pd3dDevice->EndScene();
    }

    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    
}


Viva lollapalooza
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: problem ID3DXFont - DrawText (memory leak)20.03.2008. u 17:50 - pre 157 meseci
Ehh. .. posle malo duzeg vremena da sam sebi odgovorim ....

Nikako ne instancirati ID3DXFont sa velicinom vecom od 48px jer onda visestruko zdere memoriju nego :
Code:

if (m_nFontSize > 48)
{
  D3DXMATRIX matScale ;
 
  //izracunati odnos 
  float cx,cy,cz ; 
  cx = cy = cz =(float)m_nFontSize / 48.0f) ; 
  
  //skalirati text sprite 
  D3DXScaleMatrix(&matScale,cx,cy,cz) ; 
  g_pTextSprite->SetTransform(&matScale) ;

  //ako je velicina prozora const onda napraviti pomeraj od pocetka skrolovanja .
 // (u ovom slucaju pocetak je donja ivica prozora)
   g_pPosition.y = rcClient.bottom / cx  ;
            
                               
}

Font ce posle transformacije biti losijeg kvaliteta ..ali iz realne perspektive se nece primecivati .

Druga stvar :
Premeriti slogove na pocetku ..pre prvog render metode jer ID3DXFont guta memoriju
cak i kad sam pozvao metodu DrawText sa flagom DT_CALCRECT koja ne bi trebalo nista da iscrtava nego da vraca RECT strukturu celog teksta ...
(moja zapazanja na XP-u i Visti .. probao sam i svezim SDK (summer 2007) funkcijama ID3DXFont::PreloadText koja bi trebalo da keshirane karaktere (bitmape)
prebaci u video memoriju i tako ubrza stvar al ja nisam primetio neki znacajnije poboljsanje ...
Za svaki slog posebno ( kod horizontalnog je jedna rec dok kod vertikalnog je jedan pasus )
Code:

SIZE MeasureString (LPCTSTR szText) 
{
SIZE sizeText = {0,0} ; 
CRect rcClient ; 
GetClientRect(&rcClient) ;
RECT rcText ; 
SetRect(&rcText,0,0,rcClient.right,0) ; //sirina teksta ne prelazi desnu stranicu 

if (SUCCEEDED(hr = g_pD3DMeasureFont->DrawText(NULL,szText,-1, &rcText, DT_CALCRECT | DT_WORDBREAK, D3DCOLOR_XRGB(0,0,0))); 
{
 sizeText.cx = rcText.right - rcText.left ; 
 sizeText.cy = rcText.bottom - rcText.top ; 
}

return sizeText ; 

}
.
.
.
 ///i na kraju obavezno 
g_pD3DMeasureFont->Release() ;



Viva lollapalooza
 
Odgovor na temu

Filip Strugar
Filip Strugar
Leamington Spa, UK

Član broj: 9871
Poruke: 383
..nge86-135.btcentralplus.com.

Sajt: www.rebellion.co.uk


+1 Profil

icon Re: problem ID3DXFont - DrawText (memory leak)21.03.2008. u 16:45 - pre 157 meseci
E, bas me interesuje, koliko je velik taj problem sa memorijom - koliko memorije ti ID3DXFont pojede u tom primeru? Onako odokativno, kilobajti, megabajti, gigabajti? :)

pozz!
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-a-1.sezampro.yu.



+395 Profil

icon Re: problem ID3DXFont - DrawText (memory leak)21.03.2008. u 22:27 - pre 157 meseci
Reci cu ti precizno a ne odokativno jer sam task manager neprekidno drzao otvorenim ...
Za fontove vece od 48 i za string koji ima vise od 1000 karaktera (npr. http://www.b92.net/info/rss/sport.xml)
uzme od 150 - 200 MB-a sto je stvarno i za danasnje uslove (uglavnom sve malko ozbiljnije masine danas imaju 512MB-a)
neprihvatljivo za jedan obicni ticker,jer cu na frame-u mozda imati jos niz drugih objekata (ActiveX Flash ,Directshow media player itd.. )
dok sa manjim fontom od 48 ili vecim al skaliranim izadje na 20-25 MB-a..
Dosta sam i vremena izgubio guglajuci i video sam dosta price na tu temu.
Mnoge firme koje se bave gamedev-om koriste custom-made biblioteke za dynamic text ako su performanse kriticne itd ....
i sve se svodi na jedno :ID3DXFont je super ali ne i savrsen .
Uostalom mozes i sam da napravis jednostavan primer (SDK samples) i da se uveris

pozz i tebi ...
hvala bogu da je neko nesto odgovorio ili prokomentarisao :)

Viva lollapalooza
 
Odgovor na temu

Filip Strugar
Filip Strugar
Leamington Spa, UK

Član broj: 9871
Poruke: 383
..nge86-141.btcentralplus.com.

Sajt: www.rebellion.co.uk


+1 Profil

icon Re: problem ID3DXFont - DrawText (memory leak)23.03.2008. u 10:39 - pre 157 meseci
Citat:
deerbeer:Uostalom mozes i sam da napravis jednostavan primer (SDK samples) i da se uveris

Ma verujem ti da problem postoji (video sam i onaj link i discussion na tu temu), samo me zanimalo tacno koliki je a da ne moram da proveravam :)

U covece, pa to je bas mnogo!!

Kao sto kazes, svi ionako koriste svoje implementacije kada su performanse bitne...

Pa, srecno sa projektom!
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.midsouth.biz.rr.com.



+18 Profil

icon Re: problem ID3DXFont - DrawText (memory leak)14.05.2008. u 19:39 - pre 155 meseci
Ono sto se desava je da D3DX alocira kvadratnu teksturu koja je dovoljno velika da sadrzi najduzu rec u stringu koju renderujes. Znaci font 64x64 sa maksimalnom duznim reci od 30 karaktera moze da pojede par megabajta memorije.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: problem ID3DXFont - DrawText (memory leak)16.05.2008. u 12:36 - pre 155 meseci
Citat:
Reljam: Ono sto se desava je da D3DX alocira kvadratnu teksturu koja je dovoljno velika da sadrzi najduzu rec u stringu koju renderujes. Znaci font 64x64 sa maksimalnom duznim reci od 30 karaktera moze da pojede par megabajta memorije.


Naravno ... al dosta zavisi od statistike reci i karaktera koji se pojavljuju tj. renderuju ..
Jer kad stavim recimo :
string koji ima 1000 X "A" D3DX keshira kvadratnu teksturu i samo ga ponavlja(ne alocira novu teksturu) pa samim tim performanse su OK ...
Viva lollapalooza
 
Odgovor na temu

[es] :: 3D programiranje :: problem ID3DXFont - DrawText (memory leak)

[ Pregleda: 3302 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.