Техники динамической (алгоритмической) графики - PullRequest
6 голосов
/ 06 октября 2008

Я программирую приложение для 32-битного процессора с ограниченной памятью (флэш-память 512 КБ, ОЗУ 32 КБ).

Дисплей на этом устройстве имеет разрешение 128х160 с 16-битным цветом, что обычно потребляет 40 КБайт оперативной памяти, если я буферизую его на своем процессоре. У меня не так много оперативной памяти, поэтому я ищу методы, советы, хитрости, идеи для создания экранных данных на лету.

Что может помочь:

  • Возможно, вам известен ресурс для такого рода ограничений
  • Может быть, вы создали привлекательную графику на лету
  • Существует ли общий алгоритм, который я мог бы использовать для объединения элементов в памяти программ (включая альфа-смешение) на лету, пока я сканирую дисплей
  • Простые векторные методы рендеринга (или бесплатный (bsd / mit / apache) источник)
  • ???

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

-Adam

Ответы [ 4 ]

8 голосов
/ 06 октября 2008

В некотором смысле, вы находитесь в той же ситуации, что и разработчики игр, во времена Tandys, Spectrums и ранних ПК. Итак, вот моя рекомендация:

Тебе следует прочитать записи Майкла Абраша по компьютерной графике. Они были написаны во времена, когда сопроцессор с плавающей запятой являлся необязательным компонентом аппаратного обеспечения, и они описывают множество базовых методов (линии Брезенхема и т. Д.), Использовавшихся в старые (предположительно «плохие») программные дни .

Вы можете прочитать большую часть его "Черной книги" здесь .

Кроме того, вы, вероятно, можете найти много старых файлов BBS, которые большинство людей использовали в свое время для изучения графического программирования здесь . Просто найдите Графики, Линии, а что нет.

Надеюсь, это поможет!

Обновление: Я также помню, как использовал this в моих первых попытках рисования объектов на экране. Не могу сказать, сколько времени я потратил, пытаясь понять математику, стоящую за этим (ну, честно говоря, мне тогда было около 15). Очень хорошее (и простое) введение в 3D, и очень хорошая премьера по преобразованиям, многоугольным заполнителям и интерполяции.

3 голосов
/ 06 октября 2008

Какие данные вы будете показывать на экране?

Если это не фотографические изображения, вы можете рассмотреть возможность использования палитры. Например: 256 цветовых палитр, использующих 8 бит на пиксель, потребуют 20 КБ (плюс 256 x 2 байта для таблицы соответствия), что по крайней мере лучше, чем 40 КБ.

2 голосов
/ 06 октября 2008

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

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

Немного оффтоп, но так работает аппаратное обеспечение Nintendo DS 3D. Вы можете увидеть это, если попытаетесь визуализировать слишком много полигонов вокруг одной и той же координаты y - полис будет случайным образом мерцать и выпадать, когда обновление экрана обгоняет оборудование рендеринга.

Кроме того, я бы поддержал предложение другого автора использовать палитризованный рендеринг. Очень сложно делать быстрые вычисления на 16-битных пикселях, но быстрее на 8-битных, если вы хорошо разбираетесь в том, как вы располагаете свою палитру.

0 голосов
/ 26 октября 2008

Некоторые идеи, которые сочетают в себе хорошую графику и нехватку памяти:

  • Хранение фонов и спрайтов во флэш-памяти.
  • Сохранение динамически генерируемой графики в оперативной памяти с использованием палитры до половины байтов.
  • Используйте функцию управления окном драйвера ЖК-дисплея для обновления только той части экрана, которая вам нужна.
...