Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

DD and Color   Найти похожие ветки 

 
Evgeniy_K   (2004-07-30 20:39) [0]

Как вы считаете какой оптимальней юзать цвет в DD проекте?

Кое-кто настоятельно рекомендует 8-бит. Где-то написано, что можно и 16-бит.

Попробовал 32-бит. Начинает тормозить при создании проекта средней сложности.

А что скажете вы?


 
cyborg ©   (2004-07-30 21:00) [1]

Моя считает до 16 - адын дива тиры читыры ...


 
parovoZZ ©   (2004-07-30 21:39) [2]

В принципе можно использовать 256 цветов, но всё-же 16-битный цвет выглядит куда более красочнее. 32 - это, имхо, перебор для DD.


 
Evgeniy_K   (2004-07-30 22:04) [3]

А 16-битовый какой сложности проект выдержит?


 
cyborg ©   (2004-07-30 22:09) [4]

Любой.


 
Evgeniy_K   (2004-07-30 22:16) [5]

Сколько в среднем объектов?


 
cyborg ©   (2004-07-30 22:29) [6]

смотря на какой видеокарте и процессоре, у меня например 2700 спрайтов размером 20х20 ~40 кадров в секунду выводится.
GF FX 5200 + Duron 800 + PC133 + XP
в 98-ом в 1,5-2 раза быстрее.


 
cyborg ©   (2004-07-30 22:30) [7]

Это если спрайты в видеопамяти.


 
Evgeniy_K   (2004-07-31 12:04) [8]

А кто-нибудь когда-нибдь делал игру с поддержкой 32-бит под DD? Какие скорости были и сколько эффектов было заложено?


 
Sapersky   (2004-07-31 14:08) [9]

Кое-кто настоятельно рекомендует 8-бит

8 бит со свистом пойдут и в софтвере.

16, 32 - вообще разница в скорости есть, на картах с относительно медленной памятью (самых распространённых) может быть в два раза. Хотя что может тормозить в проекте DD (и как на экран помещается 2700 спрайтов) - непонятно. Если это частицы (particles) - см. Direct3D, большое кол-во одинаковых спрайтов он выводит быстрее, не говоря уже о возможных спецэффектах.


 
Evgeniy_K   (2004-07-31 14:23) [10]

Я говорю исключительно про DD. Если поставить поддержку 32-битных цветов, но на GeF4 FPS падает с 300 до 30.

И еще неясно почему работа идет быстрее, когда поверхность в видеопамяти, а не в системной. Кто-то мне говорил, что видео медленнее, чем системная, а на практике выходит наоборот. При том, что на разных картах зависимость сохраняется.

Смотрел результаты тестов winbench и 3dmark в инете, так там примерно такая же картина, но все-таки падение в 5 раз, а не в 10.

Тут с человеком поспорили, он утверждает, что 32-бит должно летать в DD, потому что у него летает в GDI. А DD в 7 раз производительнее GDI.

Я в тупике...


 
Sapersky   (2004-07-31 19:46) [11]

Если поставить поддержку 32-битных цветов, но на GeF4 FPS падает с 300 до 30.

Странно. Может, какая-то поверхность создаётся другого (16-битного, например) формата, и из-за конвертирования скорость так сильно падает. На то, что видеопамяти не хватает - не похоже, её у GeF4 навалом, наверное.
У меня на GF2MX 32 бит медленее примерно в 2 раза - как и полагается.

И еще неясно почему работа идет быстрее, когда поверхность в видеопамяти, а не в системной. Кто-то мне говорил, что видео медленнее, чем системная, а на практике выходит наоборот.

Возможно, этот кто-то имел в виду - блокировка (Lock) быстрее. Это да. Но блиттинг всегда быстрее с видео - сам подумай, если бы видеопамять была медленнее, зачем она тогда? Сравни частоты. Расстояние в см от чипа видеокарты до той и другой памяти :)

А DD в 7 раз производительнее GDI.

Это зависит от случая... Вполне допускаю и такой, при котором DD окажется медленнее - чем дядя Билли не шутит.


 
cyborg ©   (2004-07-31 20:25) [12]


> как на экран помещается 2700 спрайтов

Посчитай - узнаешь.


> [10] Evgeniy_K   (31.07.04 14:23)

В видеопамяти будет быстрее выводиться. Грузи всё в видео, будет быстро, а твои создания 32 битовых поверхностей в оперативке тормозят.


 
Evgeniy_K   (2004-08-01 12:19) [13]

Странно. Может, какая-то поверхность создаётся другого (16-битного, например) формата, и из-за конвертирования скорость так сильно падает.
Вот я тоже удивляюсь. Поверхности все 32. Но я использую доступ к пикселям на прямую - вот из-за этого и падает, но почему так сильно. Стоит мне поменять PWORD на PDWORD, так сразу все начинает сильно тормозить.

У меня на GF2MX 32 бит медленее примерно в 2 раза - как и полагается.
Да, так и должно быть,: 2-3 раза, а у меня выходит 6-10 раз :-?

У кого есть какие мысли?


 
Sapersky   (2004-08-01 14:09) [14]

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

Что, ВСЕ выводятся непосредственным доступом? Надо сказать, что DD предназначен в первую очередь для блиттинга, и если в обязательном порядке нужно рисовать попиксельно, возможно, лучше и софтвер (или некая смесь, как у Miek"а в последней версии SpriteUtils - всё рисуется софтверно на поверхность в системной памяти, потом она блиттится на экран).
И что именно делается этим непосредственным доступом? Может, всё-таки можно задействовать D3D, а то такие мощности (GeF4) - и простаивают, по сути.
По DD могу порекомендовать только убрать DDLOCK_NOSYSLOCK, если он используется. Хотя принципиально это процесс не ускорит.


 
Evgeniy_K   (2004-08-01 15:57) [15]

Попиксельно рисуется всего-то несколько эффектов, где-то 10000 пикселей/кадр - максимум, в наихудшем случае. Если убирать эти эффекты, то все равно тормозит прилично, но работает где-то в 2 раза побыстрее, чем с ними.


 
Sapersky   (2004-08-01 19:18) [16]

То, что без эффектов (блиттингом) - создавать в видео. То, что с эффектами - в системной, плюс ещё можно фрагмент бэкбуфера при непосредственном доступе загонять в системную, применять эффект, и обратно в видео ( на Королевстве Дельфи была статья - http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/helloworld/directx4.htm )


 
Evgeniy_K   (2004-08-01 20:05) [17]

почитаем-с...


 
parovoZZ ©   (2004-08-01 20:12) [18]

А вот в фотошопе с какой глубиной лучше сохранять бмп-шку?


 
Evgeniy_K   (2004-08-02 11:16) [19]

если важен размер, то 16, качество - 32


 
NikeOLD   (2004-08-02 11:49) [20]

А у тебя спрайты на одной поверхности собраны или нет? Если на разных, то вот тебе и падение в производительности. У меня 600 спрайтов (примерно твоих размеров) в 32 даже на старенькой Риве лихо тянут. При этом иногда вращается битмап размером 200 на 200 в ручном режиме (FPS конечно падает, но не смертельно).
1. Сделай свои спрайты на одной-двух поверхностях.
2. Распредели так, чтобы малоиспользуемые были в системной памяти.
3. Иногда оправданне держать в системной памяти задний буфер, а не спрайты. Надо следить какая поверхность где создается. ОЧень может быть, что в твоем случае все спрайты в системной памяти сидят.


 
Sapersky   (2004-08-02 12:44) [21]

почитаем-с...
На самом деле, автор там местами явно перегибает, так что на 100% верить не рекомендую (что поверхность при локе полностью копируется в системную - сомнительно, скорее, копируется только то, что нужно, т.к. нет разницы по скорости, блокировать нужный кусок или всю; ну и ещё кое-что, см. также мои комментарии к статье).
И вывод, кстати, тоже хорош - непосредственный доступ работает с приемлемой скоростью только с новыми картами (уровня GeForce). Которые рассматриваемый в статье предмет (блендинг) могут делать аппаратно :)
Впрочем, бывалым DD-шникам, это, кажется, глубоко фиолетово - им хоть GeForceFX дай - будут блокировать и блендить попиксельно.
Ну всё-таки намекну ещё раз: D3D7 может работать вместе с DD, так что не придётся выбрасывать существующий код и переписывать всё заново. Пример могу дать.

А у тебя спрайты на одной поверхности собраны или нет?
Точно. А я и забыл. У Краснова был пример, где показана разница - в скорости инициализации, в основном, но и вывода тоже.


 
NikeOLD   (2004-08-02 13:01) [22]


> Впрочем, бывалым DD-шникам, это, кажется, глубоко фиолетово
> - им хоть GeForceFX дай - будут блокировать и блендить попиксельно.

Естественно попиксельно. Ну если нету в DD соответсвующих механизмов. И не надо забывать в какие годы царствовал DD, когда никаких GeForce и в зачатках-то не существовало, а игры летали на машинах ниже 300 pentium. Вспомним-ка Warcraft, Diablo...
Один выход - следить, что в какой памяти сидит и ответить на вопрос, а должно ли оно сидеть там или где-то еще?


 
Sapersky   (2004-08-02 13:37) [23]

И не надо забывать в какие годы царствовал DD

Да не забываю я. И этот же аргумент привожу в защиту нежно любимого блиттера, если кто-то на него наезжает :)
Но сейчас-то годы уже немного не те? Какие карты у наших DD-шников? GeForce4, GeForceFX... Да и взять рядового (офисного) пользователя - интегрированные карты на интеловских чипсетах тоже вполне себе ускорители (во всяком случае, для D3D-2D, или как тут его обозвали, хватит).


 
Evgeniy_K   (2004-08-03 11:15) [24]

Все поверхности у меня в видеопамяти. Пробовал часть загонять в системную, но это только приводит к снижению FPS.

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


 
Evgeniy_K   (2004-08-03 11:15) [25]

Все поверхности у меня в видеопамяти. Пробовал часть загонять в системную, но это только приводит к снижению FPS.

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


 
NikeOLD   (2004-08-03 15:20) [26]

Проблема в быстродействии, скорее всего из-за слишком сильной раздробленности видеопамяти.
В книге Краснова есть хороший пример (стр.168-178), посвященный этому вопросу.
Создание множества поверхностей сильно затормозит процесс инициализации (создания поверхностей и заливки битмапов). Кроме того, в случае потери поверхности, тебе придется восстановить их все и залить битмапы снова. Это тоже займет очень много времени.
Если же все твои спрайты будут на одной поверхности, время инициализации и восстановления существенно сократится.
Однако не стоит забывать, что некотрые видеокарты не могут создавать поверхности, превышающие по размерам первичную.

Я думаю несложно объединить всю графику в один файл и заливать на одну поверхность. Координаты рисунков целесообразно хранить в этом же файле. А заодно и собственный формат.


 
Evgeniy_K   (2004-08-03 19:15) [27]

[26] Тоже вариант - графика в кучу.

Процесс инициализации пока идет нормально.

Поверхности создаются друг за другом. Мне не ясно как они могут быть раздроблены в видеопамяти. Имхо, они должны быть поочереди - лапшой.


 
NikeOLD   (2004-08-03 20:10) [28]

Не будут они по очереди никогда. Дело в том, что происходит выравнивание памяти. Если делал Lock/Unlock, то должен знать, что твоя поверхность (с длиной строки, например, 640 пикселей) в видеопамяти редко будет 640. Как правило, она будет больше на величину, называемую pitch. Отсюда память на большое количество малых фрагментов расходуется неэкономно. Ее всегда требуется значительно больше.


 
Evgeniy_K   (2004-08-03 20:38) [29]

Да, я это знаю. Да еще маленький вопросец, как выдрать из 24 битового цвета красную составляющую. Вот например зеленая: Color shr 8


 
cyborg ©   (2004-08-03 20:41) [30]

Color shr 16


 
Evgeniy_K   (2004-08-03 22:19) [31]

А синий?


 
cyborg ©   (2004-08-04 07:28) [32]

Ты ещё про альфу спроси :)

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-04 09:00) [33]

=) Да знаю я все это, просто лишний раз убедиться хотел.


 
Evgeniy_K   (2004-08-04 09:07) [34]

А нафига and? :)


 
cyborg ©   (2004-08-04 09:11) [35]

Судя по [34] Evgeniy_K   (04.08.04 09:07) я сомневаюсь в [33] Evgeniy_K   (04.08.04 09:00)


 
Evgeniy_K   (2004-08-04 17:18) [36]

дык и без него работает... может это мой клон... :)


 
Вась-Вась   (2004-11-30 20:45) [37]

>Почитай чего нибудь по теме "как хранятся данные" и по работе с >битами.

>Что такое бит, байт, слово и двойное слово. Сейчас уже >актуально и Int64.


А можно узнать, где на эту тему можно чего-нибудь почитать, т.к. я весь интернет перерыл, а ничего дельного не нашёл! Подскажите, а то я в этом деле мало чего соображаю, а это (отсутствие соображения) хотелось бы побыстрее исправить! Заранее спасибо за большое количество ссылок и названий книг!


 
cyborg ©   (2004-11-30 21:16) [38]


> [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;

В общем дальше расписывать не буду, лень мне :).


 
cyborg ©   (2004-11-30 21:18) [39]


> Или например сдвиг влево на 7 разрядов
>
> 00000001 Shl 8 = 10000000

пардон, опечатался, тут семёрка :)


 
cyborg ©   (2004-11-30 21:19) [40]

Мда, и тут R:=(RGB888 and $00FF0000) shr 8; криво написал :)

R:=(RGB888 and $0000FF00) shr 8;



Страницы: 1 2 вся ветка

Форум: "Игры";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.05 c
14-1107943456
АлексС
2005-02-09 13:04
2005.02.27
Контрольная сумма


9-1101630474
George
2004-11-28 11:27
2005.02.27
Нужна dll ка


6-1103455963
Delpher_Gray
2004-12-19 14:32
2005.02.27
InternetOpenURL - результат получилось или облом ?


14-1107765529
msguns
2005-02-07 11:38
2005.02.27
Синкопирование


1-1108308845
sr
2005-02-13 18:34
2005.02.27
DateTimePicker





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский