|
|
Comments and Discussions
|
|
 |

|
Simply changing (WinMain.h):
#define APP_ALLOW_FULLSCREEN true
#define APP_DEF_BPP 16
#define APP_DEF_FULLSCREEN true
#define APP_DEF_WIDTH 1024
#define APP_DEF_HEIGHT 768
shows a totally black screen... I've tried using this as a code base for my own project and for me it shows a green gradient from midding of the screen up to the right corner if I choose fullscreen. Very strange. I am however drawing a bunch of 16x16 greenish tiles, I'm guessing they're being displayed. But there definatly seems to be missing some important part in this tutorial or code base.
Also when building with vs2010 the project it says: exe can't be found.
simply right click the project and select Properties and do this:
Change Output dir under general to: $(SolutionDir)bin\$(Configuration)\
Change Intermediate dir under general to: bin\$(Configuration)\debug_crap\
These are obviously my preferred folders, but they'll work for you too
One thing which I think this tutorial needs is the ability to change from/to fullscreen in runtime. Cause like it's made up now, there's no way to do this.
EDIT:
Fix for fullscreen:
inside DrawMain.cpp: unsigned int __stdcall InitScene (const PRENDERARGS pArgList)
Just before the while loop add:
GetClientRect(pArgList->hWnd, &rcClient);
OnResizeFrame(pArgList->hWnd, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top);
Also make sure the other OnResizeFrame and RenderFrame uses same calculation for width and height as above.
modified 8 Dec '11 - 16:34.
|
|
|
|

|
a very nice sample, could you tell me how to catch events from mouse?
Thank you very much.
|
|
|
|

|
smart_dummies wrote: a very nice sample
Thanks.
smart_dummies wrote: could you tell me how to catch events from mouse?
If you look in the file WinMain.c there's a routine called WndProc. That's were you would catch notification messages sent by Windows for items such as the mouse. You can use the following MSDN link to see possible values to use in the switch block:
http://msdn.microsoft.com/en-us/library/ms645533(VS.85).aspx[^]
|
|
|
|
|

|
I wonder how to sync this demo with a 60Hz monitor refresh.
The Debug compilation tells something of 1248 Hz frame rate, which is quite hmmm....
Well, any ideas welcome
|
|
|
|

|
rinchendawa wrote: I wonder how to sync this demo with a 60Hz monitor refresh.
The article mentions setting APP_ALLOW_VSYNC to true to achieve this.
rinchendawa wrote: The Debug compilation tells something of 1248 Hz frame rate, which is quite hmmm....
That's not uncommon with cards this day and age for a very simple scene that's not vsynced.
|
|
|
|
|

|
kavitesh wrote: First of all a million thanks for writing such a wonderful code
Thank you!
kavitesh wrote: Beside it doesnt have C++ so it makes lot easy for me to understand all
That's actually one of the reasons this was done in C. I wanted the focus to be on OGL and WGL more than design patterns, etc.
kavitesh wrote: Let me know if u noticed anything like this?
It's because the game loop is running faster as there's less to update when no display is visible. You can either just pause the process and/or game loop or throttle it down when it's minimized and/or lost focus. In fact I may add that in an update since its common enough.
|
|
|
|

|
I also want to say thanks for the nice code.
I have also issues about CPU ubilization and window resizing:
1:
When the window is iconic there is no need to render on the OpenGL side.
So in function InitScene one could add:
if(!IsIconic(pArgList->hWnd))
{
...
}
else Sleep(100); // pause thread for 500 msec
This will slow down CPU usage, but may not be the best solution.
I still figure out how to use something like SuspendThread(bool yes_no) upon resizing the window.
2:
The WM_SIZE message should also be checked for SIZE_MAXIMIZED if one allows window maximizing.
Just do the same as in SIZE_RESTORED. This will re-center the graphics. Same probably goes for fullscreen mode.
Well, that's all.
Other than this, excellent code, really
|
|
|
|

|
rinchendawa wrote: I also want to say thanks for the nice code.
I have also issues about CPU ubilization and window resizing:
Thanks. Looks like you beat me to it. You do address some good points, although I would avoid the Sleep API but I do need to add a few more tidbits to this sooner than later.
|
|
|
|

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

|
How far is your engine now? Do you have something ready? I would be very interested...
Regards
Daniel
|
|
|
|

|
Thanks for the interest. It recently passed the initial design phase. I already have Windowing abstractions set in place for cross platform, but no inter-game GUI elements yet like listboxes, etc.
I was in the middle of implementing the thread pool when I got pulled aside to do some work (not by choice ). But, once that's done and I get a rough renderer set in place I may go ahead and write a pre-alpha article on it just to get some feedback/ideas about it.
I still have a long way to go. It'll be in alpha for a while. I want to get something functional first (3D audio, scene graph, timing, etc.) going before adding more advanced stuff like shaders. It's all a work in progress and could easily be a year before it's done. But, I'll most likely post something on CP before that time.
GUI
|
|
|
|

|
hi,
i am looking for a minimal opengl framework that supports picking elements in the model and interactive navigation such as pan, zoom, rotate, orbit ... does anybody know of a good clean implementation of such a beast? preferable platform independent, e.g. wxWindows based?
cheers
jeremy
|
|
|
|

|
jekata wrote: i am looking for a minimal opengl framework that supports picking elements
How minimal is minimal? If all you're looking for is picking, then just integrate the code from a tutorial online rather than using a full-blown framework.
One such example: Clickety[^]
jekata wrote: interactive navigation such as pan, zoom, rotate, orbit
There are a lot of camera classes for OpenGL in C++. Here's one such example for you're coding pleasure: Clickety[^]
|
|
|
|

|
I agree with everyone else and your article is well written and will definitely aid coders in writing OpenGL apps. Earlier in my Windows programming career, I did some testing to determine the speed difference between Windows messaging and using Events and memory mapped files to pass messages. Like you, my first code was written in C, not C++. I cannot find my data after 8 years, but I seem to remember that the Windows based mesaging came out slower. I alo did some playing around with priorities at the time and that certainly could have been a factor in the differences. Have you ever done any tests in looking at the differences in response times of the 2 methods?
Kenneth Krueger Jr.
|
|
|
|

|
Kenneth Krueger wrote: Have you ever done any tests in looking at the differences in response times of the 2 methods?
No I haven't. My threading experience has been in Windows only, so I naturally got used to using the messaging route. You have, however, piqued my interest and I'd love to hear more about using memory mapped files for messaging. I'm not sure if it's faster or not, but I have no problem testing it out to see.
As far as threading priority, that very may well be something I add to the example at a later date. I kinda got side-tracked working on my engine and it's taking a lot of time.
|
|
|
|

|
Windows uses the message loop as one of the triggers for context switching applications. Another trigger is the Sleep() function. So perhaps by avoiding the message loop and using memory mapped files you could give your application a higher priority when it really needed it. Or did you get more consistent framerates by avoiding the message loop?
Todd Smith
|
|
|
|

|
Todd Smith wrote: So perhaps by avoiding the message loop and using memory mapped files you could give your application a higher priority when it really needed it.
Well, I've never used memory mapped files for threading, so it's still a subject I'd like to dig into some more. Perhaps over the holiday weekend and compare to the two.
Todd Smith wrote: Or did you get more consistent framerates by avoiding the message loop?
I never did avoid using a message loop. The reason being I wanted to allow Windows to handle the threading priorities naturally so I don't hog down the system. With that being said, I don't notice a major performance penalty over using messaging say compared to global variables (yeah, there is one of course). But, the idea behind messaging is A: it's a lot more flexible and B: it helps with encapsulating details.
However, if using a memory mapped file can help me achieve the same thing but faster then I'm all ears.
|
|
|
|

|
Good article and refresher on multithreading. My only complaint is that it might have abit heavier error checking, especially in InitScene, where initialization can and will go wrong.
A cynic is a man who, when he smells flowers, looks around for a coffin. -H.L. Mencken
|
|
|
|

|
JWood wrote: Good article and refresher on multithreading.
Thanks.
JWood wrote: My only complaint is that it might have abit heavier error checking, especially in InitScene, where initialization can and will go wrong.
You're right. I may make an update to it that adds this, as the whole purpose of the skeleton app is to be ready for the real world.
|
|
|
|

|
hu... what about a D[^] version?
I know, I could write it myself, but I have a lazy and sick curiosity about it...
|
|
|
|

|
Super Lloyd wrote: what about a D[^] version?
Um... Yeah, I'll have it ready around the year 2045.
Seriously though, I don't know D, and I'm trying to stay away from learning a new language right now while I'm racking my brain with all sorts of learning materials (I'm making a game engine), and if I push it any further I'm afraid my head will explode.
|
|
|
|

|
Already busy doing something else!! Good luck then!
(I know that feeling, same for me in fact)
A game engine, cool! Is it based around the quake engine?
|
|
|
|

|
Super Lloyd wrote: A game engine, cool! Is it based around the quake engine?
It's a home brew engine, using libs (like libpng) internally where I can cut a few corners.
I'm mainly doing it for the learning experience. It already supports texture mapped fonts w/ kerning, PNG HDR TGA and JPG image formats, and filters like sharpen, etc. Of course, I still have a looooooong way to go, but one step at a time.
|
|
|
|
|
 |
|
|
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,038 |
| Downloads | 3,554 |
| Bookmarked | 95 times |
|
|