![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DD and Color
Evgeniy_K © (2004-07-30 20:39:00)Как вы считаете какой оптимальней юзать цвет в DD проекте?
Кое-кто настоятельно рекомендует 8-бит. Где-то написано, что можно и 16-бит.
Попробовал 32-бит. Начинает тормозить при создании проекта средней сложности.
А что скажете вы?
Вась-Вась (2004-11-30 21:21:00) [1]Спасибо! Слава отечественным Мастерам Delphi!
cyborg (2004-11-30 21:19:00) [2]Мда, и тут R:=(RGB888 and $00FF0000) shr 8;криво написал :)
R:=(RGB888 and $0000FF00) shr 8;
cyborg (2004-11-30 21:18:00) [3]
> Или например сдвиг влево на 7 разрядов
>
> 00000001 Shl 8 = 10000000
пардон, опечатался, тут семёрка :)
cyborg (2004-11-30 21:16:00) [4]
> [37] Вась-Вась (30.11.04 20:45)
Книг я таких не видел.
Разряд = бит = вкл/выкл = единица/ноль
1 байт = 8 бит
слово (Word) = 2 байта = 16 бит
Двойное слово (DWord) = 4 байта = 32 бита
Int64 = 8 байт = 64 бита
1 байт = 8 разрядов (Вкл/Выкл) = 11111111
0 (число) = 00000000
1 (число) = 00000001
2 (число) = 00000010
3 (число) = 00000011
4 (число) = 00000100
и т.д.
Сложение разрядов производится аналогично десятичной системы (напр. в столбик) при переполнении (более 9 в десятичной системе или 1 в бинарной) переносим значение
1+1=2:
00000001 (1)
00000001 (1)
---------
00000010 (2)
2+1=3:
00000010 (2)
00000001 (1)
---------
00000011 (3)
3+1=4:
00000011 (3)
00000001 (1)
---------
00000100 (4)
Сдвиг это смещение битов влево или вправо
например сдвиг байта со значением 1 влево на один разряд
Byte:=1;
Byte:=Byte Shl 1;
00000001 Shl 1 = 00000010
Или например сдвиг влево на 7 разрядов
00000001 Shl 8 = 10000000
--------------------------------
Как это применяется, например нам надо из 24 битового цвета формата RGB888 сделать 16 битовое формата RGB565.
Сначала получаем отдельный байты значения цвета R G B, в формате RGB888 в битах это будет выглядеть так RRRRRRRRGGGGGGGGBBBBBBBB - 24 бита, первые 8 бит это значение красного цвета, следующие 8 бит значение зелёного цвета и последние 8 бит это значение синего цвета. Формат 16 битового цвета формата RGB565 хранится в двух байтах в виде RRRRRGGGGGGRRRRR - первые 5 бит значение красного цвета, следующие 6 бит значение зелёного цвета и последние 5 бит значение синего цвета.
Чтобы получить красный цвет из цвета формата RGB888 нам нужно сдвинуть 16 бит вправо - R:=RGB888 SHR 16;
Чтобы получить зелёный цвет, можно пойти двумя путями. Первый путь это сначала сдвинуть биты влево на 8 разрядов, затем сдвинуть вправо на 16 разрядов. Либо воспользоваться битовым сравнением а затем сдвинуть вправо на 8 бит. R:=(RGB888 and $00FF0000) shr 8;
В общем дальше расписывать не буду, лень мне :).
Вась-Вась (2004-11-30 20:45:00) [5]>Почитай чего нибудь по теме "как хранятся данные" и по работе с >битами.
>Что такое бит, байт, слово и двойное слово. Сейчас уже >актуально и Int64.
А можно узнать, где на эту тему можно чего-нибудь почитать, т.к. я весь интернет перерыл, а ничего дельного не нашёл! Подскажите, а то я в этом деле мало чего соображаю, а это (отсутствие соображения) хотелось бы побыстрее исправить! Заранее спасибо за большое количество ссылок и названий книг!
Evgeniy_K (2004-08-04 17:18:00) [6]дык и без него работает... может это мой клон... :)
cyborg (2004-08-04 09:11:00) [7]Судя по [34] Evgeniy_K (04.08.04 09:07)я сомневаюсь в [33] Evgeniy_K (04.08.04 09:00)
Evgeniy_K (2004-08-04 09:07:00) [8]А нафига and? :)
Evgeniy_K (2004-08-04 09:00:00) [9]=) Да знаю я все это, просто лишний раз убедиться хотел.
cyborg (2004-08-04 07:28:00) [10]Ты ещё про альфу спроси :)
Color : Cardinal;
A:=Color shr 24;
R:=(Color and $00FF0000) shr 16;
G:=(Color and $0000FF00) shr 8;
B:=(Color and $000000FF);
Почитай чего нибудь по теме "как хранятся данные" и по работе с битами.
Что такое бит, байт, слово и двойное слово. Сейчас уже актуально и Int64.
Evgeniy_K (2004-08-03 22:19:00) [11]А синий?
cyborg (2004-08-03 20:41:00) [12]Color shr 16
Evgeniy_K (2004-08-03 20:38:00) [13]Да, я это знаю. Да еще маленький вопросец, как выдрать из 24 битового цвета красную составляющую. Вот например зеленая:
Color shr 8
NikeOLD (2004-08-03 20:10:00) [14]Не будут они по очереди никогда. Дело в том, что происходит выравнивание памяти. Если делал Lock/Unlock, то должен знать, что твоя поверхность (с длиной строки, например, 640 пикселей) в видеопамяти редко будет 640. Как правило, она будет больше на величину, называемую pitch. Отсюда память на большое количество малых фрагментов расходуется неэкономно. Ее всегда требуется значительно больше.
Evgeniy_K (2004-08-03 19:15:00) [15][26] Тоже вариант - графика в кучу.
Процесс инициализации пока идет нормально.
Поверхности создаются друг за другом. Мне не ясно как они могут быть раздроблены в видеопамяти. Имхо, они должны быть поочереди - лапшой.
NikeOLD (2004-08-03 15:20:00) [16]Проблема в быстродействии, скорее всего из-за слишком сильной раздробленности видеопамяти.
В книге Краснова есть хороший пример (стр.168-178), посвященный этому вопросу.
Создание множества поверхностей сильно затормозит процесс инициализации (создания поверхностей и заливки битмапов). Кроме того, в случае потери поверхности, тебе придется восстановить их все и залить битмапы снова. Это тоже займет очень много времени.
Если же все твои спрайты будут на одной поверхности, время инициализации и восстановления существенно сократится.
Однако не стоит забывать, что некотрые видеокарты не могут создавать поверхности, превышающие по размерам первичную.
Я думаю несложно объединить всю графику в один файл и заливать на одну поверхность. Координаты рисунков целесообразно хранить в этом же файле. А заодно и собственный формат.
Evgeniy_K (2004-08-03 11:15:00) [17]Все поверхности у меня в видеопамяти. Пробовал часть загонять в системную, но это только приводит к снижению FPS.
Не совсем ясно какая разница когда сспрайты на одной или n-поверхностях? Я ведь все-равно буду делать блиттинг n раз. Поясните, если не затруднит.
Evgeniy_K (2004-08-03 11:15:00) [18]Все поверхности у меня в видеопамяти. Пробовал часть загонять в системную, но это только приводит к снижению FPS.
Не совсем ясно какая разница когда сспрайты на одной или n-поверхностях? Я ведь все-равно буду делать блиттинг n раз. Поясните, если не затруднит.
Sapersky (2004-08-02 13:37:00) [19]И не надо забывать в какие годы царствовал DD
Да не забываю я. И этот же аргумент привожу в защиту нежно любимого блиттера, если кто-то на него наезжает :)
Но сейчас-то годы уже немного не те? Какие карты у наших DD-шников? GeForce4, GeForceFX... Да и взять рядового (офисного) пользователя - интегрированные карты на интеловских чипсетах тоже вполне себе ускорители (во всяком случае, для D3D-2D, или как тут его обозвали, хватит).
NikeOLD (2004-08-02 13:01:00) [20]
> Впрочем, бывалым DD-шникам, это, кажется, глубоко фиолетово
> - им хоть GeForceFX дай - будут блокировать и блендить попиксельно.
Естественно попиксельно. Ну если нету в DD соответсвующих механизмов. И не надо забывать в какие годы царствовал DD, когда никаких GeForce и в зачатках-то не существовало, а игры летали на машинах ниже 300 pentium. Вспомним-ка Warcraft, Diablo...
Один выход - следить, что в какой памяти сидит и ответить на вопрос, а должно ли оно сидеть там или где-то еще?