Понедельник, 18 Ноября 2024, 00:33

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Тайлы, вода, фпс.
OverdraveДата: Воскресенье, 20 Июля 2014, 19:46 | Сообщение # 1
частый гость
Сейчас нет на сайте
Есть комната размером 6400 на 4800 пикселей (да, довольно большая, но так надо)
Вся нижняя половина заполнена тайлами травы (на 100-ой глубине, разумеется).
Есть объект, проверяющий через цикл, есть ли в определённых местах тайл. Если нет, то рисует спрайт воды.
Этот цикл у него работает в определённом диапазоне (в зависимости от местоположения камеры), т.е. в другом конце карты спрайты воды не отрисовываются (по крайней мере, не должны).

Тесты дали такие результаты (комнаты такого же огроменного размера):
1)Комната без каких-либо тайлов, с объектом создания воды. ФПС: 60
2)Комната с заполненным тайлами видом (т.е. воды вовсе не видно, зелёная травка на весь экран), с объектом создания воды. ФПС: 60
3)На половину заполнена тайлами, с объектом создания воды. ФПС: 15-55 в разных кусках карты (по убыванию фпс: слева-снизу на право-вверх), что очень странно.
4)На половину заполнена тайлами, БЕЗ объекта создания воды. ФПС: 60 (!!!)

Код в Draw объекта, который рисует воду:
Код
for (i=view_xview-128;i<=view_xview+view_wview+128;i+=32)
{
for (j=view_yview-128;j<=view_yview+view_hview+128;j+=32)
{
if tile_layer_find(100, i+1, j+1)=-1
{
switch(anim div 1)
{
case 1: draw_sprite_part(sprite_index, image_index, 32*1, 64, 32, 32, i div 32 * 32, j div 32 * 32); break;
case 2: draw_sprite_part(sprite_index, image_index, 32*4, 64, 32, 32, i div 32 * 32, j div 32 * 32);break;
case 3: draw_sprite_part(sprite_index, image_index, 32*7, 64, 32, 32, i div 32 * 32, j div 32 * 32);break;
case 4: draw_sprite_part(sprite_index, image_index, 32*10, 64, 32, 32, i div 32 * 32, j div 32 * 32);break;
}}
}
}
Как можете заметить, берутся куски спрайта (тайлсет, загруженный как спрайт)

Вопрос: как избавиться от проседания фпс (анимированную воду нужно оставить)?

XDominatorДата: Воскресенье, 20 Июля 2014, 20:48 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Почему бы всю воду не развернуть в 1 спрайт, размером в 2-3 отрисовки? Или как вариант - отрисовывать не тайлы, а обычные спрайты, на сурфейс в нужном количестве, а потом уже рисовать нужный кусок этого сурфейса? А уже сверху на него что то накладывать, если там будут какие то другие объекты и рельеф.

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
OverdraveДата: Воскресенье, 20 Июля 2014, 22:14 | Сообщение # 3
частый гость
Сейчас нет на сайте
XDominator, я думал об этом, но тогда ведь этот сурфейс и его содержимое будет двигаться вместе с персонажем (другое дело - обновлять сурфейс и его содержимое, но так, опять-таки, лучше не станет), а если делать его размером с комнату ничего хорошего не выйдет. И что значит "всю воду не развернуть в 1 спрайт, размером в 2-3 отрисовки"?

Я ещё забыл уточнить, что пытался делать тайлы, находящиеся слишком далеко от меня, невидимыми, но лучше не стало (впрочем, я не уверен, что это вообще работало).
XDominatorДата: Воскресенье, 20 Июля 2014, 22:29 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Это значит что вместо кусков 32*32 и отрисовки каждого из них, лучше сделать один 3200*3200 и отрисовывать его. А зачем сурфейсу двигаться вместе с персонажем?

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
OverdraveДата: Воскресенье, 20 Июля 2014, 22:44 | Сообщение # 5
частый гость
Сейчас нет на сайте
XDominator, хорошо, попробую |D
И всё-таки, от чего могут быть проседания фпс? Проверка тайлов идёт лишь в пределах видимого (отрисовка, соответсвенно, тоже), но при их [тайлов] общем увеличении начинает лагать сильнее, причём меньше лагает в левой части карты и по нарастанию в сторону воды. Хотя если тайлов мало, то одна лишь вода ВОВСЕ не сбивает фпс (держатся стабильные 60 фпс). Это всё очень странно...
XDominatorДата: Воскресенье, 20 Июля 2014, 22:48 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Ну если б ты скинул исходник, то я может и сказал бы в чем дело) А так, на основе одного куска кода врядли что то можно сказать.

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
OverdraveДата: Воскресенье, 20 Июля 2014, 23:06 | Сообщение # 7
частый гость
Сейчас нет на сайте
XDominator, прикол в том, что в тестируемой комнате всего три объекта: временный объект для вбивания глобальных переменных, персонаж и вот этот самый объект для отрисовки воды (весь его код я уже скинул. В create и step лишь части в две строчки для анимации).
Кстати, сейчас попробовал поменять строки
Код
for (i=view_xview;i<=view_xview+view_wview;i+=32)   
{   
for (j=view_yview;j<=view_yview+view_hview;j+=32)
...
Что очень хорошо сказалось на производительности. Казалось бы, дело в шляпе, ан нет, когда выходишь к большому водоёму всё равно начинаются проседания (впрочем, всего лишь до 30 фпс, хотя это 50% от общей скорости игры)

=====================================================================================
UPD: Проблема, вроде, решилась, причём настолько глупым способом...
Похоже, вся нагрузка была из-за того, что циклу приходилось возвращать слишком много значений тайлов, так что строку
Код
if tile_layer_find(100, i+1, j+1)=-1
я попросту вырезал, тем самым позволив воде рисоваться всегда, но под тайлами, на слой ниже. Лаги, вроде, исчезли.
XDominator, напомни мне через 6 дней, чтобы я тебе плюсик поставил, а то пока сайт не даёт |D


Сообщение отредактировал Overdrave - Понедельник, 21 Июля 2014, 11:06
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг