Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Increasing the frame rate

edited July 2014 in General Posts: 142

I've started to measure the frame rate in my games and found it to be very low sometimes (around 15 FPS). This only happens when I have a lot of sprites on the screen. Is there any way to increase the frame rate of a game? If so, what are the best ways to do so (i.e. using different file formats, not using sprites, etc.)?

Comments

  • edited July 2014 Posts: 425

    There was this discussion: http://codea.io/talk/discussion/4807/efficiency#Item_14

    Also:

    •Use setContext() to sprite things like the ground that never move/change onto an image then sprite that image -one sprite call rather than hundreds

    •Only draw stuff that's actually on the screen

    •Make your algorithms more efficient

    •Don't use expensive calculations like math.sqrt()

    •Never do the same thing twice (as you already know the answer)

    •Lots of printing takes ages

    Image:get() can be slow when used a lot

  • Posts: 142

    @Coder Oh ok, sorry I didn't realize there was already a discussion similar to this. Thanks for the helpful advice as well!

  • edited July 2014 Posts: 425

    No problem, when I posted that discussion there were probably a few like that already, and also your question is much more specific than mine was so it is better to start a new thread anyway(please don't quote me on this though)

  • IgnatzIgnatz Mod
    Posts: 5,396

    @Staples - are you using meshes? If not, you should learn how to use them, and try them out., because they can be much more efficient where you have large numbers of images.

    They are the heavy duty version of sprites (in fact, sprites are just simplified meshes).

  • edited July 2014 Posts: 142

    @Ignatz I'm not using meshes, but I will soon. I'm learning about them on your tutorials! :)

  • edited July 2014 Posts: 142

    @Ignatz I am trying to use meshes, but I keep encountering a problem. I have a texture with 8 images and everything works fine when I use the first image (e.g. 0,0,0.125,1), but when I try to use the second image (e.g. 0.12625,0,0.25625,1) it shows half of the second image mad half of the third image. What am I doing wrong?

  • Posts: 142

    Here is my code

    function setup()
        sp = mesh()
        sp.texture = "Dropbox:SparkTexture"
        img = readImage("Dropbox:SparkTexture")
        w,h = 800,100
        number = 8
        print((101/8))
    end
    
    
    function draw()
    
        background(40, 40, 50)
        strokeWidth(5)
        sp:clear()
        for i = 1,number do
            x = WIDTH/2-150
            y = HEIGHT/2
            r = sp:addRect(x,y,w/8,h)
            sp:setRectTex(r,0,0,1,1) --works fine
            sp:setRectTex(sp:addRect(x+150,y,w/8,h),0,0.12625,0,0.25625,1)--doesn't work
        end
        sp:draw()
    end
    
  • edited July 2014 Posts: 425

    If the images are equally spaced horizontally use this formulae

    imgNum=2
    (1/8*(imgNum-1), 0, 1/8*imgNum, 1)
    
  • edited July 2014 Posts: 142

    @Coder That results in the same outcome. Half of the second image is shown and half of the third image. If you want to try out the code with my image, here is the texture.

  • edited July 2014 Posts: 425

    What image are you using? Edit: sorry i didn't read your above post.

  • edited July 2014 Posts: 142

    @Coder If you're referring to the file type, it is a png. If you're referring to the actual file, I posted it in the above comment. Here it is again.

  • Posts: 425

    @Stapels it works now, I took ages but eventually realised that it was my own stupid mistake:
    SetRect needs x,y,w,h not x,y,x2,y2 as I gave in my previous answer. See fixed code below:

    function setup()
        img = readImage("Dropbox:SparkTexture")
        w,h=img.width,img.height
        sp = mesh()
        sp.texture = img
        number=8
    end
    
    function draw()
        background(40, 40, 50)
        sp:clear()
        for i = 1,8 do
            local x,y,x2,y2=1/number*(i-1),0,1/number*(i),1
            local r=sp:addRect(i*90,300,80,80,0)
            sp:setRectTex(r,x,y,x2-x,y2-y)
        end
        sp:draw()
    end
    
  • edited July 2014 Posts: 142

    Ohhhh!! Now I just feel stupid! Thanks @Coder!

  • Posts: 425

    No problem, I should check I'm giving the right advice in future :)

  • Posts: 1,976

    @Staples Tip: you don't need to create 8 squares every frame, you can just store all of them in a table, and then in draw change their coordinates.

  • dave1707dave1707 Mod
    Posts: 8,496

    Here's an example of pulling meshes out of a sheet. Think of the 8x8 mesh image that I show as 64 different meshes. Tap the screen to show each individual mesh as a larger one.


    displayMode(FULLSCREEN) supportedOrientations(PORTRAIT_ANY) function setup() img = readImage("Cargo Bot:Startup Screen") number=8 w1=img.width/number h1=img.height/number sp = mesh() sp.texture = img for x=1,number do for y=1,number do r=sp:addRect(x*w1/2,y*h1/2,w1/2-2,h1/2-2,0) sp:setRectTex(r,(x-1)/number,(y-1)/number,1/number,1/number) end end sp1=mesh() x=1 y=1 end function draw() background(40,40,50) fill(255) text("Tap screen to show each seperate mesh",WIDTH/2,HEIGHT/2+50) sp:draw() end function touched(t) if t.state==BEGAN then if x>number then y=y+1 x=1 end r=sp:addRect(300,800,w1*3,h1*3,0) sp:setRectTex(r,(x-1)/number,(y-1)/number,1/number,1/number) x=x+1 end end
Sign In or Register to comment.