Promit's Ventspace

August 19, 2009

Windows API Code Pack — Is It Any Good?

Filed under: Software Engineering — Promit @ 3:35 pm
Tags: , , , ,

Just to be clear, I’m restricting my comments to the DirectX section of the codepack. I’ll probably be integrating some of the other bits (jump list support etc) into SlimTune, so we’ll see how that goes later. But around a week ago, they finally released 1.0. Same day as Windows 7 was out on MSDN actually — I’m pretty sure that’s not a coincidence. SlimDX’s release with Direct3D 11, Direct2D, and DirectWrite should come later this month, if all goes well. Now, the code pack does cover a few things we don’t, like the Windows Imaging Component.

So it’s not beta anymore. Now, I’m fairly sure that they haven’t looked at our code for legal reasons, but I did make some harsh comments about their work. They’ve made some changes that seem to follow directly from those comments. I’m about to make some more. I’ve been perusing the release and frankly, it’s just not any good. They seem to have spent most of their time implementing equally shoddy support for D3D 10 than fixing the actual problems. I’m going to run through all the reasons I see that this thing is not well done.

Okay, so they added a math library. I very pointedly slammed them for not having one in the 0.90 release, so let’s start with the bread and butter of graphics — Vector3F, as it’s called in the Code Pack. It offers X, Y, Z, Normalize, NormalizeInPlace, static Dot, static Cross, operator +, operator -, and (in)equality comparisons. Yes, that’s the entire class. No ref overloads, which are important for performance. No other helper methods of any kind. No PropertyGrid or System.ComponentModel compatibility. Matrix is even sadder — it has operator * (by-value only) and Identity. That’s it. Compare to ours, or XNA.

Functions that return object references still create brand new instances, which then not only have to be garbage collected, but if you don’t remember to Dispose them, they’ll be queued for finalization too. (These USED to be properties…it’s an improvement, I guess.) This is a similar effect to the original MDX’s event problems, just smeared out over time and difficult to track. There’s certainly no leak tracking functionality like SlimDX has. (OTOH they will be released eventually, which SlimDX does not promise.) These are lots of small allocations, which the .NET GC is good at handling, but if you don’t remember to Dispose them, or have a lot of them in general, this could really sour your day. It’s a problem that just doesn’t exist in SlimDX.

As for 64 bit support, it’s simply not configured at all in the solution (remember, the code pack is source code only, no binaries). I set up and ran an x64 build that went off without a hitch, and there’s no inherent reason for x64 to not work. I haven’t tested it though, and neither has anyone else apparently.

Lastly, even though they’ve added D3D 10 support, there’s no D3DX support in here at all. They basically invite you to go ahead and write what you need yourself, but none of it is done for you. For something that’s intended to make your job easier by letting you use managed code, this is another odd omission.

The 1.0 of the code pack IS dramatically improved in several respects — 0.90 had no math code at all, the memory situation was far worse, etc. Even so, this really doesn’t inspire a lot of confidence. Although the core APIs are wrapped, the support code is basically non-existent. There’s no binary distribution or redistributable, so you’re on your own there. I know this is probably a small team at Microsoft with nowhere near the level of resources it needs, and I’m sorry that I’m continually trashing your work. But if this is what constitutes the successor to Managed DirectX, I don’t think SlimDX is in any danger and I can’t say I mind.

4 Comments »

  1. well sumabish. I downloaded it expecting to try it out over the weekend, because there really are some great things in the Windows API that aren’t readily accessible from .NET, but never got around to it (beer called). I guess I’ll stick to C++/CLI wrappers and COM interop.

    Comment by Sean T. McBeth — August 21, 2009 @ 7:46 am | Reply

    • Well I am commenting ONLY on the DirectX bits (which are more complex than your standard WinAPI interop). I haven’t taken a good look at the rest of the code, which I actually suspect is alright.

      Comment by Promit — August 21, 2009 @ 9:00 am | Reply

  2. “… even though they’ve added D3D 10 support, there’s no D3DX support in here at all …”

    First please help me learn the meaning of this statement. Do you mean that there is no support for DirectDraw, DirectMusic, DirectPlay, DirectSound etc?

    As someone new to the graphics programming thing, I have downloaded and tried both SlimDX as well as the Code Pack. Neither package has sufficient documentation and tutorials to guide the new user. I have enjoyed my learning experience with SlimDX. The advantage I see over the Code Pack is that they give you a finished product whereas in code pack you ahve to do the compiling and arrangement yourself. But I really like their examples and would like to see SlimDX implement stuff like interop as you plan to.

    Comment by oafak — September 25, 2009 @ 3:00 am | Reply

    • Those APIs are all very deprecated at this point. The code pack has Direct3D and the new APIs: Direct2D and DirectWrite.

      Comment by Promit — September 25, 2009 @ 7:47 am | Reply


RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

%d bloggers like this: