Рисование на растровом изображении против непосредственно на холсте - PullRequest
0 голосов
/ 18 августа 2011

В моем приложении мне нужно нарисовать большую сеть (в основном, маленькие прямоугольники, связанные линиями), и пользователь сможет масштабировать и перемещать ее.

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

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

Моя проблема в том, что, поскольку сеть довольно большая, я получаю исключение OOM при создании растрового изображения ...

Что мне делать? Рисовать прямо на холсте? Использовать несколько небольших растровых изображений?

Спасибо, Direz

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Мой первый вопрос к вам - сколько спрайтов у вас за раз? Безусловно, самый быстрый механизм наличия множества спрайтов на экране - это использование OpenGL из-за аппаратного ускорения. Лучший способ, который я нашел на Android, заключается в том, чтобы использовать Android Cocos2d (не путать с версией ios), которая доступна в Google Projects. Вы должны будете использовать документацию IOS, чтобы понять это, и есть несколько приличных обучающих программ, чтобы начать работу с онлайн ... в частности, шаблон hello world здесь ... Www.sketchydroide.com/Blog/p?= 8. Он устарел по сравнению с последним IOS cocos2d, но этого и следовало ожидать. Я обнаружил, что в моих экспериментах программы работают НАМНОГО быстрее, когда они не подключены к сеансу активного отладчика.

Если вы хотите придерживаться своего текущего подхода или все еще недостаточно быстро, вам придется попытаться отбросить любой рисунок, который не появляется на экране, означая общую функцию формы "если спрайт Значения x и y выходят за границы видимой области, не рисуйте ее », - так в основном это решает большинство игр с плитками.

Звучит так, будто вы рисуете вручную, если вы делаете маленькие квадраты. Я думаю, что было бы более целесообразно идти вперед и рисовать на холсте, но быть очень осторожным в управлении подсчетами спрайтов и избегать тяжелых циклов итераций, которые происходят на обновление кадра циклы, где это возможно. Довольно легко максимально использовать ваш маленький телефон с помощью операций рисования.

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

0 голосов
/ 18 августа 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...