Direct X 11 really worth it?

Started by
25 comments, last by MJP 10 years, 2 months ago

I'm in a pretty similar dilemma or even trilemma. I have a DX9.0 engine and when I see where Microsoft is going with DX 11+ I don't like it. They made that thing in the past - DX10 was exclusive to Vista and Win7, now DX11.2 is exclusive to Win8.1 and so on. I had a WinXP box and I was stuck to develop with DX9. Than I started to look in OpenGL direction, where I could use the latest version on WinXP.

I'm thinking about these things lately :

1. Is OpenGL in general(including OpenGL ES) is worth learning more than DX in the long run.

2. Is OpenGL game "market share" is growing ? How many devices and platforms I can target, if I invest time in learning OpenGL-like APIs. PlayStation 3/PS4, WebGL, Android, iOS, Linux, Mac and of course all versions of Windows ?

3. Is SteamOS and SteamBox, really going to affect the PC game market in favour to Linux and OpenGL ?

As a small indie developer, I need to know what is worth learning and what is going to fade in the future. I don't know exactly what platform I'm going to target in the long run.

Now I'm making a Windows game, tomorrow I could be making an iOS or Android game, or even a PS4 game. If I'm proficient in OpenGL style of programming can I be more competitive and flexible to jump between platforms.

Is sticking to DX11 ( and Win7/8 and eventually XBOX) is going to give me more than sticking to OpenGL 4+ and other OpenGL's to cover all the other platforms ?

At the moment I'm making a series of tools that I need in OGL. However, from time to time I add more bits to the game - which I've structured in the following way:

----------------------------- ---------------------- --------------

| | | | | |

| Winmain() creates a new | | | | |

| CWindow object which | | | | |

| is responsible for window | -> | Generic game code, | -> | OGL render |

| creation and converting | | which interacts | | functions |

| user input to a generic | | with -> | | |

| format, which is sent | | | | |

| to -> | | | | |

| | | | | |

----------------------------- ---------------------- --------------

The beauty of this structure is that I can create a WinRT/D3D11 version simply by replacing the first and last boxes above, which will account for a tiny fraction of the code base. I could also extend this further to run on Linux/OSX if I so desired.

The whole notion of either/or becomes moot with the above as I can target any platform/API - I'll simply extend the code as I see fit.

Advertisement

D3D11 works on Vista as well, as long as they have the proper platform update. It's actually possible to query for the required update and prompt a download/install from Windows Update, at least if you're proficient at making installers.

Purely in terms of being a graphics API, I would say D3D11 is unquestionably better than D3D9. It's cleaner, leaner, and let's make use of newer hardware capabilities. Will that actually matter for your game? It depends on what kinds of game you're making, but in general the graphics API isn't going to become a limiting factor until you start having a really sophisticated level of graphics tech. If you want bleeding-edge graphics, then yes you want D3D11. If you want sprites or rudimentary 3D, the API isn't going to be that important.

Either way I would recommend checking out the latest Steam and Unity hardware surveys so that you can make an informed decision regarding the baseline hardware and OS that your game will support.

That dilemma is what keeps developers(like me) from actually creating the engine. When I would have finished writing the engine in DirectX11, DirectX12 will be the cutting edge. So unless Windows 8 and Xbox One doesn't support DirectX9(which it does), I perceive no reason why I should aim at the latest instalment of DirectX, taking into consideration also that my graphic demands are minimal(2D texture billboard-heavy).

I am talking about building an indie game from it, not an engine competing with Unity or UDK.

Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.

Since Direct X 11.2 will be Windows 8.1 and Xbox One exclusive, and only Windows 7 and 8 benefit from Direct X 11, is there a significant possibility that Microsoft is doing the same mistake that happened with Vista(most game developers sticked with Direct X 9)?

Is it really worth the effort to develop with Direct X 11 as an indie developer?

Depends on your game and target market. I would realistically limit your options to either D3D11 or OpenGL; D3D9 is a dead, legacy API for a legacy platform.

In terms of learning graphics, I recommend starting with D3D11. It more closely matches real hardware and will all but force you do "do things right" unlike OpenGL which still results in goofy questions around the Web debating the merit of vertex arrays vs vertex buffers or performance concerns with glBegin or whatnot.

If you are targeting parts of the world outside of NA and western EU, you'll find that pirated XP is still the most common OS (though it's shifting towards pirated Win7). If you are targeting Mac and Linux you're forced to use GL and not D3D. If you research the target markets for your game you may find that supporting China or Mac users may be important to your bottom line. GL is the better choice for portability as it is supported by XP, OSX, Linux, and most mobile platforms.

Assuming you are sticking with NA and EU as your target markets and don't think you need non-Windows support, however, stats do seem to indicate that D3D11 has sufficient penetration in the market and is safe to depend on with relatively minor lost sales opportunity.

Even if you do think you need the portability you can make a strong argument for building your game with D3D11 initially and porting to GL afterwards. D3D11 is easier to work with in modern usage (old-style GL is clearly easiest, but it's deprecated for very good reasons), D3D drivers tend to be less buggy, and Microsoft's dev tools are significantly better than anything I've ever seen for GL, making it much easier to get your game up and running with D3D11 than it is in GL especially if you're doing anything even remotely advanced.

The key point to take away from all this is to research your target market. My opinions on APIs or research done for my own products are not necessarily relevant to you and you should not bet the success of your game on feedback from strangers on the Internet.

I have read an interesting blog post from a respectable German developer, where he specifies that DirectX11 all together is not so relevant for reaching huge audiences(the emerging Chinese, Indian and middle-eastern).

Also, Microsoft itself specifies that DirectX9 is the version to develop with for maximum compatibility.

Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.


Purely in terms of being a graphics API, I would say D3D11 is unquestionably better than D3D9. It's cleaner, leaner, and let's make use of newer hardware capabilities. Will that actually matter for your game? It depends on what kinds of game you're making, but in general the graphics API isn't going to become a limiting factor until you start having a really sophisticated level of graphics tech. If you want bleeding-edge graphics, then yes you want D3D11. If you want sprites or rudimentary 3D, the API isn't going to be that important.

Hi, may I ask which hardware capabilities supported by D3D11 (besides Tesselation) are the most important for modern 3D games in your opinion? Or, put it another way, what supported hardware features does a modern 3D game benefit most from when using D3D11 compared to D3D9?

Compute shaders is the big one. Combines with the ability for arbitrary read access from buffers and textures, it opens to door to all kinds of new techniques. We haven't even really scratched the surface of what's possible with compute. Other notable mentions:

  • Access to MSAA data
  • Access to depth buffers (possible in D3D9 through driver hacks)
  • Better instancing support (you can access arbitrary buffers now in vertex shaders, which makes instancing much more powerful)
  • Constant buffers (reduces CPU overhead)
  • Up to 128 textures
  • Decoupled textures and sampler states
  • Integer math in shaders

How many devices and platforms I can target, if I invest time in learning OpenGL-like APIs. PlayStation 3/PS4, WebGL, Android, iOS, Linux, Mac and of course all versions of Windows ?

Not to disagree with your other points (tying D3D to Windows upgrades *is* stupid) -- but I would not call GCM/GCX OpenGL-like in the slightest. If you're porting to PS4, you're learning a new/different API, that's probably closest to Mantle, then D3D11, then GL4.
Which brings up another point -- if you're an indie with no time for porting/implementing these kinds of systems, you should probably pay someone else to via licensing an engine. Otherwise, if you're going to commit to implementing your own graphics engine, you're going to have to learn the concepts behind all the APIs, and you will have to learn how to use those concepts on multiple APIs -- even if that just means the GLES2, WebGL, GL2.1, GL3, and GL4 ways of doing things! ;-)
If you've come that far, then doing a port to PS4/GCX should only be a very small amount of work, because you've already practiced how to implement the same concepts on five different APIs already! ;-)

How many devices and platforms I can target, if I invest time in learning OpenGL-like APIs. PlayStation 3/PS4, WebGL, Android, iOS, Linux, Mac and of course all versions of Windows ?

Not to disagree with your other points (tying D3D to Windows upgrades *is* stupid) -- but I would not call GCM/GCX OpenGL-like in the slightest. If you're porting to PS4, you're learning a new/different API, that's probably closest to Mantle, then D3D11, then GL4.

I meant using PSGL which is OpenGL ES 1(.1) compilant + support for vertex array objects and nVidia Cg shaders. So for example, if I decide to use OpenGL ES 1.0, I cant target Windows all versions, Web browsers all versions(WebGL) ( even IE maybe), iOS, Android, Linux, Mac and PlayStation 3(throught PSGL, though I heard of it's terible performance).

APIs -- even if that just means the GLES2, WebGL, GL2.1, GL3, and GL4 ways of doing things! ;-)

DX9, DX10, DX11 also have differences in implemenation.

@

mark ds

Yep, I'm trying to make such a framework too, but then it comes the language difference... For example, for some of the platforms you use Java, some use C++, some Objective C etc..

When I would have finished writing the engine in DirectX11, DirectX12 will be the cutting edge.

Haha, thats good point

Thanks guys for pointing out the "big" features of DX11 / D3D11.


Re Dx11 killer features: UAVs, resource views, compute.



Compute shaders is the big one. Combines with the ability for arbitrary read access from buffers and textures, it opens to door to all kinds of new techniques. We haven't even really scratched the surface of what's possible with compute. Other notable mentions:

Access to MSAA data
Access to depth buffers (possible in D3D9 through driver hacks)
Better instancing support (you can access arbitrary buffers now in vertex shaders, which makes instancing much more powerful)
Constant buffers (reduces CPU overhead)
Up to 128 textures
Decoupled textures and sampler states
Integer math in shaders


It's a shame that none of those things is possible to use solely within a HLSL shader - one needs an engine dedicated to DirectX 11 to make use of these features. This is what many shader dev's like me keeps "stuck" on DX9, as gasto says correctly:


That dilemma is what keeps developers(like me) from actually creating the engine. When I would have finished writing the engine in DirectX11, DirectX12 will be the cutting edge.

Personally I think that if your resources and skillset are such that it would take a prohibitively long time to implement a DX11 engine, then you should probably consider using an existing engine. An engine like Unity has many engineers for using the latest API's, and can abstract the features in such a way that you don't have to bear the entire burden of targeting multiple platforms with varying feature sets.

If you are going to make an engine, then I would say at some point you've just got to saw "screw it" and start making the game using whatever technology and API's you're comfortable with. Like I said early for the majority of games D3D9 vs D3D11 vs GL really isn't going to affect the actual game and what you can do with it, it'll just be an implementation detail. If it turns out your game is awesome and you want to target new platforms, then you can always port it after and change the graphics API if needed.

Not to hijack the thread, but what are the benefits of using D3D11 over D3D10?

All I've seen is the Device.Context, which supposedly makes multithreading easier for games. But I'm already using multithreaded loading and running my gameloop in a separate thread than the main one (using D3D10), so not sure how the device context would improve my architecture...

This topic is closed to new replies.

Advertisement