Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#1: 2012-02-01 21:36:36 ЛС | профиль | цитата
Рисование на Hаndle происходит в 10 раз быстрее!(точнее в 100 раз) Чем на Bitмap в PaintBox. Это то, что мне нужно!!
Подскажите, пожалуйста, как можно очищать поверхность?

code_26726.txt
карма: 0

0
файлы: 1code_26726.txt [2.3KB] [136]
Гость
Ответов: 17029
Рейтинг: 0
#2: 2012-02-01 21:45:24 правка | ЛС | профиль | цитата


Редактировалось 1 раз(а), последний 2025-01-12 10:57:57
карма: 0

0
Ответов: 1429
Рейтинг: 50
#3: 2012-02-01 21:47:23 ЛС | профиль | цитата
г. ость, спасибо!
карма: 0

0
Ответов: 3889
Рейтинг: 362
#4: 2012-02-01 21:53:47 ЛС | профиль | цитата
login писал(а):
в 10 раз быстрее!(точнее в 100 раз)

Это Вы ещё через OpenGL и DirectDraw не пробовали
login писал(а):
Это то, что мне нужно!!

Вот только без синхронизации с частотой кадров монитора будут встречаться эффекты "рваного кадра" и пропадание объектов при анимации, но ради скорости можно и потерпеть. Если отбрасывать не попадающее в обзор, вообще космических скоростей достигните.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#5: 2012-02-01 21:56:15 ЛС | профиль | цитата
1nd1g0, OpenGL пробовал, но с ним мне сложнее работать. Много нюансов.
А что такое DirectDraw, можно пример на HiAsm глянуть?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#6: 2012-02-01 22:03:33 ЛС | профиль | цитата
login, а нет на HiAsm DirectDrawDirect2d, AFAIK. Максимум, я в штатной поставке отрыл библиотеку GDI+ и немного с ней поигрался, работает, но требует много кода на паскале.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#7: 2012-02-01 22:08:19 ЛС | профиль | цитата
1nd1g0, я вспомнил, я пробовал когда-то с точками на Handle рисовать и у меня всё мерцало. Квадратики щас не мерцают, я тогда толком не разобрался, что с этим делать. Анимировать буду дискретно.

C OpenGL сложнее в том, что мне нужно 3 поля одновременно рисовать на одной форме. А там сильно хитрая схема для такого.

3 проблемы сразу решилось! (оптимизация, выделение рамкой - формула Леонида, и Handle - скорость)
Хороший сегодня день
карма: 0

0
Ответов: 3889
Рейтинг: 362
#8: 2012-02-01 22:21:42 ЛС | профиль | цитата
login писал(а):
3 проблемы сразу решилось! (оптимизация, выделение рамкой - формула Леонида, и Handle - скорость)

Вы сделали таки отброс ненужного при отрисовке? Формула у Леонида - простое бинарное представление того, что он и я писали Вам в соседней теме - просто много, очень много сравнений, но от перебора это не избавляет, естественно. При отрисовке на Handle (в реальности вы рисуете на контексте, который получается элементом из Handle, а можете взять контекст с точки onRedraw и рисовать прямо на нём, хотя ускорение будет заметно только на очень слабых машинах, если вообще будет).
карма: 1

0
Ответов: 1429
Рейтинг: 50
#9: 2012-02-01 22:34:17 ЛС | профиль | цитата
1nd1g0 писал(а):
Вы сделали таки отброс ненужного при отрисовке?
так быстро нет, эти три вещи я буду допиливать всю следующую неделю. Просто хорошо, что формула Леонида годится для обоих задач. А с учетом 100кратного прироста скорости рисования, мне теперь всеравно, могу и перебрать все стороны

onRedraw - про это я не понял. Можно пример подключения?
карма: 0

0
Ответов: 8976
Рейтинг: 825
#10: 2012-02-01 23:01:26 ЛС | профиль | цитата
1nd1g0 писал(а):
Это Вы ещё через OpenGL и DirectDraw не пробовали
login писал(а):
А что такое DirectDraw, можно пример на HiAsm глянуть?
1nd1g0 писал(а):
а нет на HiAsm DirectDrawDirect2d
Я под столом
карма: 19

0
Ответов: 1429
Рейтинг: 50
#11: 2012-02-02 10:58:19 ЛС | профиль | цитата
Есть идея, чтобы избежать мерцаний экрана, смикшировать слои изображения во внутреннем буфере PaintBox-а, а затем вывести на Handle готовый кадр. По скорости получается быстро. Но возникла проблема, чем вывести внутренний буфер?
У Img_bmp не реализована отрисовка на handle??

code_26734.txt

карма: 0

0
файлы: 1code_26734.txt [2.7KB] [129]
Ответов: 3889
Рейтинг: 362
#12: 2012-02-02 11:05:05 ЛС | профиль | цитата
login, на редкость извращённый метод, ума не приложу, как это может быть "быстро"
карма: 1

0
Ответов: 1429
Рейтинг: 50
#13: 2012-02-02 12:46:05 ЛС | профиль | цитата
1nd1g0,

Моя логика:
1. мерцание происходит от того, что сначала рисуется кадр с сеткой, затем рисуются квадратики. Глаз успевает это увидеть..
2. Если в буфере складывать квадратики и сетку перед выводом на экран, то получается лучше.
3. Попробовал скорость, скорость хорошая, только выводится не в то окно.


------------ Дoбавленo в 12.43:
Не правильно была составлена схема, теперь работает быстро и не глючит


Add(PaintBox,7129805,833,147)
{
Left=20
Top=45
Width=1015
Height=610
Visible=1
Enabled=1
}
Add(MainForm,13868957,301,294)
{
Width=1116
Height=712
Color=3289650
Position=1
Point(Handle)
link(onCreate,4923369:In,[])
}
Add(StyleXP,16011116,301,336)
{
}
Add(MultiElementEx,584355,672,245)
{
link(Bitmap,13956299:Var2,[(678,225)(839,225)])
link(X3,5097952:Position,[(685,236)(638,236)(638,323)(545,323)])
}
BEGIN_SDK
Add(EditMultiEx,5605638,21,21)
{
WorkCount=#5:doFor|
EventCount=#6:onStop|
DataCount=#6:Bitmap|2:X3|
Width=447
Height=270
link(doFor,3484668:doFor,[(35,27)(35,160)])
}
Add(Img_Rectangle,7686781,371,154)
{
Point2=4587590
Point2AsOffset=0
Color=16777215
BgColor=8404992
Style=1
Point(Point1)
Point(Point2)
link(Bitmap,5605638:Bitmap,[(377,85)(27,85)])
}
Add(Random,7282006,175,154)
{
Max=1000
link(onRandom,16630129:doRandom,[])
}
Add(For,3484668,63,154)
{
End=3200
link(onEvent,7282006:doRandom,[])
link(onStop,6967127:In,[])
}
Add(Random,16630129,217,154)
{
Max=1000
link(onRandom,12381344:doCalc,[])
}
Add(LineBreak,9917735,413,35)
{
link(Out,5605638:onStop,[(455,41)(455,27)])
Primary=[6967127,-301,126]
}
Add(FastMathParse,12381344,273,154)
{
DataCount=3
MathStr="(%1 - %3) * 65536 + %2"
ResultType=0
link(onResult,7686781:doDraw,[])
link(X1,16630129:Random,[(279,142)(262,142)(262,213)(223,213)])
link(X2,7282006:Random,[(286,128)(234,128)(234,198)(181,198)])
link(X3,5605638:X3,[(293,116)(34,116)])
}
END_SDK
Add(TrackBar,5097952,539,280)
{
Left=230
Top=20
Width=590
Max=10000
TickCount=10
Position=800
link(onPosition,12786966:doWork2,[])
}
Add(LineBreak,2991505,455,336)
{
link(Out,10651896:doData,[])
Primary=[4923369,-105,-28]
}
Add(TrackBar,7992853,539,336)
{
@Hint=#21:Сколько тиков масштаб|
Left=1060
Top=65
Width=40
Height=555
Max=200
Min=10
Position=100
Kind=1
link(onPosition,12786966:doWork3,[(592,342)])
}
Add(HubEx,12786966,588,280)
{
link(onEvent,197061:doEvent1,[])
}
Add(DoData,10651896,497,336)
{
Data=Integer(100)
link(onEventData,7992853:doPosition,[])
}
Add(ChildPanel,14291123,763,140)
{
}
BEGIN_SDK
Add(EditMulti,5342240,21,21)
{
VarCount=1
link(Var1,3760931:Handle,[(27,179)(41,179)])
}
Add(Panel,3760931,35,105)
{
Left=50
Top=75
Width=990
Height=585
Point(Handle)
}
END_SDK
Add(Img_Bmp,9022743,763,287)
{
DrawSource=1
link(Bitmap,14291123:Var1,[])
link(SourceBitmap,13956299:Var1,[(776,201)])
}
Add(GetDataEx,13956299,833,196)
{
link(Data,7129805:Bitmap,[])
}
Add(Hub,197061,609,280)
{
link(onEvent1,584355:doFor,[(656,286)(656,251)])
link(onEvent2,9022743:doDraw,[])
}


