PSP рогалиг

Закрытые или заброшенные проекты, не состоявшие в Клубе, но имевшие ветку на форуме.

Модератор: Jolly Roger

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Yozka » 30 июл 2009, 11:18

Relict писал(а):Все предметы в одном списке, затем ищем что в клетке сравнивая по координате?
При отображении на экране вызываем эту функцию для каждой клетки видимой на экране?
Правельно, но в целом немножко не так

Для отрисовки, у всех объектов вызывается виртуальный метод onRender(карта)
В качестве контекста отрисовки передается карта.
На карте есть камера.
Вкратце можно сказать, что камера отслеживает область видимости карты.
Высчитывает видимый регион (позиция на карте, высота ширина – области видимости на карте, ну и смещение, для плавного скроллинга карты).

Объект, который хочет отрисовать себя на карте, берет регион отрисовки у камеры, которая находится на карте.
Проверяет, входят ли координаты в регион. Если он попадает в этот регион то объект отрисовывается.

Зачем нужны такие сложности?
Решается ряд задач.
1. плавный скроллинг, достаточно поменять позицию камеры.
2. любой объект может позицировать камеру на себя.
3. миникарта отрисовывается тоже с учетом камеры
4. высчитывают свою позицию только базовый объект, остальным потомкам выдается только уже посчитанные координаты для вывода на экран.
5. решается проблема скроллинга за пределы экрана.


вот например, так отрисовывется object лесенка

Код: Выделить всё

/* //===================================================================================*
* //                                                                                    *
* //  отрисовка лесенки на текущем экране с учетом камеры   							*
* //------------------------------------------------------------------------------------*
*///
void CMapLink::onRender (CMap * pRenderMap)
{
    CPoint ptScreen;
    if (getScreenPosition(ptScreen))
    {
        CResourceSprite &sprite = CResourceSprite::instance();
        sprite.draw(1015, ptScreen.x, ptScreen.y);
    }
}
//---------------------------------------------------------------------------------------

все просто...



код который бежит по всем объектам, и дергает метод отрисовки.
Сам код render() запускается после отрисовки карты.

Код: Выделить всё

/* //===================================================================================*
* //                                                                                    *
* // отрисовка игровых объектов                        									*
* //------------------------------------------------------------------------------------*
*///
void CObjectList::render(CMap * pRenderMap)
{
    backup();
    setFirst();
    int iCount = getCount();
    for (int i = 0; i < iCount; i++)
    {
        CObject * objItem = (CObject*)item();
        objItem->onRender(pRenderMap);
        next();
    }
    restore();
}
//---------------------------------------------------------------------------------------



Пока этот метод будет работать без тормозов, Если на карте будет расположено примерно 200 объектов. (физический не проверял,) Просто каждый объект перебирать очень ресурсоемко.
Далее, когда появятся тормаза. Придется строить r-дерево, но думаю до этого не дойдет.



Карт может быть много, а впамяти минимум 10. Все просто. Я хочу чтобы когда игрок перешел на другую карту, в с тарой карте продолжалась «жизнь» тоесть ходят монстры, торгуют магазины итд. Когда игрок вернется на карту и увидел, что обааанааа, а монстрякито наплодились и разбежалиь п углам. Почему именно 10? Незнаю, думаю этого должно хватить. Больше и не нужно. Да и зызка медленно работает с картой памяти, (особенно если она паленая) намного комфортней играть, когда карты хоть немного да кешируются в памяти.




АаАааа. Сохранение файлов вернее сейфки для зызки, паливо, не все так просто! Записывать в карту памяти, где сидит игра – низяяя. Зызка выделят песочницу, где можно гадить. А вот как работать с этой песочницей, как оформлять сейфки (создовать param.sfo файлы) – нипанятна. Роюсь в примерах…

Аватара пользователя
Anfeir
Сообщения: 709
Зарегистрирован: 14 дек 2007, 09:29
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Anfeir » 30 июл 2009, 11:31

Yozka писал(а):«а разве flag нельзя однозначно определить по TileIndex1?»
Нельзя. Ща попытаюсь объяснить.
Есть секретные ходы, которые мы видим как кирпичи, но насамом деле сквозь них можно пройти. Также, непроходимых тайлов может быть много, это кирпичи, горный массив, табуретко итд. То есть мне придется каждый раз проверять ооооччень большой список тайлов на предмет что можно пройти или нет.
Можно сделать 2 типа кирпича - одинаковые на вид, но разные по "флагу". плюс не пугайте меня так, какой список проверять? Разумеется, получаем флаг по массиву , где для каждого тайла указан его тип.. ну или типа того. Ну да ладно, если памяти хватает, то вероятно и незачем.
Yozka писал(а): Также во флаге хранится «видемые» области, либо области которые мы уже обследовали.
Вот описание флага:

Код: Выделить всё

enum
{
    /*тип клетки на карте
    */
    bitDoor     = 0x01, //b00000001 - (0) клетка не проходима, дверь закрыта, никто непройдет
    bitBrick    = 0x02, //b00000010 - (1) клетка не проходима (кирпичи)
    bitRock     = 0x04, //b00000100 - (2) клетка не проходима вообще (бетон-камни)
    bitWater    = 0x08, //b00001000 - (3) вода водичка, можно только плыть или лететь
    bitLava     = 0x10, //b00010000 - (4) лава, можно только пролететь

    bitOpenRegion   = 0x20, //b00100000 - (5) обследованная (открытая) область
    bitVisible      = 0x40, //b01000000 - (6) видемая область
}
В итоге я разделил информацию, которая описывает отображение на экране, и информация виде флага для обработки взаимодействия игрока и монстряков с картой.
хороший подход, мне нравится, если так )

Yozka писал(а): «На tile2 и tile3 тоже можно при желании сэкономить - сделать одно и/или другое не тайлами, а отдельными объектами (особенно если это хозяйство планируется чтобы исчезало со временем),» Правильно, так оно и будет реализовано, только для интерактивных объектов, например к огню, который современем может погаснуть.
Эти дополнительные тайлы нужны для обрисовки статической информации, к ним относятся прежде всего капли/лужи крови. Тайл виде полупрозрачной паутинки, чтобы можно было показать что карта пустует и заросла пылью. Можно конечно отдельно нарисовать тайл виде «поношенный со временем и сломанный который зарос мхом» но это трудоемко (много рисовать тайлов).


« И как будет выполняться кстати задача: "выяснить, какие объекты (монстры, вещи, и тп) есть в данной клетке?» очень интересный вопрос.
Есть ирархия классов, которая реализует этот момент:

В начале всего, сделан список виде класса
CItem – это узел списка.
Списком управляет CListItem.
В нем есть такая реализация как Add, delete, next и другие штуки для работы со списком Item

Далее сделан класс игровых объектов
CObject он унаследован от Citem
В этом объекте есть базовые свойства, такие как на какой карте расположены, и координаты. Для этого у меня создана структура CPointMap;
Также есть вертуальные функции отрисовки и установку на карту


От этого базового объекта уже пляшут другие игровые штуки. Такие как монстряки, предметы итд.

Собственно на карте есть CListItem в котором лежат все игровые объекты и монстры.
Теперь, когда мне нужно выяснить что находится в данной клетке нужно выполнить код вроде этого:

....

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

Конечно, пока поиск сделан тупым перебором, что не очень эффективно.
В будущем, этот кусок кода перепешу, данные в списке будут отсортированы и будет реализован бинарный поиск. Что должна скорость возрасти на большой порядок.
Я бы даже сказал, это очень неэффективно, такой перебор. Даже если он не тупой будет, а что нибудь типа hashtable или иного разряженного массива. ) особенно если карта большая а объектов много.
Могу подкинуть идейку так, к размышлению: у каждой клетки можно отъесть еще 4 байта - на список объектов, которые есть в этой клетке. Ибо динамический связный список с двойными ссылками можно представить в виде одного единственного указателя - указателя на корень. Конец списка знать не обязательно, добавление и удаление будут работать. Код есть, если надо. Соотв. производительность возрастает на несколько порядков.. Хотя может, оно и не надо, если вся активность ограничена одним левелом. Но все же удобно, когда можешь получить все необходимое, что твориться в участке карты сходу, без затрачивания усилий/производительности. особенно , когда для какой-то деятельности таких проверок у вас будут сотни --- для одного действия. ну скажем толпень огненных дятлов, каждый из которых жахает файрболлом очень часто, и нужно каждый раз чтобы шмотки на полу ударялись огнем и т.п.

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Yozka » 04 авг 2009, 04:34

Anfeir писал(а): у каждой клетки можно отъесть еще 4 байта - на список объектов
Памяти много уйдет, этаж еще + целых 64кб. на карту.
Ввинде программировать намного проще, там не задумываешься над памятью. Здесь, на девайсе, каждый байт на счету.
Если скорость при простом переборе будет низкая. То можно реализовать эту идею. Создавать эту карту списков динамический, после каждого хода игрока. Создать в памяти массив, заполнить его списками. И уже с ним работать. Когда отработали, то удаляем этот массив. Как вариант.
--
Сейчас занимаюсь файлами. Сохраняю карту и содержимое списков в файлы. Идет все не так быстро как я думал. Но продвигается.

Аватара пользователя
Maelstrom
Мастер
Сообщения: 2062
Зарегистрирован: 26 ноя 2006, 14:19
Откуда: г. Усть-Кирдык
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Maelstrom » 04 авг 2009, 05:03

Здесь, на девайсе, каждый байт на счету.
Вот поэтому и нефиг делать одновременно 10 карт в памяти.
Айв кнгенгах Йог-Сотот

Аватара пользователя
Cfyz
Сообщения: 771
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Cfyz » 04 авг 2009, 17:10

Yozka писал(а):Если карта 128х128 то будет вокурат 128кбайт. Когда на зызке мне доступно всего 2.6мега. 128кб ооочень много для карты. Ибо в памяти должно висеть как минимум 10 карт (чтобы обрабатывать там жизнь монстряков)
Yozka писал(а):Я хочу чтобы когда игрок перешел на другую карту, в с тарой карте продолжалась «жизнь» тоесть ходят монстры, торгуют магазины итд.
Если исходить из строгого "дано: 2.6М куча, 128К карта", то да, дело плохо. Впрочем, каждый студент знает: не подгоняется решение - подгоняй условие.

Попытка реализовать честный бесшовный мир, да с такими инструментами обычно вызывает восхищение (в безнадежном случае - умиление, в терминальном - санитаров, лол). Предлагаю быть скромными и реализовать мир, который будет выглядеть максимально похоже на бесшовный. Количество хранимых в памяти карт можно легко уменьшить вдвое с половиной раз, если внимательно посчитать количество клеток-карт вокруг персонажа :-) и взглянуть на следующую картинку:

Изображение

Очевидно, что когда персонаж находится на границе карты (области A или B), необходимость противоположной карты маловероятна. В самом тяжелом случае (AB, по диагонали) вблизи лишь четыре карты, включая текущую. Следует отметить, что пограничные области все равно пришлось бы использовать: игрок может бродить по краю, переходя с карты на карту и какую-то зону нечувствительности к этим переходам делать надо.

Остается вопрос о том когда обрабатывать флору и фауну тех карт. Собственно, в то время, когда игрок находится в соответствующей пограничной области. Сделав ее шириной в 32 клетки, получаем около 5 секунд времени (даже если игрок прет напролом, это 6-7 нажатий в секунду) на то, чтоб подгрузить и обработать карту. Игрок не заметит разницы между честным просчетом карты за все время и ускоренным просчетом двух-трех десятков ходов. 128К за пару секунд и по два-три хода обработки на каждый ход игрока в оставшееся время - вполне реально.
Maelstrom писал(а):Вот поэтому и нефиг делать одновременно 10 карт в памяти.
Да. Я с Maelstrom"ом согласен, бывает и такое. Особого смысла обработки тварей в (псевдо)реальном времени, если только не для бесшовности, не вижу. А цельный мир на экране - это ничто по сравнению с цельным миром в голове (сюжет, механика и т.д.). Оно того не стоит, мне кажется.
Yozka писал(а):Здесь, на девайсе, каждый байт на счету.
А ведь был ZX Spectrum, да. И DOS с ее сегментами по 64К. Но беда в том, что у PSP памяти все-таки 32М. Или 64М, что более вероятно ввиду популярности Slim. И хотя я ни разу не программировал под PSP, да и в руках ее держал лишь пару раз, пятиминутный поиск в гугле выдает доказательства (косвенные - куски кода, обсуждения неких разделов памяти и т. п.), что программисту таки доступно по меньшей мере 20М памяти. 2.6М на такой машинке? You're doing it wrong.
Пытается раскуклиться

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Aerton » 04 авг 2009, 18:59

Yozka писал(а):

Код: Выделить всё

    bitDoor     = 0x01, //b00000001 - (0) клетка не проходима, дверь закрыта, никто непройдет
    bitBrick    = 0x02, //b00000010 - (1) клетка не проходима (кирпичи)
    bitRock     = 0x04, //b00000100 - (2) клетка не проходима вообще (бетон-камни)
    bitWater    = 0x08, //b00001000 - (3) вода водичка, можно только плыть или лететь
    bitLava     = 0x10, //b00010000 - (4) лава, можно только пролететь
Не совсем понятно почему это флаги, ведь по логике за раз должен быть установлен только один из них? Можно использовать просто числа, потратить всего 3 бита и ещё останется запас для расширения.
Yozka писал(а):Собственно на карте есть CListItem в котором лежат все игровые объекты и монстры.
Теперь, когда мне нужно выяснить что находится в данной клетке нужно выполнить код вроде этого:
...
Конечно, пока поиск сделан тупым перебором, что не очень эффективно.
В будущем, этот кусок кода перепешу, данные в списке будут отсортированы и будет реализован бинарный поиск. Что должна скорость возрасти на большой порядок.
Те освободившиеся из под флагов территории два бита можно было использовать для hasItem и hasMonster. Если в них 0, то можно уже не искать перебором. Всё равно обычно большинство запросов "кто здесь" как правило получают отрицательный ответ, т.к. пустых клеток на карте больше, чем содержащих что-то интересное.
Anfeir писал(а):Могу подкинуть идейку так, к размышлению: у каждой клетки можно отъесть еще 4 байта - на список объектов, которые есть в этой клетке. Ибо динамический связный список с двойными ссылками можно представить в виде одного единственного указателя - указателя на корень. Конец списка знать не обязательно, добавление и удаление будут работать.
Чтобы сэкономить память, можно использовать не указатели, а индексы. Для карты нормального размера лимит в 256 монстров/шмоток вполне приемлем, а памяти требуется всего байт. В карйнем случае, сделать индексы 12 или 16 битными.
Cfyz писал(а):
Yozka писал(а):Здесь, на девайсе, каждый байт на счету.
А ведь был ZX Spectrum, да. И DOS с ее сегментами по 64К. Но беда в том, что у PSP памяти все-таки 32М. Или 64М, что более вероятно ввиду популярности Slim. И хотя я ни разу не программировал под PSP, да и в руках ее держал лишь пару раз, пятиминутный поиск в гугле выдает доказательства (косвенные - куски кода, обсуждения неких разделов памяти и т. п.), что программисту таки доступно по меньшей мере 20М памяти. 2.6М на такой машинке? You're doing it wrong.
Очевидно, 2.6 - это именно бюджет карт, после загрузки всего остального. А так да, 24-25Mb (от которых едят модули и сам исполняемый файл).
Но учитывая, сколько игр прекрасно себя чувствуют с одной картой, впихнутой в текстовый экран 80x24, не считая ещё выводимой информации, не совсем понятна цель мега-подвигов.

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Yozka » 05 авг 2009, 05:18

2.6 мега на зызке. Почему столько?
Все дело, в каком режиме загружать программу. если в режиме ядра, то доступна вся память. если в режиме пользователя, то только 2.6.
Чтобы была совместимость с другими прошивками, программу нужно запускать в режиме пользователя. Иначе, не факт что программа будет работать.
Тоесть, для тех кто пишет программы для зызки, для совместимости с разными прошивками, используйте функции sceKernelAllocPartitionMemory из хидера "pspsysmem.h", кому нужно, могу более подробно описать, как работать с памятью в зызке.


-
В игре не используется бесшовный мир. Швов там нет. Все карты отдельные. Тогда спросите зачем память рассходывать и держать 10 карт под за пазухой?
Придется мне приоткрыть тайную фишку.
В игре, одновременно можно играть за несколько персонажей. Тоесть, с начало, мы играем за одного, потом, можно переманить на свою сторону NPC и им управлять. (в демке какараз два независемых персонажа, переключатся между ними можно через сшифты) Количество персонажей может быть очень много. Все уперается в память. Когда персонажи, находятся в пределах одноой карты - проблем нет. Но если персонажи находятся в разных картах, то тут то и приходится держать в памяти как минимум 10 карт.

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

Код: Выделить всё

flag = bitBrick | bitWater |  bitOpenRegion;
Также, флаг будет расширятся, добавится признак, что клетка находится в тумане, либо в огне.
не совсем понятна цель мега-подвигов
интересно ведь, впихнуть невпихнуемое.


Скорость работы с картой памяти очень низкая, хотя читаю информация из файла блоками, всеравно, скорость очень низкая. Думаю, а не сделать ли нам работу с файлами через неблокирующие функции, да и в отдельном потоке? Заманчиво, но небудем отвлекатся, пока оставим так. Потом видно будет.

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Aerton » 05 авг 2009, 06:27

Yozka писал(а):2.6 мега на зызке. Почему столько?
Все дело, в каком режиме загружать программу. если в режиме ядра, то доступна вся память. если в режиме пользователя, то только 2.6.
Чтобы была совместимость с другими прошивками, программу нужно запускать в режиме пользователя. Иначе, не факт что программа будет работать.
Тоесть, для тех кто пишет программы для зызки, для совместимости с разными прошивками, используйте функции sceKernelAllocPartitionMemory из хидера "pspsysmem.h", кому нужно, могу более подробно описать, как работать с памятью в зызке.

Код: Выделить всё

hello, PSP!
requested 16777216, max free mem size = 23940096
mbid 67753737
memory 16777216, sizeof(Header) 16
loadedstart drawing cycleshutdownmemory map 'host0:/memory00.ppm'
exit
У тебя либо какая-то либа съедает память при старте, либо включена отладочная информация и исполняемый файл имет гигантский размер.

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Yozka » 05 авг 2009, 07:58

Код: Выделить всё

hello, PSP!
requested 16777216, max free mem size = 23940096
mbid 67753737
memory 16777216, sizeof(Header) 16
loadedstart drawing cycleshutdownmemory map 'host0:/memory00.ppm'
exit
Это дамп вашей программы? которую вы скомпилировали?
Или это стороння программа? которая сбросила всю память в файл?
Если ваша, то выложите сюда полный исходник. вместе "макфайлом"
Меня интересуют только строчки инциализации приложения, такие как:

Код: Выделить всё

PSP_MODULE_INFO("Mariner", PSP_MODULE_USER, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(20480);
Если у вас стороння прога, уже скомпилированная, то могу суверенностью сказать, что она загружается в режиме ядра, тогда да. доступна вся память (около 20мегов).

Есть функция, sceKernelTotalFreeMemSize() - показывает, сколько доступно памяти.
она будет показывать 2.6 мегов (вбайтах)
потом возьмите в цикле, выделяйте память скажем по 100кб. до тех пор, пока выделяется. потом, посмотрите, сколько фактический выдилелось.

Повторюсь, чтобы была совместимость с другими прошивками, я программу запускаю в режиме пользователя, в этом режиме, мне дается песочница, стек размером в 2.6 мега.

Сейчас выделяю память

Код: Выделить всё

sceKernelAllocPartitionMemory(2, "HOMEBREW_", PSP_SMEM_Low, size, NULL);
2 - это где брать память, очень интересный параметр. Как понял, он указывает, где резервировать память, в данном случаи 2 - это в стеке. 0 - в общей куче. 1 - расширенный участок памяти (для слимок). Так вооот, когда загружаешся в пользовательском режиме, доступно только "2", с остальными параметрами, функция возвращает ошибку. Ноо если загрузится в режиме ядра, то да, память можно выделить и в общей куче, и верхних слоях где зызко-слим прячет еще 32 мега.
Но вот беда, в режиме ядра, программа работает не на всех прошивках. А на новой приставке зыз-го, вообще небудет работать.

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Yozka » 05 авг 2009, 08:08

нагнал
флаги такие
1 = kernel, 2 = user, 3 = me, 4 = kernel mirror

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Aerton » 05 авг 2009, 08:49

Да, это написанная и собранная мной прогрмма. Никакого режима ядра и чёрной магии не используется.
Исходника под рукой нету.

24Mb - насколько помню, это цифра от sceKernelMaxFreeMemSize

Основная разница в том, что я выделяю память только один раз, куском в 16Mb. Весьма вероятно, что-то кол-во аллокаций в системе ограничено и ты его ты его исчерпал циклом.

Код: Выделить всё

PSP_HEAP_SIZE_KB(20480);
А это кто только что отдал 20Mb? :D Попробуй уменьшить до 1024. Или тогда используй malloc, а не дёргай ядро.
1 - расширенный участок памяти (для слимок)
Что-то я в этом ну очень сильно сомневаюсь, т.к. доступ к этой памяти осуществляется по-другому.
А на новой приставке зыз-го, вообще небудет работать
На PSP Go твоя игра в любом случае не будет работать до тех пор, пока не сломают прошивку. Если её вообще сломают.

Alex
Сообщения: 12
Зарегистрирован: 24 сен 2008, 11:29

Re: [test] PSP рогалиг, нужно потестить

Сообщение Alex » 05 авг 2009, 10:21

Можно влезть не совсем по теме? Если я правильно понимаю, попытки ваять что то свое под PSP в домашних условиях официально не поддерживаются производителем? Тогда имхо не стоит пытаться делать что то большое и сложное под эту платформу. Разработка рогалика и так достаточно сложна и долгосрочна, и даже если она будет доведена до хоть какого то конца, то есть вероятность, что техника к тому времени обновится или не сломают новый девайс, и в результате играть в свою игру сможет только сам автор... до тех пор пока его приставка не сломается, а новую такую же может уже и не купишь. Столько времени и все впустую. Имхо надо все же ориентироваться на более открытые платформы. По моему продолжать на Windows mobile более перспективно. Хотя понимаю, что покопаться внутри своего девайса интересно.

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Yozka » 06 авг 2009, 12:16

Основная разница в том, что я выделяю память только один раз, куском в 16Mb. Весьма вероятно, что-то кол-во аллокаций в системе ограничено и ты его ты его исчерпал циклом.
Спасибо за подсказку, наверно именно сдесь сабака зарыта.
Надо будет попробывать.
У тебя большой кусок перога с памятью, как ты его разруливал на уровне своей программы? Писал свой менеджер памяти?
Еще, кажись, у меня pspsdk древний. НАдо будет обновится.

--
Alex, даже и незнаю, у меня рогалик, несвязан с железом. Он изначально был написан под мобайл, потом проект плавно перенеся на зызку. В теории, можно будет портировать на другие платформы. Нужно будет только переписать методы отрисовки картинок, обработка управления, и работа с файлами.

--
Ага! сделал сохранение в файл.
Теперача отрихтую напильником код за выходные.
Потом подскажите, в каком направлении дальше двигаться.
Думаю, что сделать, вырастить на карте бестолковых монстряков.
Или занятся инвентарем?
Хочется побыстрее в игрушке когонибудь поубивать.
Но мозгом то понимаю, что инветарь сейчас важнее. Ибо инвентарь всему голова! Он не только у пользователя, но и умонстряков.

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

the lost memory of PSP

Сообщение Aerton » 07 авг 2009, 17:19

Скачал, поставил SDK. Беру за основу hello world В Makefile только добавил BUILD_PRX=1 для psplinkusb.

Код: Выделить всё

#include <pspkernel.h>
#include <pspsdk.h>
#include <pspdebug.h>

PSP_MODULE_INFO("Hello World", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
//PSP_HEAP_SIZE_KB(20480);

int main (void)
{
        SceUID id;

        printf ("hi PSP\n");
        printf ("sceKernelMaxFreeMemSize %dKb\n", sceKernelMaxFreeMemSize() / 1024);
        id = sceKernelAllocPartitionMemory(2, "mymem", PSP_SMEM_Low, 16*1024*1024, NULL);
        printf ("alloc: %s\n", (int)id > 0 ? "success" : "fail" );
        printf ("sceKernelMaxFreeMemSize %dKb\n", sceKernelMaxFreeMemSize() / 1024);
        sceKernelFreePartitionMemory (id);

        return 0;
}
Запускаем

Код: Выделить всё

host0:/> ./psp-mem.prx 
Load/Start host0:/psp-mem.prx UID: 0x04425D6B Name: Hello World
host0:/> hi PSP
sceKernelMaxFreeMemSize 23894Kb
alloc: success
sceKernelMaxFreeMemSize 7510Kb
Раскомментируем строчку PSP_HEAP_SIZE_KB(20480);

Запускаем

Код: Выделить всё

host0:/> ./psp-mem.prx 
Load/Start host0:/psp-mem.prx UID: 0x04401E49 Name: Hello World
host0:/> hi PSP
sceKernelMaxFreeMemSize 3478Kb
alloc: fail
sceKernelMaxFreeMemSize 3478Kb
Yozka писал(а):У тебя большой кусок перога с памятью, как ты его разруливал на уровне своей программы? Писал свой менеджер памяти?
Да, свой. Могу поделиться, но в нём пока нету ни расширенного функционала, ни оптимизаций.

Есть уже готовые библиотеки, можешь попробовать более взрослые dmalloc или гугловский tcmalloc. Или что тебе мешает использовать стандартный malloc? PSP_HEAP_SIZE_KB как раз резервирует память для него.

Аватара пользователя
Yozka
Сообщения: 127
Зарегистрирован: 29 июл 2008, 06:42
Откуда: Тюмень
Контактная информация:

Re: [test] PSP рогалиг, нужно потестить

Сообщение Yozka » 08 авг 2009, 16:30

Aerton
Решил проблему :?
Использовал стороннию библиотеку, для отрисовки шрифтов. В ней, память отъедалась очень много. Поправил.
Изменил PSP_HEAP_SIZE_KB(20480);
блин я и не заметил, что это в кб. а я в байтах считал :lol:

Теперь у меня боле 20 мегов на борту. Жизнь налаживается!

Изменил графику, теперь выводится FOV и маленькие тени, от стен.
Полностью сделал сохранение и загрузку карт.

Дальше делаю инвентарь.
На скриншоте глюк. Вместо персонажа, набор пикселей.
Вложения
scrshot000.jpg
scrshot000.jpg (40.3 КБ) 4603 просмотра

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость