Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.047 c
1-79790
TransparentGhost
2004-02-11 16:16
2004.02.25
Процедуры с необязательными параметрами


1-79745
jen
2004-02-12 11:28
2004.02.25
Опять проблема со СТРОКАМИ, чтение


14-80226
Думкин
2004-02-05 06:28
2004.02.25
С днем рождения! 5 февраля.


1-79942
Zemal
2004-02-09 16:35
2004.02.25
Как получить из консольного приложения путь к исполняемому файлу?


1-79803
Алексей
2004-02-11 13:59
2004.02.25
Автоматизация Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский