Быстрый попиксельный вывод массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
D8M
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.07.2005 (Ср) 12:45

Сообщение D8M » 27.06.2006 (Вт) 8:30

VT
Непойму я чегото... У меня:
Код: Выделить всё
    mfrm.out.Cls
    mfrm.out.Refresh

Работает в 10 раз быстрее чем:
Код: Выделить всё
mfrm.out.Line (0, 0)-(600, 600), , BF
mfrm.out.Refresh

Как получаеться, что у тебя наоборот?

(при тесте cls это я учел, поставив сразу после .cls вызов .pset).

Поставив там псет ты убил 5000-6000 фпс :cry: Ты хочешь сказать что когда я вызываю cls без последующих граффических операций, на самом деле ничего не отрисовываеться? :? Так это не так! :)

tyomitch
Тоесть сначала CreateCompatibleDc потом CreateDIBSection потом SelectObject, потом в созданный буффер нарисовать тайлы, а потом BitBlt на форму?

А как при помощи RtlFillMemory заполнить весь массив.
Так?
Код: Выделить всё
FillMemory ByVal bBytes(0), UCase(bbytes)*32,255

Непонимаю я немного как сразу весь массив Long заполнить, помоги плиз :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.06.2006 (Вт) 11:27

D8M писал(а):
Код: Выделить всё
UCase(bbytes)*32

жжош.

Что у тебя в массиве bBytes -- байты или лонги?
Изображение

D8M
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.07.2005 (Ср) 12:45

Сообщение D8M » 27.06.2006 (Вт) 15:04

tyomitch
жжош

Угу. :oops: Я просто не пойму как можно заполнить сразу весь массив без цикла. :?

Что у тебя в массиве bBytes -- байты или лонги?

Код: Выделить всё
Dim bBytes() As Long

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 27.06.2006 (Вт) 15:08

:shock:
32!? UCase!? UCase (Long)!? :shock:

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 29.06.2006 (Чт) 0:40

D8M
Чистый псет дает ~36 000 fps. Так что влиять на производительность катастрофически он не должен. А влияет. Отсюда выводы.

Кроме того. Если псет убрать (а рефреша у меня нигде не было), получается:
cls - 266 000 fps. Я не думаю, что с такой скоростью возможно отрисовывать размер 600*600. Если считать, что ОдинПиксель-ОдинТакт, то тактовая частота как минимум 95 Гигагерц. А у меня в процессоре их всего 1.7.
Есть и другая бяка. Если тем же методом прикинуть частоту по скорости работы .line, получается 2.8GHz, что тоже подозрительно и говорит от том, что так прикидывать не совсем верно.

По этому я и хочу сказать, что при вызове .cls реальной отрисовки не происходит.

Есть еще интересное явление. Если создать очень большой PictureBox, со включенным AutoRedraw, то при его создании ничего плохого не происходит. И при .cls - тоже. А вот при вызове pset возникнет ошибка Can't create autoredraw image. Ну, конечно, picturebox должен иметь действительно большие размеры. Думаю, 8000*8000 должнно хватить, вообще зависит от компа.

И еще.
mfrm.Image.Handle меняется после вызова .cls

И еще. Доведу дело до абсурда: проверю на оч. большом рисунке.
Скорость работы одинокого .cls одинакова при размерах 100*100 и 4000*4000. Правда, для .autoredraw=false это не верно - там зависит.
А метод line в применении к picturebox размером 4000*4000 дает уже всего 10fps, что говорит о том, что отрисовка действительно происходит. А cls+pset дают лишь 2,5fps при этом же размере (видимо падает, так как приходится еще и выделять память каждый раз).

VT
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 22.06.2006 (Чт) 16:31
Откуда: Санкт-Петербург

Сообщение VT » 02.07.2006 (Вс) 22:34

ВНИМАНИЕ. Кто скачивал Lichita.rar моего авторства! Я нашел у себя вирус! Win32.Sality.e. По сему, просканируйте компьютер на вирусы.

И извините за невнимательность.

Саша_ОР
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 08.01.2006 (Вс) 19:48

Сообщение Саша_ОР » 16.09.2007 (Вс) 8:42

Люди, а как с помощью SetDIBitsToDevice переворачивать картинку на прямой угол, а то у меня изображение вверх ногами?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 16.09.2007 (Вс) 9:47

Саша_ОР
Если картинка "вверх ногами", то поворот на прямой угол не поможет. А SetDIBitsToDevice всего лишь отображает массив на экран. Если картинка "вверх ногами" - поменяй в массиве строки местами.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 10:08

В WinNT для поворота картинки есть функция PlgBlt.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.09.2007 (Вс) 14:49

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.09.2007 (Вс) 15:20

Так это выйдет вверх ногами, а хотят будто бы на прямой угол?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.09.2007 (Вс) 15:23

а то у меня изображение вверх ногами?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Саша_ОР
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 08.01.2006 (Вс) 19:48

Сообщение Саша_ОР » 01.05.2008 (Чт) 21:09

Спасибо! Минусы перед высотой делают свое дело... :wink:

А то следующий код, меняющий строки, мне очень не нравится: :x

Код: Выделить всё

  'медленно, но верно...
  Dim N As Long: N = -1
  Dim t As Long
  t = screen_width * screen_height + screen_width
  For y = 0 To screen_height - 1
    t = t - screen_width * 2
    For x = 0 To screen_width - 1
      N = N + 1
      memory32draw(N) = memory32(t)
      t = t + 1
    Next x
  Next y

Пред.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 22

    TopList