DX7 VC++6 Slow Alpha Blending

Started by
4 comments, last by Matias Goldberg 11 years, 8 months ago
Limitations: VC++ 6 and DX7

FPS = 60 (Dither)
FPS drops significantly when rendering Alpha Blended Text

Any Ideas?


Code as below.

Called to draw surface with Alpha Blend

// Alpha mode

DXDraw::RGBMASK mask = DXDraw::GetInstance()->GetRGBmask();
DWORD r, g, b, color;

// Render a alpha blended
for( int y = rc.top; y < rc.bottom; y++ )
{
for( int x = 0; x < rc.right; x++ )
{
color = pDestStart[ x ];
MergeColor( pimpl->backgroundColor, color );
pDestStart[ x ] = color;
}
pDestStart += pitch;
}


Merge Color Code

// Add the color 1 with the second and divide the result by 2
#define MergeColor( clr1, clr2 )\
r = ( ( clr1 & mask.rMask ) + ( clr2 & mask.rMask ) ) >> 1;\
g = ( ( clr1 & mask.gMask ) + ( clr2 & mask.gMask ) ) >> 1;\
b = ( ( clr1 & mask.bMask ) + ( clr2 & mask.bMask ) ) >> 1;\
color = ( r & mask.rMask ) | ( g & mask.gMask ) | ( b & mask.bMask );
Advertisement

Any Ideas?

Get a real compiler, and preferably also use a more up-to-date API? The more up-to-date API is strongly recommended, but unless you have some very good reason to do otherwise a more up-to-date compiler is practically mandatory. The Visual C++ 6 compiler is over 10 years old and actually pre-dates standardisation of the C++ language -- it's so old it's not even technically a real C++ compiler. DirectX 7 was also last updated and replaced by DirectX 8 over 10 years ago.

More modern versions are freely available even for commercial usage. You could consider a Visual Studio Express Edition, Code::Blocks, or QtCreator.


So, before we try to offer further help that might be trivially invalidated by updating to non-ancient tools and a more modern API, why do you think you need to stick with VC++6 and DirectX7?

- Jason Astle-Adams

Is that Direct Draw? If so, reading kills your performance. You might be faster if you completely draw your surface into a memory buffer (with alpha) and do a full blit to the primary surface once you're done.


And additionally, what jbadams said ;)

Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>


why do you think you need to stick with VC++6 and DirectX7?


perhaps he is maintaining some VERY old code that will generate thousands of errors if put through a modern compiler and a 1 line fix in the original environment would be faster than fix 6 thousands errors and then still be confronted with the original error in a new ecosystem.

If that's the case I sympathise for him rolleyes.gif but my directdraw is a bit rusty biggrin.png

If that's not the case.. yahh, get a real compiler and api.

Stefano Casillo
TWITTER: [twitter]KunosStefano[/twitter]
AssettoCorsa - netKar PRO - Kunos Simulazioni

Please note that I've split off an off-topic discussion of continued usage of Visual C++ 6 into a new topic: "Using Visual C++ 6". Please keep this discussion on topic from this point onwards.

- Jason Astle-Adams

Looks like you're emulating alpha blending by doing doing it on your own directly on the back buffer. You should check if the Driver supports hardware alpha blending (blit) and use that instead (Look the API documentation on how to that, there were plenty of examples in the DX7 SDK).
You may need to attach an 8-bit alpha surface in order to get smooth alpha blending with a 16-bit image (I assume you're using 16-bit because you said you were using dithering).

Emulation will slowdown your application badly because you're reading from GPU memory and then sending it back.
If you're forced to emulation (that would be a very ancient card, like, a 1995 video card) may be requesting the back buffer to be stored in local memory rather than hardware memory could help. Can't remember if that was possible though (was it called system memory rather than local memory?).

This topic is closed to new replies.

Advertisement