Sign in to follow this  

App's speed should be better but isn't !

This topic is 4131 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, i have a little problem with speed of my game (I'm trying to make something like CD-Man/PacMan). I've read all tutorials and followed them, but the game still demands tooo much memory and isn't fast enough... Her it goes: I use these standard methods to run my app. This one is the main cycle-
public static void Run()
        {
            targetForm = new Form1();
            targetForm.Show();            

            Init(targetForm);//Init method prepares graphic device
            InitializeItems();//Loads pictures etc.. (not imortant)
            while (running)
            {
                m_StopWatch.Reset();
                m_StopWatch.Start();

                Application.DoEvents();
                Update();//Goes through Update() method of every drawable object in the game.
                Render();//Renders every drawable object                

                m_StopWatch.Stop();
                m_CurrentFrameTime = (double)m_StopWatch.ElapsedTicks;

                double delta = m_FrameTime - m_CurrentFrameTime;

                if (delta > 0)
                {
                    m_StopWatch.Reset();
                    m_StopWatch.Start();
                    while ((double)m_StopWatch.ElapsedTicks < delta) ;
                    m_StopWatch.Stop();
                    m_CurrentFrameTime += m_StopWatch.ElapsedTicks;
                }

                InfoTxt.Text = "FPS: " + CurrentFrameRate.ToString();
            }
            Application.Exit();
        }

Here is Init() method-
private static void Init(Form targetForm)
        {
            FrameRate = 60;
            
            PresentParameters presentParams = new PresentParameters();
            presentParams.Windowed = true;            
            presentParams.SwapEffect = SwapEffect.Discard;            
            presentParams.PresentationInterval = PresentInterval.Immediate;

            dGDevice = new DGDevice(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, targetForm, CreateFlags.SoftwareVertexProcessing, presentParams);
            
            dGDevice.RenderState.ReferenceAlpha = 0;
            dGDevice.RenderState.AlphaFunction = Compare.NotEqual;

            dXSprite = new D3DSprite(dGDevice);
        }

Pictures in my game are represented as Microsoft.DirectX.Direct3D.Texture and are drawn with Sprite.Draw2D() method Now: + My (and the tutorial's game)FPS is hardly 60. + Application needs approximately 25MB of memory (which is terrible, because the window of the game is exactly same big as window of microsoft's Pinball3D game (the one you get automatically with WinXP), but Pinball3D is happy with 3MB) Do you have some tips, please?? I want to make my first game that is not just a pathetic parody of a game :-) and i have these obstacles. Thx very much for any suggestions. G'Axer

Share this post


Link to post
Share on other sites
For performance:

1- Find a profiler
2- Profile
3- Rework the slowest parts

Honestly, there's generally not much a human can do, except guesswork. Profilers are your best friend.

For memory:

What sizes are the textures you use? These are generally the most heavy consumers of memory.

Share this post


Link to post
Share on other sites
To ToohrVyk:
+ Profiler is a good idea, but unfortunately i'm relatively new to programming, so i don't know about any recommended... Would you please write here name of some profiler (or link)? Thx

+Textures shouldn't be a biggie. I use only about 10 pictures 32x32p in the game at the moment.

Share this post


Link to post
Share on other sites
To imbusy:
+I've calculate memory usage with the thing you get when you press CTRL+ALT+DEL (I'm sorry I have windows in czech language and therefore I don't know how is it called in english :-) )
+V-sync is not "the problem", i have LCD monitor :-). It must be something else, for example, when mouse cursor goes over game window FPS falls to 10 (ugh :-X).

Share this post


Link to post
Share on other sites
Quote:
Original post by G_Axer
+V-sync is not "the problem", i have LCD monitor :-). It must be something else, for example, when mouse cursor goes over game window FPS falls to 10 (ugh :-X).
LCD monitors still have V-sync from an applications point of view.

I seem to recall a thread around here recently where tooltips caused the FPS of DirectX apps to plummet, but I can't remember any more details than that...

Share this post


Link to post
Share on other sites
What is happening inside of Application.DoEvents(); I have a feeling something is happening with the WM_MOUSEMOVE windows message perhaps that could kill your framerate when the mouse is over the window. I am guessing this is C# and i have no experience with it but i figure you must be processing messages.

Share this post


Link to post
Share on other sites
Quote:
Original post by G_Axer
+ Application needs approximately 25MB of memory (which is terrible, because the window of the game is exactly same big as window of microsoft's Pinball3D game (the one you get automatically with WinXP), but Pinball3D is happy with 3MB)

There's a rumor that says that the big memory print is due to the .NET framework is loaded in that process aswell. I havevn't bothered to verify it but it seems reasonable to me.

Quote:

Do you have some tips, please??

I see you are not .Dispose()-ing your Form, which you should do. If you don't then there's a risk that the window will stay visible for very long (since it is not garbage collected immediately) while being unresponsive. It is actually very encouraged to call .Dispose() on any object that uses unmanaged resources.

What tutorial are you basing this on? I am curious to poke with some of that code and see if I also get a crappy framerate.

Share this post


Link to post
Share on other sites
What's this?

if (delta > 0)
{
m_StopWatch.Reset();
m_StopWatch.Start();
while ((double)m_StopWatch.ElapsedTicks < delta) ;
m_StopWatch.Stop();
m_CurrentFrameTime += m_StopWatch.ElapsedTicks;
}



You shouldn't have a while loop that does nothing but wait for a certain amount of time to pass, that's just silly.

I'm not sure what this does, but I can't see any code that actually calculates the FPS. Are you sure it isn't just showing the 60 you set it to originally and never getting updated?

EDIT: I also see you're showing the FPS every frame using infoTxt.Text. I'm assuming this is some kind of control, which would also be slow.

Hope this helps.

Share this post


Link to post
Share on other sites
To sirob:
+The cycle that do nothing is there intentionally - it protects app to have FPS higher than intended 60. So it is no error for sure. In ideal case the app will have precisely wanted 60.
+I don't think that randering one line of text needs more memory than rendering normal texture.

But anyway, thanks for tips ;-)

Share this post


Link to post
Share on other sites

This topic is 4131 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this