FPS и GDI+

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Lord_Satan
Обычный пользователь
Обычный пользователь
 
Сообщения: 76
Зарегистрирован: 08.12.2001 (Сб) 10:26
Откуда: П.-К.

FPS и GDI+

Сообщение Lord_Satan » 27.02.2006 (Пн) 23:12

1. Не могу найти в простраснствах имён, класс для работы с милесикундами, для реализации сабжа, нашол что-то, но не то

2. Что быстрее ниже приведённый код, или использование пикселей?

Private Sub Draw(ByVal c As Byte)
Dim g As Graphics = Me.CreateGraphics
Dim bm As Bitmap = m_bm
Dim bmData As Imaging.BitmapData = bm.LockBits(m_r, _
Drawing.Imaging.ImageLockMode.ReadWrite, _
bm.PixelFormat)
Dim bytes As Integer = bm.Width * bm.Height
Dim rgbValues(bytes - 1) As Byte
Dim ptr As IntPtr = bmData.Scan0

System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)

For j As Integer = 0 To bm.Height - 1 Step 1
For i As Integer = 0 To bm.Width - 1 Step 1
rgbValues(j * bm.Width + i) = c
Next
Next

System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes)
bm.UnlockBits(bmData)

g.DrawImage(bm, 0, 0)
g.Dispose()
End Sub
Space Ace says: "Whant to be a DREAD courier?"

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.02.2006 (Вт) 11:55

1. Есть такой класс Date он же DateTime
2. не совсем понятно что же хочется получить. Вроде как получается, что все байты заменяются на c? И что есть "или использование пикселей"?
Весь мир матрица, а мы в нем потоки байтов!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 01.03.2006 (Ср) 23:44

Код: Выделить всё
Dim SDate, EDate As Date
Dim TS As TimeSpan

SDate = Now

.......


EDate = Now
TS = EDate - SDate
MsgBox(TS.TotalMilliseconds.ToString)

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 02.03.2006 (Чт) 0:48

работать с двухмерным массивом гораздо удобней, а строка в функции Init:
Код: Выделить всё
PB.Image = New Bitmap(PB.ClientSize.Width, PB.ClientSize.Height, _
        Stride, Imaging.PixelFormat.Format32bppArgb, Ptr)

избавляет от лишнего копирования растра


Код: Выделить всё
Private Sub TestFPS()
        Const КоличествоКадров As Integer = 240
        Dim GVA(,) As Integer
        Dim SDate, EDate As Date
        Dim TS As TimeSpan
        Dim Col, Row, Scr As Integer
        Dim R, G, B, Clr As Integer
        Dim UB0, UB1 As Integer

        GVA = Init(PictureBox1)
        UB0 = GVA.GetUpperBound(0)
        UB1 = GVA.GetUpperBound(1)

        R = 127 : G = 255 : B = 0
        SDate = Now

        For Scr = 0 To КоличествоКадров
            For Row = 0 To UB0
                For Col = 0 To UB1
                    GVA(Row, Col) = Clr
                    Clr = (Clr Xor 170) Xor (Clr << 2)
                    Clr = Clr + 1
                Next Col
            Next Row

            PictureBox1.Refresh()
        Next Scr

        EDate = Now
        TS = EDate - SDate
       
        MsgBox(КоличествоКадров / TS.TotalSeconds & " кадров в секунду" & vbCrLf & _
        "при разрешении " & PictureBox1.ClientSize.Width.ToString & _
        "x" & PictureBox1.ClientSize.Height.ToString, , "Измерение быстродействия")

    End Sub




Код: Выделить всё
Public Function Init(ByVal PB As PictureBox) As Integer(,)
        Dim Stride As Integer
        Dim Ptr As IntPtr
        Dim VideoArray(,) As Integer

        Stride = PB.ClientSize.Width * 4

        ReDim VideoArray(PB.ClientSize.Height - 1, PB.ClientSize.Width - 1)
        Ptr = Marshal.UnsafeAddrOfPinnedArrayElement(VideoArray, 0)
        PB.Image = New Bitmap(PB.ClientSize.Width, PB.ClientSize.Height, _
        Stride, Imaging.PixelFormat.Format32bppArgb, Ptr)
       
        Return VideoArray
        End Function


если не используешь всю область PictureBox, то лучше использовать
PictureBox1.Invalidate(New Rectangle(x, y, w, h))
PictureBox1.Update()
вместо
PictureBox1.Refresh()


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 113

    TopList  
cron