Могу ли я ускорить использование Core Graphics для рисования движущихся треугольников каждую 1/10 секунды - PullRequest
0 голосов
/ 29 января 2010

Недавно я добавил некоторые элементы Core Graphics в свое приложение, и оно значительно замедлилось, сделав его практически бесполезным. Я не уверен, что я просто не использую Core Graphics эффективно (как мне сделать это быстрее?) Или эта проблема присуща использованию Core Graphics. Мой код ниже, после этого описания:

Вокруг экрана движутся речевые пузыри (в x & y). Каждый пузырь имеет соответствующее изображение в нижней части экрана, которое также перемещается в x & y. Я использую Core Graphics, чтобы нарисовать треугольник из речевых пузырей, заканчивающийся внизу изображениями. На экране одновременно может быть более 10 таких треугольников, все они движутся. Каждую 1/10 секунды срабатывает таймер, вычисляет все позиции и вызывает setNeedsDisplay для объекта треугольника, который я построил.

Код для объекта треугольника:

- (void)drawRect:(CGRect)rect {
    // Drawing code
 // Drawing code
 CGContextRef ctx = UIGraphicsGetCurrentContext(); //get the graphics context
 CGContextSetRGBStrokeColor(ctx, 1.0, 0, 0, 1); //there are two relevant color states, "Stroke" -- used in Stroke drawing functions and "Fill" - used in fill drawing functions

 //Create an array of points for triangle  
 CGPoint leftTrianglePoint;
 CGPoint rightTrianglePoint;
 rightTrianglePoint = CGPointMake(pointBlob.x, (pointBlob.y + 10.0));
 leftTrianglePoint = CGPointMake(pointBlob.x, (pointBlob.y - 10.0));

 CGPoint triangleArray [] =
 {
  pointGrid,
  rightTrianglePoint,
  leftTrianglePoint,
 pointGrid,};

 //Add lines to the context
 CGContextAddLines( ctx, triangleArray, 4);
 //draw the path

 //color the context - using a function for gray, to matche the saved blobs
 CGContextSetGrayFillColor(ctx, 0.0, .7);

 //Now fill the path 
 CGContextFillPath(ctx);
}

Как я могу повысить эффективность и эффективность сборки, чтобы моя графика снова двигалась плавно?

Ответы [ 3 ]

1 голос
/ 30 января 2010

Как предполагает Кендалл, если вам просто нужно переместить треугольники, нарисуйте их один раз в слое UIView или CALayer и анимируйте положения и / или повороты этих предметов. Перерисовка треугольников в каждом кадре с использованием Core Graphics будет очень медленной, потому что каждый раз, когда вы рисуете, потребуется повторное получение слоя или слоя вида.

Однако, похоже, вам нужно анимировать фактическую форму треугольника. Для этого рекомендую взглянуть на недавно добавленный (в iPhone OS 3.0 и Snow Leopard) класс CAShapeLayer . Вы можете установить путь (с заливкой и обводкой), который будет отрисовываться этим слоем, а затем плавно анимировать его по другому пути (с тем же количеством контрольных точек), используя CABasicAnimation. Есть примеры этого здесь и здесь .

1 голос
/ 29 января 2010

Ненавижу это говорить, но отбросьте Core Graphics и сделайте это с OpenGL. OpenGL любит треугольники. Он будет мигать тысячи раз в секунду для вас на высокой скорости. Многие думают, что OpenGL предназначен только для 3D, но то, что вы делаете в 2D, также прекрасно с этим работает.

0 голосов
/ 29 января 2010

Если вы хотите упростить порт OpenGL, попробуйте использовать библиотеку OpenGL, например Cocos2D .

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

...