November 22nd, 2008, 06:44 PM
i need some expert design guidelines for realtime 3D graphics application
i need some expert design guidelines for a real time 3D graphics application using Visual C++. These advices may be high level for extensibility or low level for performance issues. iím getting confused at some parts of design like syncronization of frame loop with real time data and processing realtime data without buffer overruns etc,, so let me explain application details and some points that needs your expertise.
From now on i will use the following acronmys;
- APP, main application (an SDI MFC executable - .exe),
- DllMan, an MFC Extension DLL ( .dll) that includes a Plug-In Manager and Base Plug-In and utility classes that is statically linked to APP,
- PlugIn#N, a number of MFC Extension DLLs (PlugIn#1.dll, PlugIn#2.dll) that is managed and dynamically linked by DllMan which includes derived Plug-In Classes and Socket and DB utiliy classes to get realtime UDP packets over network and process them, update entity states and record incoming data to Database for offline replay/playback.
APP will statically be linked with DllMan and at startup DllMan dynamically loads up PlugIn#N. APP will display a 3D view of entities by using a 3D Scene graph and rendering library. User will zoom in/out, pan on the screen and be enabled to start/stop recording realtime data and replay all mission by using recorded data by offline.
In order to maintain a reasonable frame rate and realtime data sync, i need your expertise regarding how should i design APP, DllMan and PlugIn#N?
Let me tell you abit about my PlugIn#N design. Each plug-in module contains a derived class which inherits some basic implementation and interface from base plug-in class in DllMan module. Each plug-in basically implements an entity that will be drawn on 3D View. Entity data is coming from network at 50 hz rate by UDP packets. So by design each entity has its own plug-in module and get its realtime data on its own UDP port. There will be thread-safe Queue to work as a data packet buffer, a worker thread to process data packets, update entity state and record incoming packet to database. During realtime operating mode data comes from network but while offline packets shall be queued from Database records and a similar processing will take place. During offline replaying, user shall have full control on 3D scene by jumping, rewinding any instant on recorded mission data. Bu in realtime mode user will just enable to zoom in/out on 3D scene.
1- My first question will be about realtime data processing. Lets consider there is only one plug-in module PlugIn#1 loaded and UDP packets are coming with (50 hz ). To prevent buffer overruns on Recv() what should i do? Should i put received bytes ( a message structure indeed) immediately into a thread safe Queue and notify waiting worker thread to process incoming data?
2- Second question is about realtime data synchronization. APP side will have a frame loop to update frame data and draw. Since most of our frame data is inside PlugIn#N because of that entities are created under each plug-in module automatically and put inside a list managed by DllMan. APP will request DllMan to get entities updated for each frame to draw 3D scene. APP will use DllMan to iterate each PlugIn#N each frame. So what gets me really confused is that. Should there be a syncronization between APP+DllMan & PlugIn#N since there may be a worker thread inside PlugIn#N. What should be the relation between this kind of application to properly render entities with each incoming realtime data. iím getting confused regarding how is it possible to use all data by APP and no state overlap will be prevented between next incoming data and current state?? This point is so important for me to understand.. Pls could you explain in detail if you have any experience?
3- What should be done to maintain a reasonable overall frame rate like 30 fps? Should i use CwinApp::OnIdle()? Or should i use some high frequency timing mechanism? Or any worker threads at APP side other than main thread?
4- What happens if APP tries to achieve a 30 Hz frame rate but 50 hz realtime data is coming from network? Is it possible to handle such data rate? if possible iím wondering how? Since 3D scene draw time is full of terrain, 3D models, 2D Overlays and geometries?
5- What happens the runtime performance if more than one PlugIn#N module is loaded? Since each PlugIn#N module architecture will be similar so each one will have Queues threads db connections..etc should i consider on overall achitecture? Since plug in architecture is considered to achieve flexibility whenever new mission entities are required and building a new entitiy would have no effect on APP+DllM side in theory. By this way we would get rid of modifying working part to integrate a new module in the future. But that architecture will make no sense if 3D performance is not reasonable.
thanks in advance
for your patience and precious comments..
Click Here to Expand Forum to Full Width