Как стать автором
Обновить

Пишем легаси с нуля на С++, не вызывая подозрение у санитаров. 05 — GDI рендер

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров2.9K
Всего голосов 15: ↑15 и ↓0+20
Комментарии14

Комментарии 14

Я об этом проекте упоминал в прошлых статьях. Он получился слишком жирным и сложно портируемым под старые системы. Такой большой проект я так и не смог портировать под DOS и Windows 3.1 И еще проблема, что я в него впихнул всё, и форматы графики, аудио, шрифты с поддержкой free type. Теперь я понимаю, что такие вещи должны быть внешними.

Поэтому решил начать заново, но уже с учетом предыдущего опыта и уже по мере реализации пока кодовая база небольшая портировать и под DOS и под Windows 3.1

Сделать его реально компактным.

Ну и по мере реализации, всегда хотелось поделиться мыслями и решениями которые использую в разработке LDL. Такой некий гайд получается.

ИМХО слово "портировать" и чуть-чуть слова "старые системы" подразумевают не стареющую классику: голый (как Король) membuff + минимальный, но удачный набор алгоритмов графики над ним.

Там не только в этом проблема. Много лишних namespace'ов, лишнего функционала. И главное я набил руку на этом проекте. И теперь знаю как некоторые вещи сделать хорошо или упростить.

То о чем вы говорите, будет просто ещё одним вариантом рендера.

голый (как Король) membuff + минимальный, но удачный набор алгоритмов графики над ним.

Ещё в планах такой рендер портировать под микроконтроллеры. Да и вообще всю библиотеку LDL, если это возможно конечно.

Для этого каждую новую фичу или функционал, как бы в уме прокручиваю, будет ли работать на том или ином железе. Мало функционала, лучше портабельность.

В своё время пользовался очень компактным рендером, с весьма качественной реализацией.

https://agg.sourceforge.net/antigrain.com/index.html

Очень хорошо работает в условиях недостатка памяти.
В частности на нём была написана iGo для КПК ещё в каменном веке.

Второе, насчёт GUI для старых систем, рекламирую второй раз на хабре - Zinc!

В своё время тоже плотно возился с DirectX и GDI. Эх как давно было!
Если вы хотите просто вывести свой DIB, но не хотите что бы GDI отслеживал его как ресурс, лучше использовать функцию SetDIBitsToDevice, сэкономите целое копирование. В 2001-м году, такие нюансы были ой как заметны и важны ;)

Посмотрю спасибо, SetDIBitsToDevice насколько я помню, она может выводить именно кусок памяти без создания bitmap и всего остального обвяза.

В 2001-м году, такие нюансы были ой как заметны и важны ;)

Для старого железа 25+ летней давности это и сейчас важно:)

Данные функции поддерживаются в Windows 95, 98. Для Windows 3.1 нужно будет найти альтернативу.

А нетути. Windows 3.x изначально не поддерживал работу с DIB напрямую (CreateDIBSection() и его друзья). Есть SetDIBits(), StretchDIBits() и, кажется, SetDIBitsToDevice(), но всё это дохлый номер. Зато была библиотека WinG, являвшаяся по сути тем же API для DIB section, но перенесённым с Windows 95 (тогда ещё Chicago) обратно на Windows 3.11 - после пинка от Джона Кармака из-за неудачи с портированием DOOM. И вот там уже как раз есть WinGStretchBlt() и прочие штучки.

Что до TransparentBlt(), то увы, он появился уже только в Windows 98 (линейка 9x) и Windows 2000 (линейка NT). И да: учти, что для полноэкранного режима лучше использовать вообще другие способы, типа DCI / DispDIB или же сторонних решений вроде SciTech WinDirect (в частности, на ней был основан, кажется, WinQuake - самый первый порт Quake на Windows, ещё до GLQuake).

Не уверен, что точно помню детали, но в остальном, думаю, нигде не соврал.

Спасибо за дополнительную информацию. На Windows 3.1 пока проблема с выводом, картинок. И я еще пока не тестировал вывод картинок через GDI на Windows 95.

Надо будет изучить этот вопрос.

Что до TransparentBlt(), то увы, он появился уже только в Windows 98 (линейка 9x) и Windows 2000 (линейка NT). И да: учти, что для полноэкранного режима лучше использовать вообще другие способы, типа DCI / DispDIB или же сторонних решений вроде SciTech WinDirect (в частности, на ней был основан, кажется, WinQuake - самый первый порт Quake на Windows, ещё до GLQuake).

Поддержка GDI нужна как опция, я не возлагаю особых надежд на производительность. GDI нужен больше для очень старых систем, где 256-512 кб на видеокарте. Выводит графику и ладно.

И поковыряться во всем этом интересно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории