Тайлы, вода, фпс.
| |
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 |
|
| |
|