Как вы рисуете отдельные пиксели на iPhone? - PullRequest
2 голосов
/ 22 февраля 2011

Я заинтересован в создании игры, которая зависит от пикселей, рисуя каждый пиксель по одному за раз.

Но мне очень трудно найти исходный код barebones, показывающий, как это сделать.Все ли должно проходить через OpenGL?

Я знаю, что в devkit есть образец, но он не отображает 1 пиксель, он строит большой круг, и мне нужно отображение в 1 пиксель.

Есть ли образец barebones, который позволяет просто регистрировать ввод пальцем и рисовать 1 пиксель, где вы попадаете на экран?

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

Существует два распространенных способа рисования необработанных пикселей на экране: рендеринг с использованием OpenGL ES или рисование с использованием Quartz 2D.Оба имеют свои преимущества и недостатки.

OpenGL ES обеспечит вам наилучшую производительность при выполнении большого количества обновлений дисплея.Вы можете посмотреть пример приложения Apple GLPaint для примера того, как рисовать пальцем с помощью OpenGL ES.Вы можете даже изменить кисть, использованную в этом примере, на ширину всего в один пиксель, если хотите.

Тем не менее, OpenGL ES может быть сложным для работы и потребует много кода для рисования.хочу даже в 2-х.Вы можете обратиться к вопросу Изучение OpenGL ES 1.x для получения ресурсов, которые помогут вам понять эти API.

Кварцевый 2D-рисунок намного медленнее для регулярно обновляемого контента, но он может быть более доступнымчем OpenGL ES.Quartz 2D основан на векторной графике, поэтому он не предназначен для построчного рендеринга.В своем ответе на этот вопрос .

я даю несколько указаний к учебным пособиям по этой платформе. Третий вариант, который может быть не таким простым, как эти два, - создать UIImage и вручнуюизменить его пиксели в ответ на операции рисования, отображая изображение после каждого изменения.Опять же, вы столкнетесь с такими же проблемами с низкой производительностью, как если бы вы работали с Quartz 2D.Подробнее об этом см. Ответы, опубликованные в на этот вопрос .

0 голосов
/ 22 февраля 2011

Quartz2D работает медленно. Чрезвычайно медленный, особенно на таких устройствах, как 3G и iPod touch 2G (я говорю о производительности почти 1 - 5 кадров в секунду)

OpenGL работает быстрее, чем Quartz2D на iPhone.

Это следующие шаги

  1. Установите проекцию на орто, чтобы соответствовать разрешению экрана. glOrtho с 480 320 шириной и высотой. (Это не обязательно)
  2. Создайте массив всех пикселей, которые вам нужно нарисовать.
  3. Убедитесь, что для glPointSize установлено значение 1.0f
  4. Вызовите glDrawArrays с параметром GL_POINTS.
  5. Вы также можете использовать буфер цвета, чтобы назначать разные цвета каждому пикселю.
0 голосов
/ 22 февраля 2011

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

    UIGraphicsBeginImageContext(self.view.frame.size);
[testImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 12.0, 0.0, 20.0, 14.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 2, 5);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), 2, 5);
CGContextStrokePath(UIGraphicsGetCurrentContext());
testImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


    UIGraphicsBeginImageContext(self.view.frame.size); //you can put here testimage to get the image only
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);

Это будеттакже сохраните изображение в библиотеке изображений телефона.Надеюсь, это поможет вам.

...