Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];

Вниз

Тормоза   Найти похожие ветки 

 
Askalot ©   (2010-06-22 00:38) [0]

У меня в программе по таймеру каждую секунду совершается масса вычислений в трехмерном массиве 80х60х10 и компьютер сильно тормозит. Я начинающий программист, подскажите, можно ли как то уменьшить тормоза? Например отдавать под каждую переменную ограниченную память, как то очищать память, выставить приоритеты процессору. Если можно, то дайте ссылку на подобную информацию.


 
KilkennyCat ©   (2010-06-22 00:44) [1]

http://www.sdteam.com/?tid=386


 
Askalot ©   (2010-06-22 00:56) [2]

Спасибо, думаю поможет )


 
KilkennyCat ©   (2010-06-22 01:21) [3]

но не зацикливайся на этом, пересмотри массу вычислений, может, там что-то поддается оптимизации, каким-либо предварительным просчетам, таблицам...


 
Германн ©   (2010-06-22 01:27) [4]


> но не зацикливайся на этом

Угу.
Кстати о птичках. А визуализация процесса этих вычислений есть?


 
Askalot ©   (2010-06-22 01:30) [5]

Да. Каждые 0.05 секунды это все рисуется на canvas. Но я нажимаю на кнопку остановления вычислений и тормоза полностью прекращаются, хотя перерисовка канваса продолжается.


 
sniknik ©   (2010-06-22 01:30) [6]

> А визуализация процесса этих вычислений есть?
на что спорить? естественно там же в таймере... а после ссылки так же естественно в поток "уплывет".
а виноват в тормозах как всегда ... приоритет процессора.


 
Германн ©   (2010-06-22 02:08) [7]


> sniknik ©   (22.06.10 01:30) [6]
>
> на что спорить?

Да не на что. Об чём мне с тобой, Коля спорить?
:)
Очевидность проблемы была сама собой понятна. А Костя ещё и помог своей "подсказкой". :)


 
Юрий Зотов ©   (2010-06-22 07:33) [8]

Ох, и намучается же человек с такой "подсказкой"...

> Askalot ©   (22.06.10 00:38)

Если Вы сделаете точно как в статье, то это не поможет. Поэтому прежде, чем использовать эту подсказку, разберитесь по справке с методом Synchronize. Скорее всего, он или не понадобится Вам совсем, или понадобится только для визуального отображения расчетов.


 
Юрий Зотов ©   (2010-06-22 07:39) [9]

Блин. Человек, путающий потоки с процессами, не понимающий назначение метода Synchronize, берется писать статью о классе TThread.

Как только не стыдно!


 
Сергей М. ©   (2010-06-22 09:13) [10]

Толи Карих Архангельского со Фленовым начитался, толи наоборот)


 
RWolf ©   (2010-06-22 09:24) [11]


>  можно ли как то уменьшить тормоза?

оптимизируй алгоритм для как можно более последовательного доступа к данным, чтобы оптимально нагружать кэш процессора.
Грубо говоря, a[1]+a[2]+...+a[10] выполнится быстрее, чем a[1]+a[100000].


 
KilkennyCat ©   (2010-06-22 10:33) [12]

Виноват, каюсь. Я все не читал, нашел первую ссылку в гугле, глянул - табличка со свойствами, методами есть...


 
Ega23 ©   (2010-06-22 10:47) [13]


> путающий потоки с процессами


Stream - поток
Thread - нить
Англо-русский словарь (с)


 
Anatoly Podgoretsky ©   (2010-06-22 11:15) [14]

> Ega23  (22.06.2010 10:47:13)  [13]

Стремнина
Нитина/Шредер


 
Askalot ©   (2010-06-22 11:39) [15]

Ну вы и флудеры =) У меня было три гигантских цикла, сейчас я засунул все в один, думаю что еще можно уменьшить. А если засунуть все это в процесс и дать ему очень высокий приоритет, тормозов меньше будет, и что будет с остальными программами компьютера? )


 
Priority   (2010-06-22 11:57) [16]

>>А если засунуть все это в процесс

А сейчас оно у тебя где?!

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

Гы... становится совсем интересно!

тормозов меньше будет, и что будет с остальными программами компьютера?

"И тогда мы с Сашкой выпили еще Fanta и повесили сервер Cray Jaguar" (С) Реклама

Товарисч! Высокий приоритет процесса не говорит о том, что процессор станет вдруг турбированным. Высокий приоритет процесса говорит о том, что процессу будет отдаваться бОльшее количество процессорного времени. И если твой алгоритм сильно нагружает процессор, то все остальные процессы будут в полном ауте.

*Подстеркательским тоном*: ты ему поставь приоритет THREAD_PRIORITY_TIME_CRITICAL...


 
12 ©   (2010-06-22 11:59) [17]


> Askalot ©   (22.06.10 11:39) [15]

код когда будет?


 
Hip-Hop   (2010-06-22 12:00) [18]

Ну вы и флудеры

Лучше иногда быть флудером, чем самоуверенным ленивым дилетантом.


 
Омлет ©   (2010-06-22 12:04) [19]

Озвучь, что именно вычисляется и зачем.
Скорее всего, можно оптимизировать сами вычисления или подход к задаче.


 
Askalot ©   (2010-06-22 12:05) [20]

Это еще два раза повторяется, все не стал копировать ) Это жизнь дерева.
Я уже как то выкладывал скриншот http://xmages.net/upload/bb2b3524.jpg

for i := 0 to 80 do
begin
for y := 0 to 60 do
begin
if kletka3[i,y,1]>=0 then
begin
if kletka3[i,y,5]>0 then
begin
// изменение основных параметров
kletka3[i,y,2]:=kletka3[i,y,2]+1;
if kletka3[i,y,5]<kletka3[i,y,6] then kletka3[i,y,5]:=kletka3[i,y,5]+1;
if kletka3[i,y,7]<kletka3[i,y,8] then kletka3[i,y,7]:=kletka3[i,y,7]+1;
if kletka3[i,y,4]<=kletka3[i,y,2] then kletka3[i,y,10]:=kletka3[i,y,10]+1;
if kletka3[i,y,2]=kletka3[i,y,3] then kletka3[i,y,5]:=-10;
if kletka1[i,y,1]>-1 then kletka3[i,y,5]:=-10;
// светолюбивость
svet:=0;
if kletka3[i-1,y-1,1]>-1 then svet:=svet+1;
if kletka3[i,y-1,1]>-1 then svet:=svet+1;
if kletka3[i+1,y-1,1]>-1 then svet:=svet+1;
if kletka3[i-1,y+1,1]>-1 then svet:=svet+1;
if kletka3[i,y+1,1]>-1 then svet:=svet+1;
if kletka3[i+1,y+1,1]>-1 then svet:=svet+1;
if kletka3[i-1,y,1]>-1 then svet:=svet+1;
if kletka3[i+1,y,1]>-1 then svet:=svet+1;
if kletka3[i,y,12]=1 then
begin
if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=8 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
if kletka3[i,y,12]=2 then
begin
if svet>=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=8 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
if kletka3[i,y,12]=4 then
begin
if svet<=1 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
if kletka3[i,y,12]=5 then
begin
if svet<=1 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet<=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
end;
// влаголюбивость
voda:=0;
if kletka3[i,y,13]=0 then voda:=1;
if kletka3[i,y,13]=1 then
begin
for k := -4 to 4 do
begin
for t := -4 to 4 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=2 then
begin
for k := -10 to 10 do
begin
for t := -10 to 10 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=3 then
begin
for k := -15 to 15 do
begin
for t := -15 to 15 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=4 then
begin
for k := -20 to 20 do
begin
for t := -20 to 20 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if kletka3[i,y,13]=5 then
begin
for k := -30 to 30 do
begin
for t := -30 to 30 do
begin
if (kletka1[i+k,y+t,1]>-1) and (i+k>0) and (y+t>0) and (i+k<=80) and (y+t<=60) then voda:=1;
end;
end;
end;
if voda<>1 then kletka3[i,y,5]:=kletka3[i,y,5]-5;

// размножение
if kletka3[i,y,10]>=kletka3[i,y,9] then
begin
xr:=0;
yr:=0;
xxx:=i;
yyy:=y;
xr:=round(random(kletka3[i,y,11]*2+1)-kletka3[i,y,11]);
yr:=round(random(kletka3[i,y,11]*2+1)-kletka3[i,y,11]);
xxx:=i+xr;
yyy:=y+yr;
if (kletka1[xxx,yyy,1]<1) and (kletka3[xxx,yyy,1]<1) and (xxx>=0) and (xxx<=wid) and (yyy>=0) and (yyy<=hei) then
begin
kletka3[i,y,10]:=0;
rx:=xxx*45+round(random(20)-40);
ry:=yyy*45+round(random(20)-40);
kletka3[xxx,yyy,1]:=1;
kletka3[xxx,yyy,17]:=rx;
kletka3[xxx,yyy,18]:=ry;
minimap[xxx,yyy,3].Left:=xxx*2;
minimap[xxx,yyy,3].top:=yyy*2;
for k:=1 to 15 do
begin
kletka3[xxx,yyy,k+1]:=strtoint(objekt[kletka3[i,y,16],k]);
end;
end;
end;

end
else
begin
// гниение
kletka3[i,y,14]:=kletka3[i,y,14]+1;
kletka3[i,y,7]:=0;
kletka3[i,y,10]:=0;
// удаление с карты
if kletka3[i,y,14]=kletka3[i,y,15] then
begin
minimap[i,y,3].Left:=-100;
for k := 1 to 100 do
begin
kletka3[i,y,k]:=-1;
end;
end;
end;
end;
end;
end;


 
ixen ©   (2010-06-22 12:25) [21]

можно еще использовать Application.ProcessMessages;
в циклах где идут вычисления помогает работать с другими программами не создавая эфекта зависания


 
Игорь Шевченко ©   (2010-06-22 12:36) [22]

Askalot ©   (22.06.10 12:05) [20]

Как ты только в этом разбираешься...


 
RWolf ©   (2010-06-22 12:54) [23]

вот это твоё kletka3[i,y,5] — сколько раз за цикл оно вычисляется?
не лучше ли вместо крайнего правого индекса сделать запись (тем более, что по смыслу это и есть запись, которая содержит значения каких-то параметров клетки), а дальше один раз за цикл вычислять указатель pKletka = @kletka3[i,y] и дальше работать уже с ним?


 
Askalot ©   (2010-06-22 12:57) [24]


> можно еще использовать Application.ProcessMessages;

Это помогло, но начались тормоза другого плана - похоже все эти вычисления теперь не успевают просчитаться за секунду и рассчитываются только для первой половины деревьев. Когда нажимаю на паузу, то только тогда начинают расти остальные деревья. Сейчас еще поэксперементирую.


 
Askalot ©   (2010-06-22 13:18) [25]


> RWolf

По моему количество вычислений останется тем же, все равно для каждой из 4800 клеток в которой что-то есть придется считать её параметры отдельно. Или же записи вычисляются быстрее массивов?


 
RWolf ©   (2010-06-22 13:22) [26]

ключевое слово — указатель:

> один раз за цикл


 
Юрий Зотов ©   (2010-06-22 13:22) [27]

> Askalot ©   (22.06.10 12:57) [24]

1. Перенесите вычисления в отдельный поток.

2. При создании потока передайте ему хэндл формы.

3. Закончив порцию расчета, поток заполняет его результатами какую-то структуру и через PostMessage (только не SendMessage) посылает форме сообщение WM_USER+100, в нем чере WParam передает адрес этой структуры, а сам считает дальше.

4. В обработчике этого сообщения форма берет из структуры данные и  обновляет картинку.

И все. И никаких таймеров. И никаких зависов. И никаких проблем. И расчет, и визуализация - все работает с максимально возможной скоростью, при этом мешая ни друг другу, ни другим программам.


 
Юрий Зотов ©   (2010-06-22 13:23) [28]

НЕ мешая, конечно.
:o)


 
RWolf ©   (2010-06-22 13:24) [29]

кстати, в настройках проекта Range checking включено? надо отключить.


 
Юрий Зотов ©   (2010-06-22 13:29) [30]


> RWolf ©   (22.06.10 13:24) [29]

При отладке - не надо ни в коем случае. После окончательной отладки - можно.


 
Askalot ©   (2010-06-22 13:35) [31]

Эххх, как все сложно ( Спасибо всем за помощь, сейчас мануалы почитаю, может разберусь


 
KilkennyCat ©   (2010-06-22 14:13) [32]

я бы в массиве хранил только дату создания объекта в клетке и тип объекта.
алгоритм был бы такой:
type
 TPole = record
   Objct : byte;// тип объекта (дерево, трава, вода...)
   Time : integer; //время объекта
end;

begin
var
Pole : array[0..xx, 0..yy] of TPole
...

for x := 0 to xx do //бег по строкам поля
 for y := 0 to yy do  //бег по столбцам поля
   
             // мне пора бежать на работу, поэтому просто опишу
берем Pole[x, y].Time, увеличиваем его на единицу и рисуем на временный битмап из таблицы спрайтов bmp.draw(x, y , arraysprite[Pole[x,y].objct, Pole[x,y].Time])
соответсвенно, arraysprite хранит все состояния.
итого, что мы получили?

for x := 0 to xx do
 for y := 0 to yy do      
    bmp.draw(x, y , arraysprite[Pole[x,y].objct, Pole[x,y].Time])

и итоговый BitBlt

Кроме того, отрисовывать только видимую область. И никаких вычислений...


 
KilkennyCat ©   (2010-06-22 14:16) [33]

немного забыл: :)
for x := 0 to xx do
for y := 0 to yy do begin
   inc(Pole[x,y].Time);
   if (Pole[x,y].Time > умерло и исчезло) then Pole[x,y].Time := 0;
   bmp.draw(x, y , arraysprite[Pole[x,y].objct, Pole[x,y].Time]);
 end;


 
Askalot ©   (2010-06-22 14:49) [34]


> KilkennyCat

Все дело в том, что мне эти вычисления нужны =) Например деревья растут только вблизи воды, если светолюбивые то не могут расти очень плотно, к тому же они сами размножаются )
Отрисовка у меня происходит примерно так же, в отдельном цикле. В зависимости от возраста дерева меняется номер картинки и записывается в массив, а затем рисуется изображение под этим номером из массива с картинками.


 
RWolf ©   (2010-06-22 14:56) [35]

кстати, в строке kletka3[xxx,yyy,k+1]:=strtoint(objekt[kletka3[i,y,16],k]); этот самый strtoint так ли уж нужен? довольно медленная операция, не для циклов.


 
Askalot ©   (2010-06-22 15:07) [36]


> RWolf

Ок, сделаю отдельно перевод в число один раз, а то действительно каждый раз делать глупо )


 
KilkennyCat ©   (2010-06-22 15:08) [37]


> Askalot ©   (22.06.10 14:49) [34]

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


 
cyber-pilot   (2010-06-22 15:10) [38]

вот этот код:


if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=4 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=5 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=6 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
if svet>=8 then kletka3[i,y,5]:=kletka3[i,y,5]-1;


равнозначен этому:
if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;

И еще несколько похожих мест заметил.


 
RWolf ©   (2010-06-22 15:12) [39]


> cyber-pilot   (22.06.10 15:10) [38]

не равнозначен.


 
cyber-pilot   (2010-06-22 15:19) [40]

Ой, глючу. Вот этому равнозначен:


case svet of
 3: kletka3[i,y,5]:=kletka3[i,y,5]-1;
 4: kletka3[i,y,5]:=kletka3[i,y,5]-2;
 5: kletka3[i,y,5]:=kletka3[i,y,5]-3;
 6: kletka3[i,y,5]:=kletka3[i,y,5]-4;
 7: kletka3[i,y,5]:=kletka3[i,y,5]-4;
 >8: kletka3[i,y,5]:=kletka3[i,y,5]-5;
end;



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

Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.005 c
3-1243862381
TheEd
2009-06-01 17:19
2010.09.19
Отображение изменений, внесённых в БД другими пользователями


11-1216304360
neccasalmor
2008-07-17 18:19
2010.09.19
как в компоненте montcalendar выделить интервал дней?


2-1277704401
И. Павел
2010-06-28 09:53
2010.09.19
Общий обработчик ошибок, завершающий программу.


11-1222555772
AnarchyMob
2008-09-28 02:49
2010.09.19
Lazarus и KOL &amp; MCK


2-1277194041
ixen
2010-06-22 12:07
2010.09.19
Фильтрация с задержкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский