Surfaces



  • hi leute,

    wieviel surfaces kann man eigentlich bei directx erstellen? ich habe momentan das problem das ich irgendwann, wenn ich schon einige erstellt habe (viele) eine meldung das er eine datei nicht finden kann die ich laden moechte, bmp-datei.
    hat jemand ne ahnung? ich schreibe in den systemmemory

    gruss
    msp


  • Mod

    soviel bis deine resourcen (handles/ram) verbraucht sind. das hängt vom system und OS ab (win9x kann wohl max 16k handles)

    rapso->greets();



  • msp schrieb:

    wieviel surfaces kann man eigentlich bei directx erstellen? ich habe momentan das problem das ich irgendwann, wenn ich schon einige erstellt habe (viele) eine meldung das er eine datei nicht finden kann

    Wo ist der Zusammenhang?

    Bye, TGGC \-/



  • ich nochmal,

    also habe festgestellt das ich ca. 4110 mal mit der funktion DDLoadBitmap(..) aus der DDUTIL.CPP ein ein bzw mehrere bitmaps laden kann. danach bricht er ab und sagt mir das er eine ressource, sprich ein bild, nicht finden kann obwohl er das schon mal gefunden hat, soll heissen, es ist da. die funktion GetLastError() liefert mir den wert 0 zurueck.
    arbeiten tue ich unter win2000 512 mb ram, 64 mb grafik.
    wer noch en idee hat, waere schoen wenn er die hier praesentieren wuerde.

    danke.
    msp



  • Hmmm..also ich kann mehr als 50000 Bilder Laden...weiss auch nicht genau woran das liegt. Wenn du es nicht schon machst, dann probiere mal, wenn der VideoMem alle ist, automatisch deine Surfaces im RAM zuerstellen. Vielleicht klappts dann.

    IDirectDrawSurface7* DtzEngine::DDLoadBitmap(IDirectDraw7 *lpdd, LPCSTR szBitmap, int dx, int dy, bool videoMemory)
    {
        HBITMAP                 hbm;
        BITMAP                  bm;
        DDSURFACEDESC2          ddsd;
        IDirectDrawSurface7    *lpdds;
    
        hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx,
                                  dy, LR_CREATEDIBSECTION);
        if (hbm == NULL)
            hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy,
                                      LR_LOADFROMFILE | LR_CREATEDIBSECTION);
        if (hbm == NULL)
    	return NULL;
    
        GetObject(hbm, sizeof(bm), &bm);
    
        ZeroMemory(&ddsd, sizeof(ddsd));
        ddsd.dwSize = sizeof(ddsd);
        ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
    
        if (videoMemory==true)
    		ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
        else
    		ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
    
    	ddsd.dwWidth = bm.bmWidth;
        ddsd.dwHeight = bm.bmHeight;
    
    	if (lpdd->CreateSurface(&ddsd, &lpdds, NULL) != DD_OK)
    	{
    		if (videoMemory==true)
    		{
    			ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;	
    			if (lpdd->CreateSurface(&ddsd, &lpdds, NULL) != DD_OK)
    			{
    
    	 			return (NULL);
    			}
    		}
            else
    		{
    			ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
    			if (lpdd->CreateSurface(&ddsd, &lpdds, NULL) != DD_OK)
    			{
    
    				return (NULL);
    			}
    		}
    
    	}
    
    	if (DDCopyBitmap(lpdds, hbm, 0, 0, 0, 0)!=0)
    	{
    		DeleteObject(hbm);
    		return lpdds;
    	}
        else
    	{
    		DeleteObject(hbm);
    		return NULL;
    	}
    }
    


  • hi,

    die idee ist sehr gut. habe mich jetzt aber schon mit optimierung des bilderladens beschaeftigt. bisher geht alles wunderbar ohne probleme. aber deine idee fasse ich natuerlich auf, gibt ja rechner die nicht viel videoram haben, wie mein p100 zb 🙂

    danke. gute idee

    msp


Log in to reply