Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DD and Color


Страницы:   1 2 3

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...
Один выход - следить, что в какой памяти сидит и ответить на вопрос, а должно ли оно сидеть там или где-то еще?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо