Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тормоза


Страницы:   1 2 3 4

Askalot ©   (2010-06-22 00:38:00) 

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


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


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

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


RWolf   (2010-06-22 13:24:00) [42]

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


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

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


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

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

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

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

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

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

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


RWolf   (2010-06-22 13:22:00) [45]

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

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


Askalot   (2010-06-22 13:18:00) [46]


> RWolf

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


Askalot   (2010-06-22 12:57:00) [47]


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

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


RWolf   (2010-06-22 12:54:00) [48]

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


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

Askalot ©   (22.06.10 12:05) [20]

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


ixen   (2010-06-22 12:25:00) [50]

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


Askalot   (2010-06-22 12:05:00) [51]

Это еще два раза повторяется, все не стал копировать ) Это жизнь дерева.
Я уже как то выкладывал скриншот 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;


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

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


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

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

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


12   (2010-06-22 11:59:00) [54]


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

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


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

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

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

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

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

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

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

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

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


Askalot   (2010-06-22 11:39:00) [56]

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


Anatoly Podgoretsky   (2010-06-22 11:15:00) [57]

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

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


Ega23   (2010-06-22 10:47:00) [58]


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


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


KilkennyCat   (2010-06-22 10:33:00) [59]

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


RWolf   (2010-06-22 09:24:00) [60]


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

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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо