Почему является медленным этот код ES OpenGL на iPhone?

Для стратегии сжатия SizeTieredCompactionStrategy не менее 50% дискового пространства от общего дискового пространства файла данных Cassandra должно быть свободным, чтобы можно было безопасно выполнить сжатие.

6
задан genpfault 27 September 2012 в 15:44
поделиться

5 ответов

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

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

После того, как треугольник был отображен во вьюпорте, он растеризуется. Для каждого пикселя экрана, который покрывает ваш треугольник, вызывается фрагментный шейдер. Фрагментный шейдер по умолчанию (OpenGL ES 1.1, который вы используете) будет искать тексель, который наиболее близко соответствует (GL_NEAREST) пикселю, который вы рисуете. Он может искать 4 текселя, поскольку вы используете более качественный метод GL_LINEAR для усреднения лучшего текселя. Тем не менее, если количество пикселей в вашем треугольнике, скажем, 100, то наибольшее количество текстурных байтов, которые вам придется считать - это 4(поиска) * 100(пикселей) * 4(байта на цвет). Гораздо меньше, чем говорил Нильс. Удивительно, что он может говорить так, будто действительно знает, о чем говорит.

Что касается плиточной архитектуры, это обычное явление во встроенных устройствах OpenGL для сохранения локальности ссылок. Я полагаю, что каждая плитка подвергается каждой операции рисования, быстро отсеивая большинство из них. Затем плитка сама решает, что на ней рисовать. Это будет намного медленнее, если у вас включено смешивание, как у вас. Поскольку вы используете большие треугольники, которые могут перекрываться и смешиваться с другими плитками, GPU приходится выполнять много дополнительной работы. Если бы вместо рендеринга квадрата с альфа-краями вы бы рендерили реальную форму (а не квадратное изображение формы), то вы могли бы отключить смешивание для этой части сцены, и я уверен, что это значительно ускорило бы процесс.

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

19
ответ дан 8 December 2019 в 04:56
поделиться

Я предполагаю, что моя первая попытка была просто плохим (или очень хороший) тест. iPhone имеет PowerVR MBX, Облегченный, который имеет основанный на мозаике графический процессор. Это подразделяет экран на меньшие мозаики и представляет их параллельный. Теперь в первом случае выше подразделения мог бы, стал немного исчерпанным из-за очень высокого наложения. Больше они не могли быть отсечены из-за того же расстояния и таким образом, все координаты текстуры имели к расчетному (Это могло быть легко протестировано путем изменения перевода в цикле). Также из-за наложения параллелизма не мог быть использован, и некоторые мозаики находились, ничего не делая, и остальные (1/3) работали много.

Таким образом, я думаю, в то время как пропускная способность памяти могла быть узким местом, это не имело место в этом примере. Проблема больше из-за того, как графический HW работает и установка теста.

2
ответ дан 8 December 2019 в 04:56
поделиться

Ваша структура составляет 512*512*4 байта на пиксель. Это - мегабайт данных. При рендеринге его 200 раз на кадр, Вы генерируете загрузку пропускной способности 200 мегабайтов за кадр.

Примерно с 4 кадр/с Вы используете 800mb/second только для одних только чтений структуры. Кадр - и Zbuffer пишет пропускную способность потребности также. Затем существует ЦП, и не недооценивайте требования пропускной способности дисплея также.

RAM во встроенных системах (например, Ваш iPhone) не с такой скоростью, как на Настольном ПК. Что Вы видите, вот эффект исчерпания ресурсов пропускной способности. RAM просто не может обработать данные быстрее.

Как исправить эту проблему:

  • выберите нормальный размер структуры. В среднем у Вас должен быть 1 элемент текстуры на пиксель. Это дает хрустящий картофель, выглядящий структурами. Я знаю - это не всегда возможно. Используйте здравый смысл.

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

  • Попробуйте меньшие форматы текстур. Возможно, можно использовать формат ARGB4444. Это удвоило бы скорость рендеринга. Также смотрите на сжатые форматы текстур. Распаковка не вызывает отбрасывание производительности, поскольку она сделана в аппаратных средствах. Infact противоположное верен: из-за меньшего размера в памяти графический процессор может считать данные структуры быстрее.

3
ответ дан 8 December 2019 в 04:56
поделиться

Apple очень молчалива об определенных аппаратных спецификациях iPhone, который кажется очень странным для тех из нас происходящий из консольной среды. Но люди смогли решить, что ЦП является 32-разрядный RISC ARM1176JZF. Хорошие новости - то, что это имеет полную единицу с плавающей точкой, таким образом, мы можем продолжить писать, что математика и физика кодируют способ, которым мы делаем в большинстве платформ.

http://gamesfromwithin.com/?p=239

0
ответ дан 8 December 2019 в 04:56
поделиться

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

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

0
ответ дан 8 December 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: