CB HyperMachine

Jaa meneillään olevat projektisi tai valmiit pelit muun yhteisön kanssa täällä.
Post Reply
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

CB HyperMachine

Post by Harakka »

Jotkut sanovat, että CB on hidas.
Joillekin 60 ruutua sekunnissa ei riitä.
CB ei ole hidas.
CB:llä on mahdollista piirtää yli 2000 ruutua sekunnissa.

Se perustuu DrawScreenin hylkäämiseen. Tänään pohdin aikaisempaa looppitestiä (pelkkä framelaskuri ilman ruudunpiirtoa): miksi DrawScreen on hidas ja miten sen voisi kiertää? Sitten tuli älynväläys - Print-komento piirtää suoraan näyttöpuskuriin. Pienen testaamisen jälkeen huomasin, että piirtokomennot toimivat samalla tavalla. Koodailin hurjan ohjelman, jolla pääset kaahaamaan suorastaan yliluonnollisilla FPS:illä! Kokeile ja kerro tuloksesi.

Kopioi koodi alempaa tai lataa se täältä.

Code: Select all

SCREEN 50,50
SAFEEXIT OFF
SetWindow "CoolBasic HyperMachine by Harakka",1
menu()

Function menu()
    stretchScreen(800,180)
    otsikkofontti   = LoadFont("arial black",100)
    valifontti      = LoadFont("tahoma",80,1)
    perusfontti     = LoadFont("verdana",15)
    anykey          = LoadFont("arial black",40)
    m = 0
    ClsColor 20,0,0 : Cls
    Repeat
        m + 1
        Color 80,0,0
        SetFont valifontti
        fastText(50,5,"Coolbasic")
        Color WrapAngle(m),0,0
        Box 0,120,800,60
        SetFont otsikkofontti
        fastText(20 + Sin(m)*40,35 + Cos(m)*5,"HYPERMACHINE")
        Color 140,20,20
        SetFont perusfontti
        fasttext(200,100,"You don't like the 60 FPS limit in CB?")
        Color 200,40,40
        fasttext(200,120,"This program will BLAST YOUR BRAIN ON THE WALL!!")
        Color 220,10,10
        SetFont anykey
        fastText(50,130,"Press any key to test your REAL fps!")
        If m > 1400 Then WaitKey : Exit
        Cls
    Until EscapeKey()
    selectTest()
End Function

Function selectTest()
    uusivalinta:
    anykey          = LoadFont("arial black",30)
    SetFont anykey
    stretchScreen(200,130)
    ClsColor 130,50,0 : Cls
    Color cbyellow
    perusfontti     = LoadFont("tahoma",15) : SetFont perusfontti

    Print ""
    Print " Select a test"
    Print " (Press a key)"
    Print ""
    Print " 1) Loop Test"
    Print " 2) Text Test"
    Print " 3) Box Test"
    Print " 4) Complicated Test"
    Print " 5) Quit"
    valinta = WaitKey()
    Select valinta
        Case 2
            looptest()
        Case 3
            textTest()
        Case 4
            boxTest()
        Case 5
            Complicated()
        Case 6
            stretchScreen(1,1,5)
            End
        Case 1
            stretchScreen(1,1,5)
            End
    End Select
    Cls
    Goto uusivalinta
End Function

Function loopTest()

    stretchScreen(600,50)

    perusfontti     = LoadFont("verdana",15) : SetFont perusfontti
    ClsColor 0,0,80 : Color cbblue : Cls
    Print "Next this program will run as many loops as possible in a second."
    WaitKey
    Cls : Print "Nothing will be drawn on the screen. Press any key to start."
    WaitKey
    alku = Timer()
    Repeat
        n + 1
    Until Timer()-alku > 1000
    Print "Whoah! You got " + n + " FPS! See, CB isn't slow! Press any key."
    WaitKey
End Function


Function textTest()
    stretchScreen(400,50)

    Locate 0,0
    Print "Now let's draw 10 000 frames with text."
    WaitKey
    
    aa = Timer() - 1
    Repeat
        f + 1
        Locate 5,13
        Print "milliseconds: " + (Timer()-aa) + " | " + "frames: " + f + " | " + "FPS:" + f*1000/(Timer()-aa)
        If f > 10000 Then
            Print "PRESS ANY KEY TO CONTINUE"
            WaitKey
            Exit
        EndIf
        Cls
    Until EscapeKey()
End Function

