Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

Подвисания стелса

тут можно задать вопрос по скриптингу
lemonter
Neophyte
Neophyte
Posts: 37
Joined: 14.05.2011 7:59

Подвисания стелса

Post by lemonter »

В общем смысл такой,5 персов-1 сервер,схожий скрипт копают руду но по разным точкам хотя приносят в 1 точку и так постоянно.
Примерно после часов 6 работы стелса он начинает сииииильно тормозить(по вкладкам долго переходит и тд.), бывает мол программа не отвечает(так пишет винда),но потом нормально, расчухивается секунд через 5.
Засекал в диспетчере задач что по началу стелс ест 11 мегобайт памяти,в конце 29.Вопрос почему и куда ушли эти метры может с этим связано подвисание?Стоит Windows 7.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

начнем с самого главного - какая версия?
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MuDaCk
Apprentice
Apprentice
Posts: 393
Joined: 10.10.2006 0:03
Contact:

Post by MuDaCk »

может быть проблема ещё и в скриптах.
My name is Игорёшка Image
Пишу скрипты за едуImage
lemonter
Neophyte
Neophyte
Posts: 37
Joined: 14.05.2011 7:59

Post by lemonter »

Vizit0r wrote:начнем с самого главного - какая версия?
v3.7.2
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

стучись в асю ко мне, будем разбираться.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
lemonter
Neophyte
Neophyte
Posts: 37
Joined: 14.05.2011 7:59

Post by lemonter »

MuDaCK wrote:может быть проблема ещё и в скриптах.
Логично предположить что нет,ибо только через несколько часов проявляются эффекты тормозов,скрипт просто зациклен копать пока не умрет персонаж,никаких записей в файлы и тд не делает.
Поправочка скрипт в очередной раз застопорился причем сразу на всех персонажах,как обычно в прочем,у 1 персонажа я нашол в журнале сообщение о поломаном предмете по скрипту он должен был бы его выкинуть если в журнале проскочит сообщение которое идет на обычном клиенте при попытке использовать поломанный предмет в стелсе оно не проходит,в журнале просто нет,но и скрипт стопорит после этого.добавил другое сообщение по которому тоже ясно что сломан предмет если не будет проблем значит мой скрипт все таки был кривой)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

чтобы стелс начал тормозить и течь - в скрипте должен быть огромный цикл без задержки. а это надо сильно стараться)
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Venom
Novice
Novice
Posts: 123
Joined: 25.08.2010 14:00

Post by Venom »

Чу, запахло Аоп(ом)...
Miralex
Developer
Developer
Posts: 656
Joined: 11.03.2005 19:12
Contact:

Post by Miralex »

Vizit0r wrote:чтобы стелс начал тормозить и течь - в скрипте должен быть огромный цикл без задержки. а это надо сильно стараться)
C учетом того, что в перехваченном обработчике PascalScripts стоит sleep(0); - это практически не реально :-)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

очень реально
цикл вида

Code: Select all

while true do
begin
какое_то_простое действие, либо несработавшее условие
end;
без задержки внутри - приводит к 100% загружке ядра (либо одноядерного проца) + диким утечкам памяти - течет буквально везде.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Miralex
Developer
Developer
Posts: 656
Joined: 11.03.2005 19:12
Contact:

Post by Miralex »

Vizit0r wrote:очень реально
цикл вида

Code: Select all

while true do
begin
какое_то_простое действие, либо несработавшее условие
end;
без задержки внутри - приводит к 100% загружке ядра (либо одноядерного проца) + диким утечкам памяти - течет буквально везде.

Code: Select all

var a: integer;
Begin
a:=0;
while true do if (a = 1) then exit;
End.
Ничего не течет, ничего не тормозит :wink:
Течь может только если в бесконечном цикле что-то создается, но не освобождается память потом .... например списки, которые часто создают через Create, но забывают потом вызвать конструктор Free, когда этот список уже ненужен :-)

100% загрузка проца (на одноядерках) говорит только о том, что бесконечный цикл Pascal Scripts пытается занимать все процессорное время в случае когда оно не нужно другим приложениям ....

Может на старых одноядерных компьютерах будет слегка притормаживать, но тормозить тоже не должно. Сам тестил sleep(0) и рядом с ним цифра "20" была выбрана опытным путем, чтобы было более менее комфортно на AMD Duron 700 MHz (Windows XP) в то время ...
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

Проверил - действительно, последние версии паскальскрипта (в последних версиях стелса) уже исправлены, утечек даже в таких циклах больше нет.

Это радует.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
lemonter
Neophyte
Neophyte
Posts: 37
Joined: 14.05.2011 7:59

Post by lemonter »

Code: Select all

program mining_ful;
type
ArrayType1 = Array of Word;
var
  kamen : ArrayType1;
  valun : ArrayType1;
  k:integer;
  ctime : TDateTime;
procedure eda();
begin
 useobject($50D6EFE4);
 wait(1000);
 if(findtype($097B,$50D6EFE4)<>0)then
  useobject(findtype($097B,$50D6EFE4));
end;
procedure ugol();
begin
 if(findtype($19B8,backpack)<>0)then
 repeat
 moveitem(findtype($19B8,backpack),0,findtype($19B8,ground),0,0,0);
 wait(1500);
 until(findtype($19B8,backpack)=0);
 if(findtype($0F3B,backpack)<>0)then
 repeat
 moveitem(findtype($0F3B,backpack),0,$53CFDE93,0,0,0);
 wait(1500);
 until(findtype($0F3B,backpack)=0);
end;
procedure instrument();
begin
 if (count($10E7)<2)then
 begin
  useobject($53CE7E83);
  repeat 
  moveitem(findtype($10E7,$53CE7E83),1,backpack,0,0,0);
  wait(500);
  until(count($10E7)>=2);
 end;
 if (count($0E85)<2)then
 begin
  useobject($53CE7E84);
  repeat
  moveitem(findtype($0E85,$53CE7E84),1,backpack,0,0,0);
  wait(500);
  until(count($0E85)>2);
 end; 
end; 
procedure slitki();
begin
 if(findtype($1BF2,backpack)<>0)then
 repeat
 moveitem(findtype($1BF2,backpack),0,$50F2203F,0,0,0);
 wait(1500);
 if (findtype($1BF2,ground)<>0)then
  repeat
  moveitem(findtype($1BF2,ground),0,backpack,0,0,0);
  wait(1500);
  until(findtype($1BF2,ground)=0);
 until(findtype($1BF2,backpack)=0);
end;
procedure musor();                                               
var                                             
i:integer;
begin
kamen:=[$1771,$1772,$1773,$1774,$1775,$1776,$1777,$1778,$1779,$177a,$177b,$177c,$1363,$1364,$1365,$1366,$1367,$1368,$1369,$136a,$136b,$136c,$136d,$08E6,$3B0F];
 for i:=0 to 24 do
 if (findtype(kamen[i],backpack)<>0)then
 repeat
 drophere(findtype(kamen[i],backpack));
 until (findtype(kamen[i],backpack)=0);
end;
procedure kamni();
var 
i:integer;
begin
kamen:=[$1771,$1772,$1773,$1774,$1775,$1776,$1777,$1778,$1779,$177a,$177b,$177c,$1363,$1364,$1365,$1366,$1367,$1368,$1369,$136a,$136b,$136c,$136d,$08E6];
 for i:=0 to 23 do
  if (findtype(kamen[i],ground)<>0) then
  repeat
  ClearJournal;
  ctime:= Now;
  findtype($10E7,backpack);
  useobject(finditem);
  if (InJournalBetweenTimes('System: Этот предмет поломан, отнесите его мастеру',ctime,Now)<>-1) then
  begin
   drophere(finditem);
   wait(3000);
   ClearJournal;
  end;
  wait(500);
  targettoobject(findtype(kamen[i],ground));
  wait(500);
  until ((findtype(kamen[i],ground)=0)or(InJournalBetweenTimes('That is not within your line of sight',ctime,Now)<>-1));
end;
procedure valuni();
var 
i:integer;
begin
valun:=[$1362,$1361,$1355,$1356,$135B,$135A,$1360,$135F];
 for i:=0 to 7 do
  if (findtype(valun[i],ground)<>0) then
  repeat
  useobject(FindType($0E85,backpack));
  wait(500);
  targettoobject(findtype(valun[i],ground));
  wait(500);
  until (findtype(valun[i],ground)=0);
end;
procedure ruda();
begin 
 if (findtype($0F3B,ground)<>0) then
 repeat
 moveItem(findtype($0F3B,ground),1,backpack,0,0,0);
 wait(500);
 until(findtype($0F3B,ground)=0);
end;
procedure kopka();
var i,j:integer;
begin
repeat 
for i:=-2 to 2 do
for j:=-2 to 2 do
 begin
 repeat 
 if (count($0E85)=0)then
 exit; 
 ClearJournal;
 ctime:= Now;
 FindType($0E85,backpack);
 useobject(finditem);
 waitfortarget(500);
 targettotile(1342,(getx(self))+i,(gety(self))+j,getz(self));
 wait(5000);
   if ((InJournalBetweenTimes('System: Этот предмет поломан, отнесите его мастеру',ctime,Now)<>-1)or
  (InJournalBetweenTimes('System: Вы сломали кирка',ctime,Now)<>-1) or 
  (InJournalBetweenTimes('System: Вы сломали великолепная кирка',ctime,Now)<>-1)) then
   begin
   drophere(finditem);
   wait(3000);
   ClearJournal;
   end;
 until (InJournalBetweenTimes('Здесь больше нет руды',ctime,Now)<>-1) or
 (InJournalBetweenTimes('Слишком далеко',ctime,Now)<>-1) or 
 (InJournalBetweenTimes('Вы не видите это место',ctime,Now)<>-1) or
 (Weight+50>350) or (InJournalBetweenTimes('That is too far away',ctime,Now)<>-1);
 musor();
 valuni();
 kamni();
 if (Weight+50>350) then
 exit; 
 end;
 until(weight+50>350);
end;
procedure plavka();
begin
if (findtype($19B9,backpack)<>0) then
 repeat
 useobject(findtype($19B9,backpack));
 targettoobject($543D1795);
 wait(500);
 until(findtype($19B9,backpack)=0);
end; 
begin
repeat
k:=0;
useobject(backpack);
repeat
 repeat 
 NewMoveXY(2315+k,816,true,1,false);
 wait(2500);
 until (((getx(self)=(2315+k-1))or(getx(self)=(2315+k+1))or(getx(self)=(2315+k)))and((gety(self)=(816-1))or(gety(self)=(816+1))or(gety(self)=(816))));
 kopka();
 repeat
 NewMoveXY(2350,839,true,0,false);
 wait(2500);
 until ((getx(self)=2350)and(gety(self)=839));
 repeat
 NewMoveXY(2364,865,true,0,false);
 wait(2500);
 until ((getx(self)=2364)and(gety(self)=865));
 repeat
 NewMoveXY(2362,860,true,0,false);
 wait(2500);
 until ((getx(self)=2362)and(gety(self)=860));
 plavka();
 slitki();
 eda();
 ugol();
 instrument();
 repeat
 NewMoveXY(2350,839,true,0,false);
 wait(2500);
 until ((getx(self)=2350)and(gety(self)=839));
 k:=k+1;
until (k>=15);
UOsay('Циклимся');
until dead;
end.
Вот код скрипта,в общем бывает так что персонаж просто стоит и ничего не делает в журнале когда такое настает то уже нет ничего только мол ворлд сейв и тд.Иногда 5 персонажей на этом скрипте заставляют весь стелс подвисать,при этом 1 персонаж точно ничего не делает хотя скрипт мол работает,бывает даже простое перемещение не выполняется.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

проц двухядерный?
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
lemonter
Neophyte
Neophyte
Posts: 37
Joined: 14.05.2011 7:59

Post by lemonter »

Да
AMD Athlon(tm) II P340 Dual-Core Processor 2.20GHz
Post Reply