[ deerbeer @ 09.03.2008. 11:40 ] @
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 );
    
}

[ deerbeer @ 20.03.2008. 17:50 ] @
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() ;


[ Filip Strugar @ 21.03.2008. 16:45 ] @
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!
[ deerbeer @ 21.03.2008. 22:27 ] @
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 :)
[ Filip Strugar @ 23.03.2008. 10:39 ] @
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!
[ Reljam @ 14.05.2008. 19:39 ] @
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.
[ deerbeer @ 16.05.2008. 12:36 ] @
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 ...