Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.31;
Скачать: CL | DM;

Вниз

Надо ли???   Найти похожие ветки 

 
drake ©   (2002-12-22 23:58) [0]

Решил написать Life-подобную прогу, использовал поначалу канвас,
но по мере увеличения количества клеток столкнулся с приличными тормозами графики, есть маза поменять приоритет программы на более высокй, но это черевато неприятными последствиями и глюками винды, а можно и переписать вывод графики под Opengl, так вот вопрос: что лучше сделать???


 
HardClubber ©   (2002-12-23 00:02) [1]

Определённо одно - изменение приоритета не повлечёт решения проблемы.
Проблема либо с математикой, либо и впрямь стоит опробовать GL


 
drin ©   (2002-12-23 03:37) [2]

Лудьше и удобнее переходить на DirectX, только не используя там всякую фигню типа DelphiX


 
MBo ©   (2002-12-23 06:38) [3]

Дело отнюдь не в приоритете, а в алгоритме вывода. Для подобных игр производительности методов Canvas хватит за глаза, надо только для исключения мерцания выводить все на битмап в памяти, а потом Draw его на форму.


 
drake ©   (2002-12-23 17:15) [4]

В математикой всё ок, мерцания нет, но имеются жуткие тормоза при
отрисовке попиксельно 400х400 массива клеток, видно прям как идёт полоска перерисовки :( А чем opengl тут будет хуже directx??


 
MBo ©   (2002-12-23 17:35) [5]

>выводить все на битмап в памяти
пробовал?


 
drake ©   (2002-12-23 17:40) [6]

А КАК:)?


 
MBo ©   (2002-12-23 17:56) [7]

b:=Tbitmap.Create;
b.height:={Form1.}ClientHeight;
...
куча рисования на b
...
Canvas.Draw(0,0,b)


 
Бурундук   (2002-12-23 18:08) [8]

Добавление:
Самые большие тормоза происходят при
присвоении св-в кисти и перу.
Попробуй создать заранее нужные перья/кисти и вместо
//Bitmap.Canvas.Brush.Color := clRed;
делать
Bitmap.Canvas.Brush.Assign(RedBrush);



 
drake ©   (2002-12-23 19:02) [9]

Попробовал оба способа....
Результат : при выводе на виртуальный имаг с последуюшим
переносом на канвас результата никакого 12-13fps как и было
2) Попробовал создать разные кисти заранее - fps просел до 8 :(
Пока что самый быстрый вариант у меня с самого начала был ,
похоже придётся сесть разучивать directX :)


 
sniknik ©   (2002-12-23 19:19) [10]

еще совет если позволите, отрисовку самих клеток тоже делай через Canvas.Draw(x, y, BitMask), естественно сначала нарисуй шаблоны. И над математикой подумай (не верю что она у тебя идеальна) может на asm расчеты делать?.

а directX вряд ли поможет, ну не для этого он, по моему.


 
drake ©   (2002-12-23 19:46) [11]

ну почему не для??? посмотри прогу Life32 там массив клеток миллион на миллион и работает очень быстро и прога эта юзает для
вывода графики directX вот так.


 
sniknik ©   (2002-12-23 20:23) [12]

Посмотрел,
там в опциях есть галочка Enable DirectX, так вот при обоих положениях этой галочки скорость отрисовки (у меня) одинакова.
скачивал
Life32 v2.15
с http://life32.lifepatterns.net
чегото мне кажется что единственное оправдание этой галочки ссылка внизу "скачать DirectX" (на правах рекламы).

но это конечно мое личное мнение.


 
drake ©   (2002-12-23 22:00) [13]

хз у меня тоже примерно одинаковые скорости что с галкой, что без неё, но как шустро она пашет-то ;) мне бы исходнички её =)
тем более что писана она на дельфах 3


 
sniknik ©   (2002-12-23 22:31) [14]

Еще в а голову пришло, элементарно конечно а вдруг у тебя не так.
Смысл. Рисовать не все подряд, а только если в клетке произошли изменения.

и насчет математики, как думаеш сколько занимает общет "миллион на миллион"? поставь у себя такой масив (если получится) и отключи вывод нахрен. (посмотреть на чистое время расчета)


 
down   (2002-12-23 22:54) [15]

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


 
Danlicha ©   (2002-12-23 22:58) [16]

Да что вы ерундой занимаетесь, пардон. Во-первых, лайф красивее, когда она не по пикселям, а по довольно большим квадратикам. Их ещё можно разными цветами разукрашивать - ворзаст. А если уж припёрло по пикселям - не нужно никакого DirectDraw - берёте битмап, делаете его DIB, получаете адрес его в памяти и рисуете туда. И не надо никакого асемблера!


 
sniknik ©   (2002-12-24 08:34) [17]

Danlicha © (23.12.02 22:58)
Про пикселя никто не говорил, с чего ты взял? Есть такое понятие, область просмотра, и размер клеток каой хочется такой и ставится. Ты ветку вообще читал, что обсуждается?


 
jfo ©   (2002-12-24 09:45) [18]

Хм года 2 назад писал подобную прогу... скорость достаточно высокая... правда и поле не сильно большое... если бы была возможность выложить в кладовку (не выкладывается) выложил бы :-)


 
AlexT1000   (2002-12-24 11:30) [19]

ты однозначно что то неправильно делаешь.
пересчитывать вообще нужно только, те которые будут в данный момент видны на экране.
и соответсвенно рисовать только их .
во вторых есть пару трюков которые ускоряют вывод на канву формы и убирают мерцание
procedure WMErase(var msg:TMessage); message WM_ERASEBKGND;
procedure TFormImage.WMErase(var msg: TMessage);
begin
msg.Result := 1;
end;
это раз. во вторых как говорил MBO рисовать все на битмап в памяти а потом гнать на форму.
ну и естественно заготовить текстуры квадратиков заранее и просто делть bitblt их на битмап.
вот такт то.


 
Snap ©   (2002-12-24 11:35) [20]

А не прдкинете примерчик работы с DIB?


 
dRake ©   (2002-12-24 14:28) [21]

Вот вывод на битмап в память с последующим выводом на канвас
мне реально помог,исчезло моргание, я посмотрел - математика
реально почти не влияет - что миллион на миллион, что 100Х100
разницы почти нет(если графику отключить), а вот графа реально просаживает машину, попробую попросить другана через GL вывод графики делать... Кстати никто не подскажет, можно ли как-нибудь
быстрее выводить графику, не использую методы канваса, используя например winAPI или что-нибудь подобное??


 
dRake ©   (2002-12-24 14:31) [22]

>procedure WMErase(var msg:TMessage); message WM_ERASEBKGND;
>procedure TFormImage.WMErase(var msg: TMessage);
>begin
> msg.Result := 1;
>end;

2 AlexT1000 : А ты не прокоментируешь, что делают эти процедуры??


 
dRake ©   (2002-12-24 14:45) [23]

Ещё просьба, если кто-то писал похожую игру: киньте пожалуйста исходники мне на мыло, буду очень признателен :)


 
sniknik ©   (2002-12-24 17:09) [24]

dRake © (24.12.02 14:28)
>а вот графа реально просаживает машину

а если сделать многопоточным? реальный способ разгрузить процесс.


 
AlexT1000   (2002-12-24 18:17) [25]

> dRake

насколько я помню эта процедура как следует из ее имени отрабатыет очистку бэкграунда формы . если возвращать 1 то ты типа сам отвечаешь за очистку этой формы. иначе винды.
что то в этом роде.
вообщем несколько устраняет блыманье



 
dRake ©   (2002-12-24 23:04) [26]

2 AlexT1000
Кстати играет какую нибудь роль то, что я вывожу не на канву формы,а на канвас paintbox"а??


 
AlexT1000   (2002-12-26 12:10) [27]

да . на канвас формы наиболее быстро. и помогает та штука,
которую я тебе написал


 
dRake ©   (2002-12-26 23:10) [28]

лана пусть живёт прога как есть, а я лучше щас фрактальчиками займусь :)



Страницы: 1 вся ветка

Текущий архив: 2003.03.31;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
3-100192
Sectey
2003-03-13 15:15
2003.03.31
Код ошибки


3-100143
pa\/el
2003-03-12 10:17
2003.03.31
Экзотическая БД


1-100230
hawkins
2003-03-20 10:33
2003.03.31
Как сделать обработчик события OnMouseMove у компонента QuickRep?


14-100407
Makhanev A.S.
2003-03-13 19:22
2003.03.31
Список языков...


8-100340
Hirara
2002-12-25 22:08
2003.03.31
Tess - объекты