![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
быстрый доступ к пикселам поверхности [Delphi, Windows]
Xerx © (2004-04-16 18:39:00)Привет! Кто-нить может подсказать, как МАКСИМАЛЬНО БЫСТРО получить указатель на пиксель поверхности IDirectDrawSurface7 по координатам, считать его, преобразовать и засунуть обратно...
И ещё, как можно повернуть картинку быстрее, чем у меня:
function TImageMap.Rotare(Angle: single; Xc, Yc : integer): HRESULT;
var
cosA,
sinA : extended;
x, y,
w, h,
iO,
iP,
jO,
jP : integer;
r : PCardinal;
sur : TDDSURFACEDESC2;
e : extended;
begin
Result := DD_FALSE;
with Rect do
begin
w := Right-Left+1;
h := Bottom-Top+1;
end;
if (Xc=-1) then
Xc := w div 2;
if (Yc=-1) then
Yc := h div 2;
asm
FLD Angle
FSINCOS
FSTP cosA
FSTP sinA
FWAIT
end;
ZeroMemory(@sur, SizeOf(sur));
sur.dwSize := SizeOf(sur);
FSurface.Lock(nil, sur, DDLOCK_WAIT, 0);
for y := h-1 downto 0 do
begin
jP := y - Yc;
for x := w-1 downto 0 do
begin
iP := x - Xc;
asm
fild iO
fld cosA
fmulp st(1),st
fild jO
fld sinA
fmulp st(1),st
fsubp st(1),st
fild Xc
faddp st(1),st
fistp iO
fild iO
fld cosA
fmulp st(1),st
fild jO
fld sinA
fmulp st(1),st
faddp st(1),st
fild Yc
faddp st(1),st
fistp jO
end;
// iO := Xc + trunc(iP * cosA - jP * sinA);
// jO := Yc + trunc(iP * sinA + jP * cosA);
if (iO>=0)and(iO<w)and(jO>=0)and(jO<h) then
begin
r := PCardinal(integer(sur.lpSurface)+y*sur.lPitch+4*x);
r^ := FEffectArray[iO, jO];//точка в массиве, хранящем исходную картинку
end;
end;//for x
end;//for y
Result := FSurface.Unlock(nil);
end;
Нужно вносить изменения ИМЕННО В ПОВЕРХНОСТЬ!!!
Xerx (2004-04-26 20:43:00) [1]VMcL, кто ещё смылся!!! Я ответы смотрю...
NikeOLD (2004-04-22 21:48:00) [2]В общем, нечего здесь огород городить, вот ссылка на другую ветвь. Приглашаются все желающие.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1082655981&n=9
NikeOLD (2004-04-22 21:01:00) [3]
> Может стоило бы отдельную ветку завести по поводу Lock/Unlock,
> а то мы нафлудили в этой уже выше крыши?
Может и стоит!
> miek © (22.04.04 00:20) [22]
Что мне с твоего экзешника или исходники - времени нет по ним ползать! Ты просто скинь тот участок кода где получаешь указатель, а затем тот, где его используешь без Lock/Unlock.
VMcL (2004-04-22 14:35:00) [4]>>miek © (22.04.04 00:20) [22]
Может стоило бы отдельную ветку завести по поводу Lock/Unlock, а то мы нафлудили в этой уже выше крыши?
miek (2004-04-22 00:20:00) [5]>Не прокатит! Поверхность (ее положение) в памяти будет постоянно меняться
Еще один знаток. Развелось великих гуру - как...
>И вообще пусть пример скинет
Экзешник можешь уже сейчас смотреть (читай выше). С Alt+Tab я уже разобрался, только в W2000 не совсем правильно. Завтра выложу и исходники.
NikeOLD (2004-04-21 23:22:00) [6]
> cyborg © (20.04.04 08:05) [20]
Не прокатит! Поверхность (ее положение) в памяти будет постоянно меняться, при условии конечно, что эта поверхность принадлежит к flipping structure. И вообще пусть пример скинет. Как ему прямой доступ без Lock / Unlock удается, тогда и разберемся!
cyborg (2004-04-20 08:05:00) [7][18] NikeOLD (19.04.04 22:18)
Писать не лень было, а прочитать лень? :)
Речь идёт о том, что перед использованием прямого доступа к поверхности нужно делать Lock поверхности, после использования Unlock, а miek утверждает, что можно один раз получить адрес поверхности и затем Lock Unlock можно не делать.
Смотри [1] miek © (16.04.04 20:37)
miek (2004-04-19 23:47:00) [8]> или не перключал Alt-Tab
Переключал. Вон #10 почитай. Только, прошу уточнить, мой-то подход в том, что именно поверхность НЕ лочить. При переключении поверхности исправно теряются (как и должно быть), но сделаешь им Restore и все ОК.
>Естественно автору невдомек
Ну, выложу я завтра версию с восстановлением - легче тебе будет?
>Тьфу, а еще с советами лезет
Собака лает - караван идет.
NikeOLD (2004-04-19 22:18:00) [9]Да... слов нет, одни буквы и те нецензурные...
А что будет, когда ты попытаешься залоченую страницу переключить? Никто не подумал. Что плохого в длительном локе? Сказано же в SDK - все! Залочил, сделал дело и немедленно разлочь. Если залочить надолго, лучшее что может случиться - Access Violation, худшее - сам попробуй!
Потом, miek, похоже никогда не усыплял компьютер во время работы своей программы или не перключал Alt-Tab. Залоченная память такие фокусы выдаст при этом, кроме того Lock всегда значит "блокировка", а раз заблокировал - разблокируй когда все сделал! По-английски же написано, ну в самом деле для детей. А у автора miek'a похоже поверхности никогда не терялись, а отслеживать утечки память он тоже не научился... Ну да, в его рекомендуемой программе после Alt-Tab красивая картинка на Рабочем столе выскочила. Естественно автору невдомек, что при обратном переключении в игру поверхности надобно восстанавливать, а графику bmp заново на поверхности заливать! Тьфу, а еще с советами лезет! Мой совет Miek сначала избавься от этих багов, а затем учи как лочить поверхности!!!!
VMcL (2004-04-19 21:15:00) [10]>>miek © (19.04.04 19:37) [15]
Да автор вообще вопрос задал и смылся...
GrayFace (2004-04-19 19:44:00) [11]А что плохого в длительном локе?
> Buff := Buff + 4;
Быстрее будет Inc(Buff,4);
miek (2004-04-19 19:37:00) [12]Проверено как миниму на 8 компах (два моих, 6 - здешних обитателей, добровольное тестирование).
Если автора ветки не настаивает, обсуждение считаю законченным.
VMcL (2004-04-19 17:44:00) [13]>>miek © (19.04.04 16:46) [13]
Если на одном конкретном компьютере заработало, то ещё ни о чём не говорит; тем более ты не указал параметры оного (железо, ОС, ...).
miek (2004-04-19 16:46:00) [14]Еще чуть-чуть, товарищ Федя, и ты перейдешь на голый флейм.
Специально для остальных и для автора ветки в особенности довожу: буквально позавчера я такой эксперимент проводил, не пожалел времени. Результат нормальный. Теряются в состояние Lost поверхности при переключени задач, и это все. Сделав им Restore, спокойно продолжаю работу. Комп был именно с 64 мегабайтами памяти.
cyborg (2004-04-19 08:07:00) [15]Реши задачу:
Кулгеймдевелопер miek сделал игру. Вней много высококачественных спрайтов занимающих размером 90+ мегабайт. Для быстродействия кулгеймдевелопер miek не делает Lock поверхностям при чтении и записи в них, ведь итак всё работает на его компьютере.
Кулгеймер Федяй запускает супер игру кулгеймдевелопера miek на компьютере с 64 мегабайтами оперативной памяти.
Вопрос: какие слова произнесёт Федяй и что случится с игрой на его диске?
VMcL (2004-04-18 12:42:00) [16]>> 2 cyborg
miek не тот человек, с которым можно что-либо обсуждать.
miek (2004-04-18 11:36:00) [17]> вот сомневаюсь что видеопамять окажеться в свопе
Даже обычная память, пока твоя программа на переднем плане и пишет в нее, никогда в свопе не окажется. А если бы и оказалась (ну, Alt+Tab нажали) - и что с того? Подгрузит обратно.
>Читай вторую строку из
Кончая долдонить "стрижено-брито".
cyborg (2004-04-18 08:59:00) [18]
> Я вот сомневаюсь что видеопамять окажеться в свопе
Я про видеопамять в свопе ничего не говорил, она никогда там не окажется.
[7] miek © (17.04.04 23:27)
Читай вторую строку из [6] cyborg © (17.04.04 20:58), если не понял, то ещё раз прочитай, и так пока не поймёшь.
Serzh ML (2004-04-17 23:54:00) [19]Я вот сомневаюсь что видеопамять окажеться в свопе, слишком уж медленно будет, да и для хранения 1024х768@32 нужно всего-то 3мб памяти,. оперативной полюбому хватит, а если и не хватит то скорее всего вылетит с ошибкой. Насчёт доступа к пикселу. я не особо вникал в твой код, особенно в ассемблерный, лень мне=)), зато могу с некоторой уверенностью сказать что чем меньше умножений/делений тем быстрее работать будет твоя прога, т.е. например для получения значения пиксела может лучше сразу считать абсолютное смещение?, т.е.
где-то в начале:
Buff := sur.lpSurface
потом за каждый ход цикла
Buff := Buff + 4;
miek (2004-04-17 23:27:00) [20]Вместо ЭТОЙ глупости, взял бы да доказал. Примером. Жду ответа, как соловей лета.