|
|
Comments and Discussions
|
|
 |

|
Hi,
why if active system menu, display stops?
Thanks
Antonio Giuliana
|
|
|
|

|
giuliana_a wrote: why if active system menu, display stops?
This is by design, as the transparent drop shadow provided by Windows doesn't get updated. So, constant animation would leave some artifacts. This can be altered however, should you use an owner drawn menu and/or disable the drop shadows. Look into WM_ENTERMENULOOP in WinMain.c for more info as how to stop this.
|
|
|
|

|
Hi,
good job. Very interesting.
I modify the example project to allow resize (#define APP_ALLOW_RESIZE true). During resize it flickers. Does anyone know why?
Thanks.
PD: My message is a bit outdated, but haven't found this article before. .
|
|
|
|

|
Himar Carmona wrote:
I modify the example project to allow resize (#define APP_ALLOW_RESIZE true). During resize it flickers. Does anyone know why?
Check out my response to the thread below titled "worker thread slowed by MFC UI interactions" for more information as to why. The reasons are mostly the same, with the DC preempting the RC. However, with the resize, you do have an option to reduce the flicker, you can override WM_ERASEBKGND. Check MSDN and/or Google for more info.
|
|
|
|

|
I create a SDI MFC program in which there is a worker thread to render a 3D scene. I found the rendering speed will be interupted and slowed by some UI interactions, e.g., moving the window by drag the window title, mouse move on some toolbar's buttons. I don't why. Could you give some suggestion?
Thanks.
|
|
|
|

|
solehome wrote: Could you give some suggestion?
Assuming there's no bottlenecks in your threads and/or WM_PAINT...
When dragging a window around you will always notice a decrease in FPS because Windows has to redraw the window a lot, which redraws the client area and updates the DC, which forces the RC to be preempted by the DC it belongs to. Being in a separate thread doesn't matter because the RC will always be subservient to the DC it belongs to, and the DC still belongs to the GDI - which is slow.
To see this in action, try downloading, compiling, and then run the example application for this article in windowed mode, and then run Notepad and drag it back and forth over the GL sample app. You should notice a drop in FPS. And this is due to a totally different app!
|
|
|
|

|
Very Informative reply. Thanks
Maybe multi-core CPUs and full screen mode can help.
|
|
|
|

|
solehome wrote: Very Informative reply. Thanks
No problem.
solehome wrote: Maybe multi-core CPUs and full screen mode can help.
Yup, multi-core is the way of the future. Also, if you run your game/app in fullscreen Windows will give it a much higher priority, so yes you're right, that will help.
|
|
|
|

|
Also, a lot of games will use in-game menus and toolbars as well rather than the standard Windows version. This way, you won't have to worry about the DC slowing things down when navigating them either, if they happen to force a redraw that is.
|
|
|
|

|
Thank you Jeremy for this great article.
I'm trying to wrap it in classes, so i can create multiple windows doing continuous rendering.
As i'm rendering to video, uninterrupted rendering is a must (hence me putting the rendering in separate threads)....
yet as you explained above, performance suffers from other windows being dragged, minimized .
can you elaborate on the "RC to be preempted by the DC it belongs to", i do not understand what this means (i tried to google it, but that didn't make sense)
What can possibly be done to avoid this performance degradation?
Thanks up front
Bert
|
|
|
|

|
Piet Bibber wrote: Thank you Jeremy for this great article.
You're welcome.
Piet Bibber wrote: can you elaborate on the "RC to be preempted by the DC it belongs to"
Keep in mind, that was said before Vista came to be popular. If you turn on Aero/desktop compositing in Vista things are a bit different now. There's a slight loss in performance for moving stuff around, but it's not nearly as bad. If you turn off compositing, however, it still works the same way as previous versions of Windows and suffer the DC preemption. So, since not everyone uses Vista or Aero it's still a concern.
Anywho, the order of relationship of preemption with a Windows (the OS) app in regards to this is Window > DC > RC. The Window can kill the DC's drawing, and the DC can kill the RC's drawing. When Windows or menus move about the screen Windows (the OS) sends a signal to whichever DC (client or non) needs to be invalidated (usually means it needs to be redrawn to show it after being exposed) and voila. But the DC is not hardware accelerated. It's slow as dirt compared to the RC - which Windows (the OS) doesn't really care about. It just knows that until the DC is happy (redrawn) then everything can wait its turn like good little children.
Outside of using Vista's desktop compositing, there is zero way to stop this. It's just the way Windows (the OS) works.
Piet Bibber wrote: What can possibly be done to avoid this performance degradation?
You have two options really. You can either make your application fullscreen and don't use anything drawn by a DC (like menus provided by Windows, etc.) or you can look into off-screen rendering for your application. If it's not shown on the screen, the DC will never be invalidated by other Windows moving around.
|
|
|
|
|

|
Piet Bibber wrote: YouTube (flashplayer) movies stutters while minimizing/maximizing (even non overlapping) windows.
This is not hardware accelerated. It's just like movie animation. It's just as slow as the DC, but it'll appear fluid due to the way it works. It's a trick on your eyes.
Piet Bibber wrote: click on the screen to get some balls moving - they *don't* stop moving - even when the window overlaps
In Vista, turn off desktop composting. Play around with the menus a lot. You'll notice some bottlenecks. Also, the effects of this animation is less noticeable again because it's the GDI doing the drawing in the first place. It only appears smooth sometimes since the animation is much much slower then what the RC can handle. So it gives it some time for the DC to do its thing. This can work to create an illusion, but the slow down is still happening.
|
|
|
|

|
I too am developing an engine using OpenGL, also for the learning more than anything else. My plan is to create an engine that is scriptable so have spent the last few months creating an interpreter for a C-style scripting language which manipulates objects, lights, cameras etc.
I am now looking into the more advanced OpenGL stuff to include in my engine, along with support for shaders - now that I have a new computer which has a seriously powerful graphics card. It has been a while since I looked at this project but I shall try this approach and see if it offers me any speed increases. Thanks!
PS. Your name is familiar, I think we spoke a few years ago - you were creating a VB encryption program. If it is you, it is funny how we are moving along the same lines.
|
|
|
|

|
alankelly wrote: Very nice article
Thanks.
alankelly wrote: also for the learning more than anything else.
It's a great plan. In the end we can learn a lot and possibly help others in the community as well maybe improve upon from public feedback. Sounds like win-win to me.
alankelly wrote: My plan is to create an engine that is scriptable so have spent the last few months creating an interpreter for a C-style scripting language which manipulates objects, lights, cameras etc.
Sounds cool. I never used LUA but I know that a lot of engines also use that as a script if you want to at least pull some ideas from it.
alankelly wrote: It has been a while since I looked at this project but I shall try this approach and see if it offers me any speed increases. Thanks!
The multi-threading will really shine on the newer systems that have dual cores, or even hyper threading will benefit somewhat. It really will be the way of the future, so it's worth integrating into your engine for sure.
alankelly wrote: PS. Your name is familiar, I think we spoke a few years ago - you were creating a VB encryption program. If it is you, it is funny how we are moving along the same lines.
I dunno. I have made one in the past in VB so maybe. And ya know what they say, great minds think alike.
|
|
|
|

|
Jeremy Falcon wrote: The multi-threading will really shine on the newer systems that have dual cores, or even hyper threading will benefit somewhat. It really will be the way of the future, so it's worth integrating into your engine for sure.
I couldn't agree more.
I was thinking about how this model could be extended but OpenGL isn't really thread-safe in terms of having multiple threads doing work on different parts of the system.
One thing i've been looking into is OpenMP, as it is now supported in VS.2005. I think there is probably some great benefit to be had to sharing vertex processing etc. between multiple threads. Maybe i'll get around to writing an article on it one day - it's been a while since i wrote anything legible. It would be interesting to get some real speed comparisons in using OpenMP. I did some time tests on a fluid dynamics simulator I wrote last year and it didn't seem to make _that much_ difference. Maybe I was using it wrong though!
Any insights of using OpenMP and OpenGL would be greatly appreciated.
|
|
|
|

|
lazygenius wrote:
Any insights of using OpenMP and OpenGL would be greatly appreciated.
I haven't used it, although it would be a bit interesting to look into. So far, I've been allowing the OS's SMP scheduler handle the grunt work, of course I do set affinity. But, if I can push better performance out of OpenMP that would be nice, although I don't really have a supercomputer to test things out on.
|
|
|
|

|
For more complex models I wonder about introducing a third thread (or utilising the main thread more) for manipulating the model. As I understand it there is a latency issue with SwapBuffers whereby the SwapBuffers call, or the next GL call will block the thread.
Even in your secondary thread you are going to experience that latency, no? If SwapBuffers does block it would be nice to kick off another thread for doing CPU based work such as collision detection or general housekeeping. If SwapBuffers doesn't block then I guess this work could be done directly after SwapBuffers being sure not to call any GL functions.
Still beats the hell out of GDI either way!
|
|
|
|

|
lazygenius wrote: For more complex models I wonder about introducing a third thread (or utilising the main thread more) for manipulating the model.
Definitely, I don't want to suggest you only need two threads in all scenarios. Typically though, most apps tend to have only one render thread however.
This skeleton isn't a end-all-be-all by any means. I wanted I wanted to achieve with this is give people something to use as a skeleton when making their multithreaded OGL apps on Windows. It's just a start that contains most of what you'll use over and over again.
lazygenius wrote: Even in your secondary thread you are going to experience that latency, no?
Yup, but the latency can't be avoided with just about any 3D pipeline. As far as blocking, I haven't ran across that myself. If you have a link or more info on it; I'd be grateful.
The idea behind the threading is more about concurrency in that while you do swap buffers going on you could also be doing something like processing the AI for the next frame on another core. The slow down is mitigated and not really gotten rid of, but the end result could be faster overall.
lazygenius wrote: Still beats the hell out of GDI either way!
Amen to that.
|
|
|
|

|
Did you check out ApocalyX3D (scipted in LUA) ?
Another good option is the Breve engine (has it own script language and Python).
Both are excellent pieces of open source
|
|
|
|

|
Very well done article. Found it well written and informative. I am going to add it to my blog
Paul
I'd like to help but I don't feel like Googling it for you.
|
|
|
|

|
Thank you. I'm just debating on whether or not to leave it as is or update to reference the engine when it's done.
So far, I'm thinking of leaving it be and using to show small, concentrated aspects of OGL. And then maybe have a engine base example for the larger, more complex examples. Meh, who knows.
|
|
|
|

|
Jeremy Falcon wrote: maybe have a engine base example for the larger, more complex examples
That would be really cool
If you try to write that in English, I might be able to understand more than a fraction of it. - Guffa
|
|
|
|

|
PaulC1972 wrote: That would be really cool
Well the idea is to release it on CP. So I may as well write articles on it so I can get platinum status.
|
|
|
|

|
Jeremy Falcon wrote: So I may as well write articles on it so I can get platinum status
Yeah, go for it. I only have like 25 articles to write :->
Some people have a memory and an attention span, you should try them out one day. - Jeremy Falcon
|
|
|
|
 |
|
|
General News Suggestion Question Bug Answer Joke Rant Admin
|
Provides a base to use when programming OpenGL-enabled applications for the real world, rather than a simple hello world.
| Type | Article |
| Licence | CPOL |
| First Posted | 26 Aug 2006 |
| Views | 131,846 |
| Downloads | 3,593 |
| Bookmarked | 95 times |
|
|