![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Georgich |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 20.1.2008 Репутация: нет Всего: нет |
Приветствую.
В общем, такая проблема. Есть метод отрисовки луча по пикселям:
Отрисовывает он не особо-то и быстро. Решил попробовать заменить на LockBits. Сделал таким образом:
И получил вообще тормоза. Дело в том, что он при отрисовки нужных мне пикселей, отрисовывает и остальные пиксели черным цветом. И так при каждой перерисовке. Можно ли этого как-то избежать? Может, действительно, LockBits будет пошустрее выводить тогда изображение? Спасибо. |
||||
|
|||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Georgich, если еще актуально...
может, как-то так? -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
Georgich |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 20.1.2008 Репутация: нет Всего: нет |
Experimenter, спасибо, что заглянули в тему.
Все так же тормозит. SetPixel пока превосходит данные пляски по скорости. Неиспользуемая часть битмапа отрисовывается черным цветом. И, так как она отрисовывается в каждом шаге, то и получаются тормоза. Скорости отрисовки я стараюсь добиться максимальной, так как придется еще получать данные из usb на скорости около 25 Мб/сек, обработать эти данные и по ним уже отрисовать картинку. |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Georgich, хм, думается, что проблема не в отрисовке, через LockBits должно работать быстрее
Я сделал замеры, и получается, что LockBits при первом вызове метода срабатывает раза в три быстрее, при последующих - примерно в 10 раз быстрее. Код:
Хотя и через SetPixel счет идет на миллисекунды, тормозов не наблюдаю. Судите сами. -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
Georgich |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 20.1.2008 Репутация: нет Всего: нет |
Experimenter, спасибо за код. В скорости LockBits я убедился. Дабы не быть голословным в том, что в моем коде что-то тормозит, прикладываю исходники. Посмотрите их, пожалуйста, если вам не составит труда. Возможно, они прояснят то, что я пытаюсь объяснить.
P.S. Сейчас там сделано через LockBits, но если вы закомментируете этот кусок и расскоментируете кусок с SetPixel, то увидите разницу. Спасибо. Присоединённый файл ( Кол-во скачиваний: 6 ) ![]() |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Georgich, посмотрел код. Вы в цикле лочите битмап, отсюда и задержки. Попробуйте вынести LockBits в обработку события Timer_Tick
-------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
А какая сама задача? Почему просто не воспользоваться GDI+? Или если надо самому по какой-то причине, то есть быстрые алгоритмы рисования линий. Начать можно с Брезенгама.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Georgich |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 20.1.2008 Репутация: нет Всего: нет |
Experimenter, да, спасибо. Действительно надо было вынести в Timer_tick.
Но, остается другой вопрос: остальной фон - черный. Можно ли как-то от него избавится, чтобы его не перерисовывать? |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Georgich, думаю, что битмап сначала нужно "нарисовать" в конструкторе или где-то еще до запуска таймера, ведь вы оперируете с BitmapData, и туда при блокировании битмапа передаются сплошные нули (черный цвет), если с битмапом ничего не делалось после его создания.
-------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
Georgich |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 20.1.2008 Репутация: нет Всего: нет |
Experimenter, так, вроде, в конструкторе формы я и отрисовываю:
Что-то не так? |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Georgich, добавьте в конструктор еще одну строку:
и увидите, что у вас в битмапе -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
Georgich |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 20.1.2008 Репутация: нет Всего: нет |
Experimenter, сделал так, закомментил эту же строку в Timer_Tick. При загрузке формы весь pictureBox прозрачный. Нажимаю на кнопку - черный фон. Не могу сейчас осознать до конца этот момент.
|
|||
|
||||
Experimenter |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Georgich, сравните два конструктора битмапа:
В вашем коде в конструкторе формы неявно вызывается именно первый, можете рефлектором посмотреть. Отсюда и прозрачный фон. -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
||||
|
|||||
Georgich |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 20.1.2008 Репутация: нет Всего: нет |
Experimenter, спасибо за разъяснение про "закулисие".
Так, собственно, а как от черного фона-то избавится при формате в 24 бита? Вот это мне не ясно. |
|||
|
||||
Experimenter |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 430 Регистрация: 8.5.2007 Где: Уфа Репутация: 8 Всего: 17 |
Georgich, ну, например, создать изображение с фоном формы.
Это сообщение отредактировал(а) Experimenter - 8.2.2011, 14:10 -------------------- public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){ if(zlo1 < zlo2) return zlo1; else if(zlo1 > zlo2) return zlo2; else throw new Exception("Kill yourself by the wall"); } |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |