упражнение по дизайну, желательно с использованием mfc

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

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

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


person Idan    schedule 18.12.2009    source источник


Ответы (1)


Очевидным местом для использования снимков экрана было бы выполнение команды «отменить». Самый простой метод, требующий много памяти, - это делать снимок экрана перед каждым действием. Если пользователь нажимает «отменить», вы можете восстановить старый экран.

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

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

person Jerry Coffin    schedule 18.12.2009