Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Внизпроблема с памятью Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.034 c