Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Näytön nopeuden optimointia

ajv [14.10.2009 20:58:15]

#

Mulla on muutama kuva formilla, joita liikutellaan näppäimillä. Kuvan liikuttaminen tapahtuu tarkastamalla (GetAsyncKeyState()) onko tiettyä näppäintä painettu 50ms välein. Jos on painettu, lasketaan uudet koordinaatit ja päivitetään kuvan sijainti. Kuvia on yhteensä neljä. Kolme niistä on png-kuvia, joissa on läpinäkyvyyttä. Varsinainen ongelma on siinä, että kuvat välkkyvät ja muutenkin ruutu tuntuu tahmaavan jotenkin. Formilta osasin laittaa DoubleBuffered = True, mutta ei tuntunut auttanut yhtään. Osaisiko joku sanoa, miten näytön päivitystä voisi optimoida? Valitettavasti en voi koodia copy/pasteta tähän, kun kyseessä on duunihommeli.

ajv [15.10.2009 23:13:36]

#

Tässä simmpeli testikoodi, joka liikuttelee kahta kuvaa (toinen png-muodossa, toinen gif-muodossa):

Public Class Form1
    Private i, j As Double
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        i = i + 0.1
        j = j + 0.07
        PictureBox1.Location = New Point(250 + 100 * Math.Sin(i), 250 + 100 * Math.Cos(i))
        PictureBox2.Location = New Point(400 + 100 * Math.Sin(j), 150 + 100 * Math.Cos(j))
    End Sub
End Class

Tässä k.o. testiohjelma:
http://ajv.lautatarha.com/tmp/smile.exe
Eli ainakin itellä nuo läpinäkyvyydet hajoilee ihan täysin. Miten tuo kannattaisi tehdä?

Grez [16.10.2009 13:08:40]

#

Sanoisin, että paras ratkaisu olisi käyttää jotain ihan muuta ratkaisua kuin pictureboxeja transparent -taustavärillä. Eihän se toimi järkevästi päällekkäisten kuvien tapauksessa edes vaikka kuvat pysyisi paikallaan.

neau33 [16.10.2009 14:01:41]

#

Moi ajv!

pitäskö sen toimia näin?

Grez [16.10.2009 15:02:53]

#

Veikkaan, että olisi vielä parempi, jos noi ei välkkyisi.

ajv [19.10.2009 06:43:26]

#

@Nea: Tuo on parempi, mutta liike pitäisi tosiaan olla tasaista.

@Grez: mikä olisi parempi ratkaisu? Muodostaa yksi kuva noista kaikista kuvista ja piirtää koko ruutu kerralla? Kuulostaa raskaalta... Tuo hommeli tulee pyörimään sulautetussa kosketusnäytössä (Win CE 6.0), joten ollaan aika kaukana PC:n tehoista.

ajv [22.10.2009 18:23:19]

#

Kokeilin piirtää koko ruudun kerralla:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    i = i + 0.1
    j = j + 0.07
    Dim bm As New Bitmap(Me.Width, Me.Height)
    Dim g As Graphics = Graphics.FromImage(bm)

    Dim bg As Image = test.My.Resources.rantaleijona
    Dim Smiley As Image = test.My.Resources._155px_Smiley_svg

    g.DrawImage(bg, 0, 0, Me.Width, Me.Height)
    g.DrawImage(Smiley, CInt(250 + 100 * Math.Sin(i)), CInt(250 + 100 * Math.Cos(i)))
    g.DrawImage(Smiley, CInt(400 + 100 * Math.Sin(j)), CInt(150 + 100 * Math.Cos(j)))

    Me.BackgroundImage = bm
    g.Dispose()
End Sub

Vilkkuminen häipyi ja toimii ihan hyvin tässä läppärillä. Prosessorikuorma kuitenkin kasvaa ~50% tasolle noilla kuvilla. Lopullinen sovellus on 600x800 kokoinen ja ainakin taustakuva huomattavasti yksinkertaisempi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta