![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тормоза
Askalot © (2010-06-22 00:38:00)У меня в программе по таймеру каждую секунду совершается масса вычислений в трехмерном массиве 80х60х10 и компьютер сильно тормозит. Я начинающий программист, подскажите, можно ли как то уменьшить тормоза? Например отдавать под каждую переменную ограниченную память, как то очищать память, выставить приоритеты процессору. Если можно, то дайте ссылку на подобную информацию.
Askalot (2010-06-22 15:53:00) [21]
> Омлет
kletka3[i,y,5] - это здоровье дерева
svet - это количество деревьев рядом
если svet>3 то здоровье дерева уменьшается на 1;
если svet>4 то здоровье дерева уменьшается еще на 1;
...
это для светолюбивого дерева, для тенелюбивого наоборот =)
nobody (2010-06-22 15:35:00) [22]Установи профилировщик AQTime и потестируй под ним.
Он тебе покажет узкие места в программе, которые больше всего съедают ресурсов.
Омлет (2010-06-22 15:33:00) [23]> Askalot © (22.06.10 15:30) [46]
Опиши лучше сам алгоритм расчета параметров.
По коду его понять трудно.
Омлет (2010-06-22 15:30:00) [24]А, блин, мы оба неправы. Там же магические числа - 7 пропущено
Askalot (2010-06-22 15:30:00) [25]Да там все что угодно можно написать ) ну вы и команды навыдумывали, я кроме if и for ничего не знаю )
cyber-pilot (2010-06-22 15:28:00) [26]
> [44]
для svet = 7 не подходит, хотя скорее всего исходный алгоритм не корректный )
Омлет (2010-06-22 15:24:00) [27]А круче так:
dec(kletka3[i,y,5], max(2, min(svet, 8)) - 2);
Омлет (2010-06-22 15:22:00) [28]> [42]
вру. невнимателен )
Омлет (2010-06-22 15:21:00) [29]> cyber-pilot (22.06.10 15:19) [40]
Этому тем более не равнозначен ))
Омлет (2010-06-22 15:20:00) [30]тихий ужас...
> cyber-pilot (22.06.10 15:10) [38]
> вот этот код:
> равнозначен этому:
> if svet>=3 then kletka3[i,y,5]:=kletka3[i,y,5]-1;
Нет. Вот этому:
if svet >= 3 then dec(kletka3[i,y,5], min(svet, 8) - 2);
cyber-pilot (2010-06-22 15:19:00) [31]Ой, глючу. Вот этому равнозначен:
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;
RWolf (2010-06-22 15:12:00) [32]
> cyber-pilot (22.06.10 15:10) [38]
не равнозначен.
cyber-pilot (2010-06-22 15:10:00) [33]вот этот код:
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;
И еще несколько похожих мест заметил.
KilkennyCat (2010-06-22 15:08:00) [34]
> Askalot © (22.06.10 14:49) [34]
ок. понятно. напиши точное условие рождения, смерти и скорости роста, и я напишу тебе гораздо более быстрый алгоритм, чем приведенный тобой.
Askalot (2010-06-22 15:07:00) [35]
> RWolf
Ок, сделаю отдельно перевод в число один раз, а то действительно каждый раз делать глупо )
RWolf (2010-06-22 14:56:00) [36]кстати, в строке
kletka3[xxx,yyy,k+1]:=strtoint(objekt[kletka3[i,y,16],k]);этот самый strtoint так ли уж нужен? довольно медленная операция, не для циклов.
Askalot (2010-06-22 14:49:00) [37]
> KilkennyCat
Все дело в том, что мне эти вычисления нужны =) Например деревья растут только вблизи воды, если светолюбивые то не могут расти очень плотно, к тому же они сами размножаются )
Отрисовка у меня происходит примерно так же, в отдельном цикле. В зависимости от возраста дерева меняется номер картинки и записывается в массив, а затем рисуется изображение под этим номером из массива с картинками.
KilkennyCat (2010-06-22 14:16:00) [38]немного забыл: :)
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;
KilkennyCat (2010-06-22 14:13:00) [39]я бы в массиве хранил только дату создания объекта в клетке и тип объекта.
алгоритм был бы такой:
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
Кроме того, отрисовывать только видимую область. И никаких вычислений...
Askalot (2010-06-22 13:35:00) [40]Эххх, как все сложно ( Спасибо всем за помощь, сейчас мануалы почитаю, может разберусь