![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Во первых Microsoft не делает видеокарт, она пишет Операционные Системы. Так что нововведения в 'API видеокарты' ее абсолютно не интересуют, т.к. она пользуется API на уровне именно драйверов. Во вторых, GDI сам по себе предназначен для вывода окошек и интерфейса пользователя. Там высокие скорости не нужны. Для всякой мультимедии (видео и игры) используется другой стек со своими драйверами - DirectX. Эти драйвера более приближены к аппаратуре, и они позволяют приложениям пользователя получить максимум от каждой конкретной видеокарты. Например Direct3D использует промежуточный язык (шейдеры), на котором пишется обработка видеопотока (пишется прикладными программистами), и эта программа напрямую попадает в драйвер видеокарты, где уже сам драйвер ее транслирует так, что бы максимально воспользоваться возможностями видеокарты. Вплоть до того, что программа транслируется в код графического процессора самой видеокарты и загружается непосредственно в нее. В последнее время некоторые производители видеопроцессоров открыли доступ к ним напрямую из пользовательских приложений (см. CUDA) |
|||
|
||||
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Всем большое спасибо за объяснения! Будем ждать новых версий GDI с расширенным функционалом!
![]() Минутку. Я тут подумал... зачем вообще нужен контекст, когда можно говорить драйверу (через GDI, разумеется) DrawAnything(0, 10, 20). А драйвер-то заточен под определенную видеокарту, и ему не нужна информация о ней, которая, как я выяснил, является контекстом устройства.
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Я так понял, что вы говорите о контексте устройства (Device Context). Он нужен в первую очередь, что бы определить к какому именно драйверу производится обращение. Дело в том, что вызовы GDI одни и те же для всех разновидностей того, на чем можно рисовать. И это не только видеокарта. Это может быть принтер, могут быть разные видеокарты (или разные дисплеи на одной видеокарте) или вообще не физическое устройство, а некая виртуальная сущность (например битмэп в памяти, удаленный рабочий стол, метафайл и т.д и т.п.) |
|||
|
||||
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Все понял, спасибо всем!
![]() |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Ну и зачем? На этом GDI свет клином не сошелся. GDI нужен только для "офисных" нужд - создание окошек, вывод текста и простой графики. Большее от него и не требуется. А всякие хитрые эффекты вряд ли будут поддерживаться GDI, так как их придется уже самой МС реализовывать для устройств отличных от видеокарт. Когда нужны эффекты, то подключаются менеджеры окон и рабочего стола. И уже через мощные API (в Windows - DirectX, в остальных - OpenGL) делают все это. |
|||
|
||||
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Понятно. Т. е. GDI нужен для "кросс-устройственности", так? Чтобы одним и тем же кодом можно было рисовать и на принтере, и на видеокарте.
|
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
На данный момент, он нужен в основном для обратной совместимости
-------------------- Обижено школьников: 8 |
|||
|
||||
IGanja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Если я правильно понял то цепочка следующая:
Приложение->GDI->драйвер->железо. Но я все равно не догоняю какую роль тут играет контекст устройства? Кто ни будь может на пальцах, желательно с примерами из жизни кукольных персонажей, объяснить что такое дескриптор и зачем мы его используем? |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
дескриптор - в переводе это "описание". Это некая структура, которая содержит всю необходимую информацию для работы с чем-либо. Обычно, дескриптор скрыт за обезличенным указателем (handle в Windows) или числом (дескриптор файла в POSIX системах) с целью ограничения неконтролируемого доступа "пользователя".
Дескриптор в случае работы с графикой можно представить в виде художника с холстом. Ты ему говоришь: "нарисуй черную линию толщиной 1 мм от хх до уу"; и он ее рисует. И тебе совершенно по барабану в этот момент, рисует он карандашом, кистью, лазером или долотом. Именно для этого и созданы дескрипторы - скрыть реализацию и предоставить одинаковый инструментарий для управления однотипными объектами (устройствами). В объектно-ориентированном программировании это называется инкапсуляцией. В принципе, дескриптором можно представить указатель на базовый класс, например, ввода-вывода. Когда ты открываешь файл создается экземпляр класса File, когда сокет - класса Socket, когда pipe - Pipe. Но все они имеют общего предка. Ты можешь применять к нему стандартные методы и будут вызываться соответствующие методы классов (так как они виртуальные). Таким образом, тебе совершенно все равно откуда читать и куда писать - в эти моменты ты используешь общий функционал. |
|||
|
||||
IGanja |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 19.7.2007 Репутация: нет Всего: нет |
Спасибо, очень подробно и понятно, а про контекст устройства так же можно?
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
IGanja, да.
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Кстати, по приходу сообщения WM_PAINT ты должен перерисовать не все. Координаты областей для перерисовки можно как-то получить (я не самый большой специалист по WinAPI). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |