Методы для динамической (алгоритмической) графики

StackOverflow https://stackoverflow.com/questions/174289

Вопрос

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

В дисплей на этом устройстве 128x160 с 16-битным цветом, который обычно потреблял бы 40 кб оперативной памяти, если бы я буферизовал его на своем процессоре.У меня не так много оперативной памяти, поэтому я ищу методы, советы, хитрости, идеи для создания экранных данных "на лету".

Вещи, которые могли бы помочь:

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

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

-Адам

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Несколько идей, которые сочетали бы приятную графику и низкий объем памяти:

  • Храните фоны и спрайты во flash.
  • Храните динамически сгенерированную графику в оперативной памяти, используя палитру размером в половину байта.
  • Используйте функцию управления окнами драйвера ЖК-дисплея, чтобы обновить только ту часть экрана, которая вам необходима.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top