Emulator Issues #3829
closed
Speed improvement for OpenGL Plugin
Added by Metzelmaennchen over 14 years ago.
Relates to performance:
No
Relates to maintainability:
No
Description
Hello Devs!
As I like your project I wanted to do my 2cents for you :)
I was always annoyed by the fat slowdown on my machine when watching the Wind Waker intro. At the moment the island pops into the viewport the framerate dropped to ~14fps :(
Having a look at the glcalls with gdebugger the reason was quite obvious... there are around 180000 OpenGL commands executed per frame :( Most of them vertex shader programs.
Well, attached you will find a patch with tweaked SetMultiVSConstant functions. The patch is backward compatible if the GL_EXT_gpu_program_parameters extension isn't supported. In that case the old, slow version is used :(
If it is available, the plugin is quite as fast as the dx version now :)
Now its also more fun to watch the MP1 intro :)
- Status changed from New to Accepted
I will apply your patch locally and test. If it does what you say it does, I just might commit it :)
- Status changed from Accepted to Work started
Sorry, I don't have Wind Waker. I tried your patch and didn't notice any difference while playing NSMBW. I tested against the World 8 map and consistently get ~40FPS with and without your patch.
Perhaps my hardware is unaffected by your changes? nVidia GeForce 9800 GTX+
Since it's such a small patch and doesn't seem (to me) to cause any harm, I'll commit it.
- Status changed from Work started to Fixed
9800 GTX+ is a heavy shader cruncher... go back and try a hd4870 ;)
But you should see an effect in an opengl debugger (using gdebugger which is for free). To speak in numbers.
Before there were a max of 190k OGL calls for the Wind Waker intro (isn't there a demo flying around?) and now the max is around 35k :)
Having a look at NSMBW (into) there were 24k OGL calls which now drops to 8.5k :)
Well your patch is in so I'll just go ahead and trust you :)
That's nice that you'll trust me ;)
Now I go for the redundant Get/Set changes... my profiler reports around 95% unnecessary changes. As they are not cheap, I think there is something more to gain with a bitmask tracking the states.
fwiw, don't any decent gfx drivers optimize out obsolete (i.e. duplicate) state changes anyway?
At least that's what I heard for D3D, not sure if they do that for OGL, too.
Hello NeoBrain!
Very interesting stuff you are pointing here and you are totally right (for dx this only works in pure mode if I remember correctly). Hopefully every driver writer implements such a thing :)
But there is still the cost of sending calls to the driver. On a first shot there are three functions which use 26% of all calls... reported to be 95% useless.
Breaking down these calls is visible in a lower usage of the corresponding driver, well at the moment there is a benefit of 1,6% for the fglrx_dri module :)
I didn't see much of a difference here using a 4870 on 7x64, but that's a good patch tho.
Also available in: Atom
PDF