------------ Дoбавленo в 12.46:
А вот для сравнения скорости, если выводить прямно на PainBox:


Add(PaintBox,7129805,609,140)
{
Left=20
Top=45
Width=1015
Height=610
ParentFont=0
Enabled=1
}
Add(MainForm,13868957,161,280)
{
Width=1116
Height=712
Color=3289650
Position=1
Point(Handle)
link(onCreate,4923369:In,[])
}
Add(StyleXP,16011116,161,322)
{
}
Add(MultiElementEx,584355,609,231)
{
link(Bitmap,7129805:Bitmap,[])
link(X3,5097952:Position,[(622,222)(498,222)(498,309)(405,309)])
}
BEGIN_SDK
Add(EditMultiEx,5605638,21,21)
{
WorkCount=#5:doFor|
EventCount=#6:onStop|
DataCount=#6:Bitmap|2:X3|
Width=447
Height=270
link(doFor,3484668:doFor,[(35,27)(35,160)])
}
Add(Img_Rectangle,7686781,371,154)
{
Point2=4587590
Point2AsOffset=0
Color=16777215
BgColor=8404992
Style=1
Point(Point1)
Point(Point2)
link(Bitmap,5605638:Bitmap,[(377,85)(27,85)])
}
Add(Random,7282006,175,154)
{
Max=1000
link(onRandom,16630129:doRandom,[])
}
Add(For,3484668,63,154)
{
End=3200
link(onEvent,7282006:doRandom,[])
link(onStop,6967127:In,[])
}
Add(Random,16630129,217,154)
{
Max=1000
link(onRandom,12381344:doCalc,[])
}
Add(LineBreak,597604,413,35)
{
link(Out,5605638:onStop,[(455,41)(455,27)])
Primary=[6967127,-301,126]
}
Add(FastMathParse,12381344,273,154)
{
DataCount=3
MathStr="(%1 - %3) * 65536 + %2"
ResultType=0
link(onResult,7686781:doDraw,[])
link(X1,16630129:Random,[(279,142)(262,142)(262,213)(223,213)])
link(X2,7282006:Random,[(286,128)(234,128)(234,198)(181,198)])
link(X3,5605638:X3,[(293,116)(34,116)])
}
END_SDK
Add(TrackBar,5097952,399,266)
{
Left=230
Top=20
Width=590
Max=10000
TickCount=10
Position=800
link(onPosition,12786966:doWork2,[])
}
Add(LineBreak,13220638,315,322)
{
link(Out,10651896:doData,[])
Primary=[4923369,-105,-28]
}
Add(TrackBar,7992853,399,322)
{
@Hint=#21:Сколько тиков масштаб|
Left=1060
Top=65
Width=40
Height=555
Max=200
Min=10
Position=100
Kind=1
link(onPosition,12786966:doWork3,[(452,328)])
}
Add(HubEx,12786966,448,266)
{
link(onEvent,197061:doEvent1,[])
}
Add(DoData,10651896,357,322)
{
Data=Integer(100)
link(onEventData,7992853:doPosition,[])
}
Add(Hub,197061,469,266)
{
OutCount=3
link(onEvent1,7129805:doClear,[(509,272)(509,153)])
link(onEvent2,584355:doFor,[(546,279)(546,237)])
link(onEvent3,7129805:doRefresh,[(564,286)(564,146)])
}


карма: 0

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)