![]() |
Оптимизация общей производительности в игре
Всем привет.
В создаваемой игре в определённый момент резко встал вопрос производительности. Надумал один ход, хочу обсудить, прежде чем игруху переделывать. По ходу разработки, в игре накопились моменты, где применяется EnterFrame и Timer. Понятно, что каждый такой Event отъедает свой кусок производительности. А если взять и написать один класс, который будет задавать событие EnterFrame и Timer, так сказать централизовано, а если нужно какой нибудь метод запускать ЕнтерФреймом или Таймером, передаём метод в этот класс с нужными параметрами и один класс для всей игрухи будет это делать. Плюс сюда ещё можно и EVENT_RENDER прикрутить каким нибудь боком. Что-бы прорисовывать только по факту готовых данных для визуализации. У кого какие соображения по данному варианту? Может кто-нибудь какие другие хитрости знает по организации максимальной производительности в играх... З.Ы. Игруха - экономическая стратегия (типа сим-сити) с массой активных объектов на экране и кучей жителей постоянно бродящим по улицам. |
Цитата:
(Если, конечно, не считать жуткого леса if-ов в этом перегруженном классе) Тут сложно что-то конкретное посоветовать, но стандартных направления 2: - обновляем все не в каждом кадре в ЕНТЕРФРЕЙМЕ, а только если данные изменились; - реиспользуем все объекты, которые можно реиспользовать объект не нужен - положили в пул объект понадобился - не создаем новый, а достаем из пула (в особенности касается BitmapData). |
Как уже выше заметили - использовать пулы (неизменяемый список объектов) как минимум, чтобы работы сборщику мусора было как можно меньше.
Второе - вывод на экран нужно оптимизировать => как можно меньше использовать DisplayObject (Sprites, MovieClips, etc...). В самом простом случае - 1 битмап на стейдже, в который, каждый кадр, рендерим нужные объекты ручками, самое быстрое - copyPixels() у BitmapData. |
Цитата:
Это выглядит как "делаем сами руками то, что флешплеер делает нативно". Другое дело - весь фон, который редко меняется, отрисовывать на битмапе размером с экран, а при скроллировании его дорисовывать только куски с боков, а сам двигать с помощью метода scroll() у BitmapData А перерисовывать самому кучу и так постоянно перерендеривающихся объектов - неужели это действительно быстрее? (еще, вдобавок, придется лепить систему, обрабатывающую клики мышью - у нас же один битмап на экране) |
expl, не, ну понятное дело, в крайности кидаться не стоит, просто как пример обозначил, что можно рисовать в битмапу, которая на стейдже с помощью copyPixels(); А вообще, кстати, зависит от типа игры, так что если правильно все написать, то будет быстрее, в некоторых случаях. А по-поводу системы - особо лепить ничего не надо, координаты нам известны при щелчке, и те объекты, которые могут реагировать на щелчок - координаты мы тоже знаем, поэтому сложности не возникает никакой.
|
Цитата:
ps_spectre, А по поводу отрисовки в битмап, можете подсказать возможно ли что-бы: 1. Делались все необходимые вычисления в игре, 2. Потом применялись изменения в сцене. 3. Потом всё одним махом в битмап и отобразить на сцене.. Как думаете, так будет прирост производительности? |
Цитата:
Вы передаете имя функции которая вызовется при событии... Грубо говоря - при событии EnterFrame вызывается for each по массиву переданных вами ранее функций... А с предполагаемым вашим подходом после этого еще и ваш класс начнет ту же логику по второму кругу. |
ps_spectre спасибо за ссылки. Мне это уже попадалось... Всё никак до изучения английского не дойду..))) Мне бы такой-же тест но на русском... Увы не нашёл...
Буду копать в сторону copyPixel(). Может какие идеи и появятся... А по-поводу Ентер Фреймов... Неужели никакой разницы, - создавать 10 новых/разных объектов ЕнтерФрейм в игре для 10 разных ситуаций, или создать один объект ЕнтерФрейм и через него крутить 10 методов в этих ситуациях... Что-то мне не верится... В общем надо пробовать. |
я делаю примерно так (очень упрощенно)
addEventListener(Event.ENTER_FRAME, gameLoop); --- Код AS3:
Код AS3:
|
Т.е. вы каждую отдельную пулю в цикле перерисовываете на общий битмап, а не всю картинку сразу делеаете битмапом?
|
zaidite, я же говорю, это очень упрощенно, но в целом ответ да, т.е. в реальной игре, все равно несколько слоев , но в результате все сводится к одной битмапе.
|
Цитата:
http://ru.wikipedia.org/wiki/%D0%9E%...BF%D1%83%D0%BB Цитата:
Менять надо только по необходимости, а не в каждом кадре Измениться ли производительность при ваших махинациях с событиями? Измениться! Хорошо если на 1% (причем не понятно в какую сторону =) Про отрисовку все в битмап: Это ничуть не панацея - можно увеличить скорость в 10 раз можно уменьшить во столько же. (например, товарисч убил всю скорость в игре и засрал память выставлением catchAsBitmap в true для движущихся объектов - они часто убирались и добавлялись на экран - сосотвествоенно столько же раз кешировались - забивали память, перешел на пул битмап - все стало гораздо лучше) Все зависит от того как, когда, каким образом Что можно сказать точно - двигать по сцене растр без трансформаций в разы быстрее чем "хоть немного" сложную векторную картинку. И под фон лучше подкладывать растр - фон статичен, и если он будет векторным - флешплееру придется перерендеривать куски, поверх которых перемещаются другие объекты. |
Я вот еще где то читал, что стоит вместо стандартного Event.ENTER_FRAME использовать свое событие и вешать слушатели уже на него. Кто нибудь так делает? Какой выигрыш в производительности?
|
Для начала найдите, что тормозит. Наверняка тупо рендер той кучи всего, что у вас на экране.
А то понаделаете непонятно чего и зачем. |
| Часовой пояс GMT +4, время: 14:48. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.