2015-04-14 4 views
2

В некоторых старых/обычных условиях единственный выбор для рендеринга изображения является использование функции базового чертежаНанесение изображений алгоритм компенсации

  • putpixel(x, y);(помещает пиксел в х/у расположения холста)
  • lineto(x, y);(рисует линию от смещения к й/у расположения холста)
  • moveto(x, y);(двигается к смещению х/у расположения холста)
  • setpen(r, g, b, transp, size);

Но они очень медленно, особенно если много должно быть обращено на один раз.


Я готов изобрести алгоритм компенсации, который согласовывает к этой картине я на примере: enter image description here

Что она делает, как вы можете видеть это предсказать, где более целесообразно использовать lineto вместо putpixel чтобы сохранить итерации , В этом примере он пропускает более 50% итераций. (красная линия указывает, что это смещение не будет нарисовано с помощью putpixel, но является частью уже нарисованной линии) Решает, лучше ли вертикальная или горизонтальная линия. Будет очень тяжелая и медленная буферизация, если это нужно сделать с помощью функций sin/cosin, чтобы определить угол?


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

+0

Как вам нужно установить цвет для всех пикселей, почему просто рисовать горизонтальную линию неэффективно? –

+1

Это хорошая тема для игры, но вы должны знать, что на большинстве архитектур (особенно на «старых средах») горизонтальная линия всегда является самым быстрым способом принести что-либо на экран. Большинство архитектур имеют какой-то буфер кадров, где адреса восходящей памяти соответствуют следующей координате x. Если вы достигнете правой границы, следующий адрес будет равен x = 0, y + 1. В некоторых старых архитектурах есть чередующиеся битовые плоскости, что означает, что вам нужно изменить биты в байтах, если вы хотите установить произвольные пиксели. – mfro

+0

Линия рисования намного эффективнее, чем пусковая установка, точно. Он сохранит другой вызов 'setpen' и' putpixel' и даже всю итерацию. Вот почему .. такой алгоритм должен быть создан. Он должен быть достаточно умным, чтобы определять, где использовать и какую линию использовать. – Malina

ответ

0

Какой сумасшедший API это, где обработка, используемая для применения такого алгоритма, более чем компенсирует накладные расходы API? Это более ограничительно, чем трюки, которые мы должны были использовать в дни однокрасочной 4-цветной CGA-графики!

Нет никакой функции блиттера изображения, где вы можете рисовать в буфер затвора и плакать заранее, чтобы компенсировать медленные процедуры рисования?

В любом случае, предоставляя такой патологический пример, я сначала предлагаю попробовать просто разбивать изображение на горизонтальные строки развертки и консолидировать putpixel в вызовы lineto в пределах одной горизонтальной линии сканирования. Это может быть лучше, чем то, что вы делаете, так как это больше с точки зрения памяти/кэша, что может считаться больше, чем сокращение количества вызовов API.

Если это не достаточно хорошо, и вы хотите попробовать этот полномасштабный маршрут, что-то подобное этому часто делается в индустрии 3D/игр, чтобы вычислить эффективные треугольные полосы для ячеек, чтобы обеспечить немного более компактную репутацию. Пример: http://www.codercorner.com/Strips.htm

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

Смежные вопросы