дизайн упражнение желательно с использованием MFC - PullRequest
3 голосов
/ 18 декабря 2009

Мне сказали разработать программу для кисти в 2-х вариантах: одна использует много места и мало процессора, а другая наоборот.

Идея (как мне сказали, так что я не уверен) заключается в том, чтобы каким-то образом сохранить снимки экрана, а не сохранять карты XOR (что я понятия не имею, что это значит), которые представляют дельту между рисунками.

Может кто-нибудь предложить способ или добавить ссылки на связанный материал?

1 Ответ

5 голосов
/ 18 декабря 2009

Очевидное место для использования снимков экрана - реализация команды «Отменить». Простой метод захвата памяти - сделать снимок экрана перед каждым действием. Если пользователь нажимает «Отменить», вы можете восстановить старый экран.

Для экономии места в памяти вы сохраняете только разницу между двумя экранами, XOR их вместе. Само по себе это фактически не сохраняет никакого пространства, но устанавливает все неизмененные пиксели равными 0. Чтобы сэкономить пространство, вам необходимо применить какое-то сжатие. Учитывая, что вы обычно можете ожидать довольно большие области, которые все равны нулю, кодирование длин серий, вероятно, будет быстрым и эффективным. Для кодирования длины серии вы обычно превращаете строку идентичных байтов в два байта, первый из которых содержит длину цикла, а второй - значение. Например, 75 нулей в строке будут закодированы как 75 0.

Если вы хотите пойти дальше, вместо сохранения растровых изображений XORed, вы можете использовать метафайл. Метафайл записывает действия, предпринятые на уровне вызовов Windows GDI, поэтому (например), если вы нарисовали красный прямоугольник 100x200 в 10, 100, он по сути записал бы, что вместо двадцати тысяч пикселей он сохранит идентификатор, указывающий, какую функцию GDI нужно выполнить, и параметры, предоставляемые этой функции. В типичном случае это может составлять в среднем около 15-20 байт на «выполненную команду». В то же время, это (часто) требует больше вычислений - например, если вы рисуете круг, повторный запуск метафайла требует повторного растеринга круга вместо того, чтобы просто сохранять полученные биты.

...