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

Вниз

проблема с памятью   Найти похожие ветки 

 
Crusader ©   (2004-01-24 04:01) [0]

Пишу я игрушку на делфих для делфи7, в ней использую динамические списки (класы ещё не раздуплил и вообще в Длефи не силён) с чем-то вроде этого
type
kto=^person;
person=record
x,y:integer;
next:person;
end;
var kto1:kto;
потом new(kto1); и т.д.
И вот какая запара - если на карте пораставлять слишком много врагов(больше 10), то скоро это всё дело подвисает (не сразу - через 10-20 секунд) и матюкается на меня по поводу памяти. А ведь при 10 всё работает отлично! Оказывается, это всё dximagelist и dxwavelistы виноваты - жрут много памяти, и мои указатели дивным образом начинают указывать не туда куда надо. Тож может есть способ как распределять память аккуратнее, чтоб всем хватало, и не надо было б отказываться от списков?


 
Digitman ©   (2004-01-24 13:38) [1]


> класы ещё не раздуплил


а, может, и не стОит ? коль околодоминошный жаргон все чаще вспоминается ?


> Оказывается, это всё dximagelist и dxwavelistы виноваты
>


с чего ты взял ?


> мои указатели дивным образом начинают указывать не туда
> куда надо


значит, ошибибок куча в твоей программе


> может есть способ как распределять память аккуратнее


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


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


кто ж от тебя требует от них отказываться ? если это оправдано целевой логикой, то пусть списки продолжают жить в твоей программе !


 
crusader ©   (2004-01-24 14:20) [2]

Не разу не слышал это слово за столом домино. Сам придумал?

> Оказывается, это всё dximagelist и dxwavelistы виноваты
>

с чего ты взял ?

//

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


 
Digitman ©   (2004-01-24 14:57) [3]


> если добавить


если добавить, если убавить ...

надолго твоего терпения экспериментировать хватит ?

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


 
Anatoly Podgoretsky ©   (2004-01-24 15:11) [4]

Что то сомнительно, чтобы компилятор смог откомпилировать эту бесконечную рекурсию

person=record
x,y:integer;
next: person;
end;


 
Digitman ©   (2004-01-24 15:24) [5]

PPerson = ^TPerson;
TPerson = packed record
x,y:integer;
next: PPerson;
end;


 
авфы   (2004-01-25 02:14) [6]

Правильно, PACKED RECORD нужно использовать!


 
MrAngel   (2004-01-25 02:20) [7]

В твоём случае должно быть не
kto=^person;
person=record
x,y:integer;
next:person;
end;


а


kto=^person;
person=record
x,y:integer;
next:kto;
end;


 
Iyeh   (2004-01-25 02:26) [8]

> MrAngel
Ты чего, "kto" - это тип-пойнтер record"a "person".
Твой способ еще хуже, чем представленный...


 
MrAngel   (2004-01-25 04:46) [9]

Всё верно kto это поинтер. Т.е. next в моём случае будет являться указателем на следующий элемент списка.

У меня всё верно 100% - сам не раз подобные задачи решал.


 
nexxiss ©   (2004-01-26 00:44) [10]

MrAngel полностью прав. Поле Next является самым обыкновенным указателем на следующий элемент, иначе и быть не может.

Правильно, PACKED RECORD нужно использовать!

Это тут непричем. Работа с Packed record немного медленнее.
Ошибка была при объявлении структуры.


 
Iyeh   (2004-01-26 01:23) [11]

> MrAngel
Точно, это я напутал, так и надо, но еще: зачем же извращаться с именами? Нужно так пойнтер назвать - PPerson, а тип - TPerson.
> nexxiss ©
Нет, надо использовать PACKED RECORD, попробуй сотню спрайтов так создать, помяти пожрет кучу, а вожможно вообще не запустится - сам в своих играх убедился. Help почитай...

Короче, правильно ответил Digitman ©, ему и респект!


 
Iyeh   (2004-01-26 01:25) [12]

> MrAngel
Точно, это я напутал, так и надо, но еще: зачем же извращаться с именами? Нужно так пойнтер назвать - PPerson, а тип - TPerson.
> nexxiss ©
Нет, надо использовать PACKED RECORD, попробуй сотню спрайтов так создать, помяти пожрет кучу, а вожможно вообще не запустится - сам в своих играх убедился. Help почитай...

Короче, правильно ответил Digitman ©, ему и респект!


 
Digitman ©   (2004-01-26 09:39) [13]

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


 
MrAngel   (2004-01-26 16:36) [14]

> Iyeh -
Ну это я так, чтобы понятно было, задавшему вопрос.


 
Iyeh   (2004-01-27 01:04) [15]

> Digitman ©
Разницы никакой, но непрофессионально очень :(


 
Crusader ©   (2004-01-29 08:35) [16]

Вобщем мораль такова, что Packed Record лучше (хотя я не знаю, чем они различаются), пасибо за хелп.


 
ak   (2004-01-29 10:54) [17]

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


 
Alex44   (2004-01-29 11:32) [18]


> ak
respect


 
Digitman ©   (2004-01-29 13:36) [19]


> Crusader © (29.01.04 08:35) [16]


> Вобщем мораль такова, что Packed Record лучше (хотя я не
> знаю, чем они различаются),


в общем мораль-то ты как раз и не понял

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


 
nexxiss ©   (2004-01-29 16:38) [20]

Вот хелп из Delphi:

Instances of a structured type hold more than one value. Structured types include sets, arrays, records, and files as well as class, class-reference, and interface types. Except for sets, which hold ordinal values only, structured types can contain other structured types; a type can have unlimited levels of structuring.

By default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage. For example,

type TNumbers = packed array[1..100] of Real;

Using packed slows data access and, in the case of a character array, affects type compatibility (for more information, see Memory management).

> Нет, надо использовать PACKED RECORD, попробуй сотню спрайтов так создать, помяти пожрет кучу, а вожможно вообще не запустится - сам в своих играх убедился. Help почитай...

Вот сам и почитай, тогда и советуй.


 
nexxiss ©   (2004-01-29 16:41) [21]

Памяти жрет меньше, но работает медленнее. Вот и вся разница.


 
K.o.Z ©   (2004-01-29 22:35) [22]

опять двадцать пять... "ещё не раздуплился", зато игру пишем...


 
lyeh ©   (2004-01-30 01:03) [23]

> nexxiss ©
Дык ясно, что замедляется, только ты уж точно не заметишь разницы, какое приложение не пиши... Если в игре, то скорее железо замедлит скорость, но не доступ к памяти...

> K.o.Z ©
Согласен :)


 
Crusader ©   (2004-02-07 11:47) [24]

Ну не раздуплился, ну не знал, чем пэкт рэкорд от обычного отличается, ну и что? Это ж не значит, что я совсем ничего не умею! Кстати, оно у меня глючило из-за того, что я забыл обнулить переменную (стыдно). Но игрушку я всё-таки сделал. Аркада с небедовой скоростью (на компах круче 800Mhz даже порой невыносимо быстрой), правда ИИ туповат, но это не особо заметно. Как освою html, то обязательно выложу и похвастаюсь :).


 
Digitman ©   (2004-02-07 13:10) [25]


> не раздуплился


> с небедовой скоростью



> похвастаюсь


может, не надо , а ?
ты уже похвастался блестящими познаниями доморощенного тинейджерского жаргона)


 
Crusader ©   (2004-02-08 14:28) [26]

ту Digitman
Что же для тебя тинейджерский жаргон сродне мату, или ты просто призираешь подобных мне тинейджеров?


 
alex_*** ©   (2004-02-11 11:06) [27]


сродне мату

глаза просто режет и отвлекает от темы.


 
Defunct   (2004-02-12 06:50) [28]

> Crusader © (08.02.04 14:28) [26]
> ту Digitman

2 Crusader: ty - сокращение Thank You
было б интересно взглянуть на шедевр (переменные kto? person at X,Y, сразу видно фундамент полноценной аркады), а что до классов - не беда, что не "раздуплил", если ассемблер знаешь, там классы не нужны. И мой тебе совет, переходи с Delphi на C, пока не поздно. Потом будет сложнее (именно из-за Delphiшных классов).

Совет по оптимизации игры:
списки можно сделать двунаправленными
PPerson = ^Person
TPerson = Record
X,Y : Integer;
Next, Prev : PPerson;
End;

А можно даже так:
TPerson = Record
X,Y : Integer;
End;

Persons = Array of TPerson; { И динамический список готов }

а дальше
SetLength(Persons, Скока надо)

и работаешь со списком как с массивом. Нумерация начинается с 0.

А можно даже так:
TPerson = Object
X,Y : Integer;
Procedure NewCoords(X1,Y1);
End;

И вместо, того чтобы просматривать список и чего-то там мудрить, можно просто вызвать процедуру Person.NewCoords(X,Y), точно также как ты данные присваивал, тока писать меньше.

Ну а захотел чтобы твоий тип сразу был бы указателем (чтоб в массиве хранить было удобно) и данные содержал и процедуры которые с этими данными работают. Тогда пишешь так:

TPerson = class
X,Y : Integer;
Constructor Create;Virtual;
Procedure NewCoords;
Destructor Destroy;Virtual;
End;

вместо процедуры New(Person) или GetMem(Person, SizeOf(Person)), которые ты сейчас используешь, будешь применять Person := Person.Create;

Вот и вся хитрость с классами, там и "раздуплять"-то нечего.



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

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

Наверх




Память: 0.54 MB
Время: 0.021 c
8-80028
Lita
2003-10-23 20:22
2004.02.25
Помогите ламеру с графиком


3-79635
Newb
2004-01-31 07:04
2004.02.25
Проблема с хранимой процедурой помогите :(((


14-80218
Nikolay M.
2004-02-05 17:43
2004.02.25
ОФИСНАЯ МОЛИТВА... :)


6-80073
BlackSun
2003-12-17 13:20
2004.02.25
Indy и TIdIOHandlerSocket


1-79994
Oleg_
2004-02-13 13:47
2004.02.25
drowing not allowed