Я программирую приложение для 32-битный процессор с ограниченной памятью (512k flash, 32k RAM).
отображать на этом устройстве - 128x160 с 16-битным цветом, который обычно потреблял бы 40k RAM, если бы я буферизовал его на своем процессоре. У меня не так много оперативной памяти, поэтому я ищу приемы, советы, уловки, идеи для генерации экранных данных на лету.
Что может помочь:
У меня есть множитель, но нет процессора с плавающей запятой. Сам дисплей имеет очень простой контроллер и память для дисплея, но чтение и запись обходятся дорого, поэтому я не хочу использовать это в качестве своего рабочего пространства, если я могу этого избежать.
-Адам





В некотором смысле, вы находитесь примерно в той же ситуации, что и разработчики игр, которые были во времена Tandys, Spectrums и ранних ПК. Итак, вот моя рекомендация:
Вам следует прочитать работы Майкла Абраша по компьютерной графике. Они были написаны в то время, когда сопроцессор с плавающей запятой был необязательной частью оборудования, и они описывают множество основных методов (линии Брезенхема и т. д.), Используемых в старые (предположительно «плохие») дни программного рендеринга. .
Вы можете прочитать большую часть его «Черной книги» здесь.
Кроме того, вы, вероятно, можете найти много старых файлов BBS, которые большинство людей использовали в свое время для изучения графического программирования здесь. Просто ищите Графика, Линии и что-то еще.
Надеюсь, это поможет!
Обновлять: Я также помню, как использовал это в моих первых попытках рисовать объекты на экране. Не могу сказать, сколько времени я потратил, пытаясь понять математику, стоящую за этим (ну, если честно, мне тогда было около 15). Очень хорошее (и простое) введение в 3D, и очень хорошая премьера по преобразованиям, заполнителям полигонов и интерполяции.
Какие данные вы будете показывать на экране?
Если это не фотографические изображения, вы можете рассмотреть возможность использования палитры. Например: 256-цветная палитра с использованием 8 бит на пиксель потребует 20 КБ (плюс 256 x 2 байта для таблицы поиска), что по крайней мере лучше, чем 40 КБ.
Я считаю, что основной способ справиться с такой ситуацией - разделить экран на узкие горизонтальные полосы и сохранить в ОЗУ только две такие полосы. Одна полоса будет отображаться, а вы будете рендерить следующую. Когда сканирующий «луч» попадает на следующую полосу (и запускает прерывание, чтобы вы могли ее поймать), вы меняете их местами и начинаете рисовать следующую полосу вниз.
Неприятный побочный эффект этого заключается в том, что у вас есть ограничения по времени жесткий на то, сколько времени вы можете потратить на рендеринг каждой полосы. Так что, я думаю, было бы заманчиво остановиться на чем-то скучном, но с предсказуемой производительностью, например, спрайтах.
Немного оффтоп, но именно так работает оборудование Nintendo DS 3D. Вы можете увидеть это, если попытаетесь отрендерить слишком много полигонов вокруг одной и той же координаты Y - полигоны будут случайным образом мерцать и выпадать, когда обновление экрана обгоняет оборудование для рендеринга.
Кроме того, я бы поддержал предложение другого автора использовать рендеринг с палитрой. Очень сложно делать быстрые математические вычисления на 16-битных пикселях, но быстрее на 8-битных, если вы хорошо разбираетесь в том, как вы располагаете свою палитру.
Некоторые идеи, которые сочетают в себе красивую графику и небольшой объем памяти: