Windows StretchDIBits ist langsam.



  • Mit dem folgenden Code

    internal void Win32_DrawDisplayBuffer(win32_displaybuffer *SourceDisplayBuffer, HWND WindowHandle)
    {
    	HDC WindowDeviceContext = GetDC(WindowHandle);
    	RECT WindowClientRect;
    	GetClientRect(WindowHandle, &WindowClientRect);
    	StretchDIBits(WindowDeviceContext,
    				  0, 0, WindowClientRect.right - WindowClientRect.left, WindowClientRect.bottom - WindowClientRect.top,
    				  0, 0, SourceBuffer->Width, SourceDisplayBuffer->Height,
    				  SourceDisplayBuffer->BitmapMemory, &SourceDisplayBuffer->BitmapInfo,
    				  DIB_RGB_COLORS, SRCCOPY);
    	ReleaseDC(WindowHandle, WindowDeviceContext);
    }
    

    Übertrage ich eine zuvor gerenderte Bitmap auf mein Fenster. Die übergebene Struktur enthält dabei einen Zeiger auf den Speicher, in dem die Bitmap gespeichert ist und eine BitmapInfo Struktur.

    Das Problem dabei ist, dass

    StretchDIBits()
    

    ca. 3-4 Millisekunden benötigt, um die Bitmap zu kopieren. Das ist dreimal so viel Zeit, wie ich benötige, um die Bitmap zuvor in einer nicht parallelisierten Schleife Pixel für Pixel zu füllen (z.B. alle Pixel mit der gleichen Farbe, aber jeden Pixel einzeln).



  • Wie ist das Format der DIB/wie baust du die DIB zusammen?
    Warum übergibst du DIB_RGB_COLORS? (Verwendest du wirklich ne Palette?)

    Und warum übergibst du TargetDisplayBuffer->Width aber SourceDisplayBuffer->Height?



  • TargetDisplayBuffer->BitmapInfo.bmiHeader.biSize = sizeof(TargetDisplayBuffer->BitmapInfo.bmiHeader);
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biBitCount = 32;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biCompression = BI_RGB;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biClrImportant = 0;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biClrUsed = 0;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biHeight = -Height;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biWidth = Width;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biPlanes = 1;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biSizeImage = 0;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biXPelsPerMeter = 0;
    	TargetDisplayBuffer->BitmapInfo.bmiHeader.biYPelsPerMeter = 0;
    
    	TargetDisplayBuffer->Height = Height;
    	TargetDisplayBuffer->Width = Width;
    
    	TargetDisplayBuffer->BytesPerPixel = 4;
    
    	TargetDisplayBuffer->Pitch = TargetDisplayBuffer->Width*TargetDisplayBuffer->BytesPerPixel;
    
    	TargetDisplayBuffer->BitmapMemory = VirtualAlloc(0, Width*Height * TargetDisplayBuffer->BytesPerPixel, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    

    Erstellt die Bitmap.

    DIB_RGB_COLORS
    

    bedeutet laut MSDN "The color table contains literal RGB values." wärend

    DIB_PAL_COLORS
    

    "The array contains 16-bit indexes into the logical palette of the source device context" bedeutet.



  • Hm. Sieht soweit alles gut aus.


Log in to reply