Function boxTest()

    stretchScreen(200,200)

    Print "  And the same with"
    Print "  ten boxes..."
    WaitKey
    
    aa = Timer() -1
    f = 0
    Repeat
        ClsColor Rand(50),Rand(50),Rand(50)
        d + 1
        For i = 1 To 10
            Color Rand(255),Rand(255),Rand(255)
            Box Rand(30,100),Rand(30,100),Rand(100),Rand(100),0
        Next i
        Print d + " | " + "FPS:" + d*1000/(Timer()-aa)
        If d > 10000 Then
            Print "PRESS ANY KEY TO CONTINUE"
            WaitKey
            Exit
        EndIf
        Cls
    Until EscapeKey()
End Function

Function complicated()
    'SCREEN 800,600
    stretchScreen(800,600)
    ClsColor 0,80,20 : Cls
    Locate 0,20
    Print "      Something more complicated:"
    Print "    Here you see a big problem - I think it's about vsync"
    Print "    Press left mouse button to use DrawScreen with vSync"
    Print "    The FrameLimit will be set to 50 then, you'll notice the difference"
    Print "    When you do not press the mouse button, drawScreen will be disabled"
    WaitKey
    ClsColor 0,0,0
    cx = 400 : cy = 300
    aa = Timer() -1
    maxaplus = 50
    FrameLimit 10
    Repeat
        a + 1
        Print "Adjust the amount of boxes with mouse wheel (now " + maxaplus + ")"
        Print a + " | " + "RESET FPS: LEFT MOUSE BUTTON (DrawScreen)  | AVERAGE (!) FPS: " + a*1000/(Timer()-aa)
        If MouseHit(1) Then a = 0 : aa = Timer()-1
        maxaplus = maxaplus + MouseMoveZ()*2
        For aplus = 0 To maxaplus
            For dist = 50 To 400 Step 50
                For multi = 1 To 4
                    Color WrapAngle(a+aplus),dist,multi*70
                    Box cx + Cos(a+aplus)*dist, cy + Sin(multi*a-aplus)*dist, aplus/5,aplus/5,1
                Next multi
            Next dist
        Next aplus
        If MouseDown(1) Then FrameLimit 50 : DrawScreen 0, MouseDown(2) Else FrameLimit 10000
    
        Cls
    Until EscapeKey()
End Function

Function fastText(x,y,txt$)
    Locate x,y : Print txt
End Function

Function stretchScreen(newx,newy,speed = 15)
    w = ScreenWidth()
    h = ScreenHeight()
    Repeat
        If w > newx Then w = Max(w-speed,newx)'w - 1
        If w < newx Then w = Min(w+speed,newx)
        If h > newy Then h = Max(h-speed,newy)
        If h < newy Then h = Min(h+speed,newy)
        SCREEN w,h
        If w = newx And h = newy Then Return 0
    Forever
End Function
(Kyllä, tässä tekniikassa on ongelmia vSyncin kanssa, mitä demonstroinkin neljännessä testissä. Ideoita korjaamiseen?)
Last edited by Harakka on Sat Nov 10, 2007 5:26 pm, edited 1 time in total.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
User avatar
-Z-
Devoted Member
Posts: 682
Joined: Tue Aug 28, 2007 3:33 pm
Location: In ur danmaku, grazin ur bullets

Re: CB HyperMachine

Post by -Z- »

W00h00t! Looppitestissä rapeat 3.8 miljoonaa ja risat, ja tekstitesti sanoi seconds-kentässä 2637! Aivan käsittämätöntä että voikin tuo drawscreen syödä noin paljon tehoja. Cb toimii drawscreenin kanssa prosentin sadasosalla täystehostaan :P
"Fallout 3 (#10) marked a shift in the industry, a move that saw the western RPG begin to surpass its Japanese counterparts." -IGN top 100 RPGs of all time
Astigma
Moderator
Moderator
Posts: 195
Joined: Sun Aug 26, 2007 5:56 pm
Location: Kuopio, Finland
Contact:

Re: CB HyperMachine

Post by Astigma »

Tämähän ei nopeuta millään tavalla CB:tä. Tämä poistaa ainoastaan sen rajoitteen, jonka näytönohjaimen asetuksista määrätty virkistystaajuus aiheuttaa.

DrawScreen-komento on kytketty noudattamaan virkistystaajuuttaa ja se ei missään tapauksessa ole korkeampi kuin virkistystaajuus. Eli vaikka tällä saakin näennäisesti isompia FPS-lukuja irti, niin todellinen laskentateho ei ole noussut.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: CB HyperMachine

Post by koodaaja »

Taitaapi Astigma olla valitettavan oikeassa. Innostuin tästä ja ajattelin, että vihdoin tulisi kovolla aikoja maanneelle z-bufferisysteemille käyttöä ( KUNNON 3D-pelejä, whööjgä xD ) mutta käytäessä näyttöä kokonaan läpi näkyy siitä ensin vain pieni pala, ja koko näyttö ei piirry missään vaiheessa. Sitten piirretäänkin jo seuraavaa framea. ( tästä varmistuin laittamalla ikkunan alas, jolloin päivitysaste näkyi ) Eli miten saan sen piirtymään kerralla ja kokonaan? En mitenkään? Pitänee kokeilla alakerran koneella..

EDIT: Juu, kyllähän tuo huomattavasti nopeutuu, muttei se ainakaan minulla mitään piirrä ( nopeutumisenhan edelleen huomaa siirtämällä ikkunan tehtäväpalkin alle.. ) siis omat härpäkkeet. Harakan systeemi toimii, mutta jos neliöiden määrä kasvaa, toimiminen loppuu siihen.
Mysterius Coder
Active Member
Posts: 133
Joined: Mon Aug 27, 2007 8:13 pm

Re: CB HyperMachine

Post by Mysterius Coder »

Pitihän tota testata ja...
Wou! :o
loopissa fps oli 3400012!
texti testissä tuli 2553 FPS aika oli 3916!
laatikoiden kanssa fps 706!
Ikävä kyllä
Kyllä minä osaan, mutta kun mieli on tällasen kaaoksen vallassa, niin ei siitä mitään tule.
mikeful
Moderator
Moderator
Posts: 523
Joined: Mon Aug 27, 2007 8:36 pm
Location: Vaasa, Finalnd
Contact:

Re: CB HyperMachine

Post by mikeful »

Ikkunan koon muuttelu oli ihan jännä viritys. :)
Pelejä: Pelasta puhe, Grinder
Muuta: Blogi, Twitter
hohoo
Newcomer
Posts: 5
Joined: Wed Sep 05, 2007 7:54 pm

Re: CB HyperMachine

Post by hohoo »

Looppitestissä tuli: 2333473 FPS!
Tekstitestissä tuli: 4158 sekuntia* / 10001 kehystä / 2405 FPS!
Laatikkotestissä tuli: 827 FPS!

Mahtava ohjelma.

* Luulisin, että tuo tarkoittaa oikeasti millisekunteja.
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: CB HyperMachine

Post by Harakka »

Jep, koodiin on tullut pikku kirjoitusvirhe. Millisekunneistahan siinä on kyse. Teen korjauksen ekaan viestiin.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
User avatar
elmo123
Active Member
Posts: 153
Joined: Sun Sep 09, 2007 4:19 pm

Re: CB HyperMachine

Post by elmo123 »

puoliksi offtopic:
Ikkunan koon muuttelu oli ihan jännä viritys. :)


Mutta hidas 98:lla.
Kiinnostuin pelien tekemisestä ennen 1. luokkaa.
Sitten 3. luokalla tuli CB. Ja siitä se alkoi.

Blender! TF2! CB! Game Maker! Nokia-mollaus! Kitaransoitto! Breakdance! MadTracker! Minecraft!
Connect
Newcomer
Posts: 17
Joined: Sun Dec 09, 2007 3:09 pm
Location: Konnevesi

Re: CB HyperMachine

Post by Connect »

Kun tulee se että press any key.. niin kun painan jotain ni sitten se pätkäsee eikä mitään enää tapahu...what's wrong?
User avatar
elmo123
Active Member
Posts: 153
Joined: Sun Sep 09, 2007 4:19 pm

Re: CB HyperMachine

Post by elmo123 »

Connect wrote:Kun tulee se että press any key.. niin kun painan jotain ni sitten se pätkäsee eikä mitään enää tapahu...what's wrong?
Hidas ruudunkoonmuuttelu aiheuttaa hidastuvuutta. Poista stretchScreen- funkkari ja korvaa sen maininnat SCREEN-funktiolla.
Kiinnostuin pelien tekemisestä ennen 1. luokkaa.
Sitten 3. luokalla tuli CB. Ja siitä se alkoi.

Blender! TF2! CB! Game Maker! Nokia-mollaus! Kitaransoitto! Breakdance! MadTracker! Minecraft!
Harakka
Advanced Member
Posts: 430
Joined: Mon Aug 27, 2007 9:08 pm
Location: Salo
Contact:

Re: CB HyperMachine

Post by Harakka »

Helpompi korjaus: muuta StretchScreen()-funktio tällaiseksi.

Code: Select all

Function stretchScreen(newx,newy,speed = 15)
  Screen newx,newy
End Function
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
Pabnih
Newcomer
Posts: 34
Joined: Thu Sep 20, 2007 3:15 pm
Location: Hirvas

Re: CB HyperMachine

Post by Pabnih »

Nerokasta tuollainen :) Ja kuten sanottu; hieno viritelmä tuo ikkunan koon muuttuminen :)
Post Reply