HPC.ru lite - Все форумы
Форум: Программирование для КПК
Тема: "продвинутое рисование на форме"
Страницы: [1] 2
[Ответить]
apachik [12.04.2006 03:48] "продвинутое рисование на форме":
дано:
VS 2005 NET CF
нужно:
каждую секунду рисовать много-много всего на экране и так, чтобы не моргало.
идея:
если просток каждую секунду перерисоваывать, будут тормоза и моргания экрана. а ведь можно и так: каждую секунду начинаем рисовать, но не по форме, а по какому нибудь битмапу (пусть на это уйдет даже 0.1с) потом мгновенно меняем изображение на экране на наш битмап и получаем то что хотели (нет моргания)
вопрос: как это сделать?
ВадимП [12.04.2006 04:10] :
плохая идея
apachik [12.04.2006 17:17] :
ну предложи другую тогда. мне не так важно, чтобы изображение мгновенно прорисовывалось, нужно чтобы оно быстро менялось и не было мерцания экрана.
нужно типа двойная буферизация вывода на экран. как это делается?
Ginger [12.04.2006 17:22] :
ВадимП писал(а):
плохая идея
Акуеннограмматный ответ! Жаль, что я так не могу! =)
В который раз уже убеждаюсь, что от этого товарисча не бывает толковых ответов - умен больно, блин, не для нашего уровня!
А по твоему вопросу, я бы хотел добавить, что под .Net ничего нельзя писать критичного по времени - уж больно много у нее прослоек (сюда же входит и без нее не быстрый GDI), пока до железа дойдет - пройдет столько времени, что даже человеку заметно.
Для организации backbuffer я бы посоветовал GAPI или на худой конец BITMAP из GDI, хотя полседний так же очень медленный, что бы через него рисовать быстро на экране.
ВадимП [12.04.2006 19:17] :
apachik писал(а):
нужно типа двойная буферизация вывода на экран. как это делается?
Вот именно - нужна именно двойная буферизация. Могу рассказать как это делается для Linux-КПК и сильно сомневаюсь, что ее нет на winmobile.
sshd [12.04.2006 22:06] :
а почему ты тогда сказал "плохая идея"? 
он вроде и описал двойную буферизацию:
"рисовать на битмапе, а потом выводить на экран"
apachik [13.04.2006 00:27] :
Ginger писал(а):
А по твоему вопросу, я бы хотел добавить, что под .Net ничего нельзя писать критичного по времени - уж больно много у нее прослоек (сюда же входит и без нее не быстрый GDI), пока до железа дойдет - пройдет столько времени, что даже человеку заметно.
Для организации backbuffer я бы посоветовал GAPI или на худой конец BITMAP из GDI, хотя полседний так же очень медленный, что бы через него рисовать быстро на экране.
про тормознутость я знаю, но она меня вполне устраивает.
ну и пусть медленно рисует, мне нужно чтобы быстро меняло.
времени изучать GAPI совсем нету (я пробежался и понял, что там много всего всего).
с битмапом вроде попроще работать будет?
только вот мне на нем не отдельные пиксели ставить, а фигуры рисовать с заливкой, писать самому эти функции понятное дело подходит.
много кода нужно для реализации двойной буферизации?
научите пожалуйста! я в программировании под КПК совсем новичек, справку VS, MSDN читать на англ. не напрягает, но вот разбираться с новой технологией времени вообще нет.
ВадимП [13.04.2006 01:40] :
sshd писал(а):
а почему ты тогда сказал "плохая идея"? 
он вроде и описал двойную буферизацию:
"рисовать на битмапе, а потом выводить на экран"
Насколько я понял первоначальное предложение, речь шла о формировании изображения в некотором буфере в системной памяти, которое затем обычной memcpy() копируется в кадровый буфер видеокарты (который у большинства КПК также находится в системной памяти).
Этот процесс, синхронизированный по времени с сигналом вертикального обратного хода луча (луча, правда, в LCD-мониторах давно нет, но сигнал остался), тоже иногда называли раньше двойной буферизацией.
Но сейчас этот термин всё-таки больше закрепился за тем, что в стародавние времена обзывали "page flipping":
Double Buffering means that there are two display buffers. This means that the next image can be drawn in the page of the display buffer, which is initially invisible. This image is displayed once it is ready and the next image is prepared in the other page of the buffer. Animation's and games can be made to look more realistic with this technique than in simple single buffer mode.
И я не вижу абсолютно никаких преимуществ в первом предложенном варианте - напротив, только недостатки в частности за счет дополнительных потерь времени на копирование.
Переключать буфера на мой взгляд гораздо удобнее и проще.
(никаких проблем с созданием необходимого числа буферов и свободным переключением между ними, по крайней мере, на Linux-КПК нет - начало отображаемой части видеопамяти определяется указателем screen_base, который используется низкоуровневым драйвером кадрового буфера).
Ginger [13.04.2006 10:14] :
Про CF не скажу так ли это делается или нет, но для GDI выглядит все просто:
HDC memDC = CreateCompatibleDC ( hDC );
HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
SelectObject ( memDC, memBM );
hDC - как понимаешь, тот DC в котором должен быть виден конечный результат пользователю.
Все теперь можешь рисовать на memDC, а результат будет храниться в memBM.
Когда заканчиваешь рисовать, то BitBlt копируешь memDC на тот DC который у тебя на экране. все.
apachik [13.04.2006 10:58] :
мне на другом форуме подсказали:
artko писал(а):
2 *apachik*:
ну вы даете. а доки читали?
class my_control : Control
{
....
protected override OnPaint(PaintEventArgs e)
{
Bitmap bmp_buffer = new Bitmap(this.Width, this.Height);
Graphics gr_buffer = Graphics.FromImage(bmp_buffer);
... рисуем по gr_buffer....
e.Graphics.DrawImage(bmp_buffer, 0, 0);
}
}
работает
. только вот DrawImage тормозит. можно побыстрее сделать?
[Ответить]
[Вперед >]