Jump to content

  • Log In with Google      Sign In   
  • Create Account


We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.

Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!

DX7 VC++6 Slow Alpha Blending

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 edb6377   Members   -  Reputation: 118


Posted 06 August 2012 - 06:34 PM

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 );

Edited by edb6377, 06 August 2012 - 06:35 PM.


#2 jbadams   Senior Staff   -  Reputation: 19409


Posted 06 August 2012 - 09:24 PM

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?

#3 Endurion   Crossbones+   -  Reputation: 3687


Posted 06 August 2012 - 10:45 PM

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>

#4 kunos   Crossbones+   -  Reputation: 2207


Posted 07 August 2012 - 12:40 AM

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 Posted Image but my directdraw is a bit rusty Posted Image

If that's not the case.. yahh, get a real compiler and api.
Stefano Casillo
Lead Programmer
TWITTER: @KunosStefano
AssettoCorsa - netKar PRO - Kunos Simulazioni

#5 jbadams   Senior Staff   -  Reputation: 19409


Posted 07 August 2012 - 03:57 AM

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.

#6 Matias Goldberg   Crossbones+   -  Reputation: 3713


Posted 07 August 2012 - 12:20 PM

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?).

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.