Текущий архив: 2004.08.08;
Скачать: CL | DM;
Внизбыстрый доступ к пикселам поверхности Найти похожие ветки
← →
Xerx © (2004-04-16 18:39) [0]Привет! Кто-нить может подсказать, как МАКСИМАЛЬНО БЫСТРО получить указатель на пиксель поверхности 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;
Нужно вносить изменения ИМЕННО В ПОВЕРХНОСТЬ!!!
← →
miek © (2004-04-16 20:37) [1]Не обязательно постоянно лочить-разлочивать. Залочил, получил указатель, разлочил. Дальше и используешь этот указатель. ТОЛЬКО: это должна быть не первичная поверхность.
А насчет поворота посмотри, например, как у меня в SpriteUtils-2. http://www.miek.narod.ru/spriteutils2.zip
← →
VMcL © (2004-04-16 21:22) [2]>>miek © (16.04.04 20:37) [1]
Да ну?
After retrieving a surface memory pointer, you can access the surface memory until a corresponding IDirectDrawSurface7::Unlock method is called. When the surface is unlocked, the pointer to the surface memory is invalid.
← →
miek © (2004-04-16 22:47) [3]Ну да. Шоб мэнэ повылазыло! Попробуй сам. Или вот живой пример (без исходников, правда) http://www.miek.narod.ru/spacediver.zip
А на MSDN иногда и положить можно.
← →
cyborg © (2004-04-17 10:08) [4][3] miek © (16.04.04 22:47)
Когда виндоуз поместит твою поверхность, которая в оперативной памяти, в своп, то у тебя выскочит супер эффект от Микрософт, асес виолатион называется.
А если ты размещаешь поверхность в видеопамяти, то при захвате (Lock) поверхности, она с видеопамяти переносится в оперативную, где ты её изменяешь, затем при освобождении (Unlock) она переностися назад в видеопамять, что ты сам и указал "ТОЛЬКО: это должна быть не первичная поверхность." она ведь в видеопамяти находится.
← →
miek © (2004-04-17 18:31) [5]>Когда виндоуз поместит твою поверхность, которая в оперативной памяти, в своп
Никогда не поместит, мой дорогой Ватсон! Попробуйте продемонстрировать (примерчик там написать) свое глубокомысленное заявление.
← →
cyborg © (2004-04-17 20:58) [6]Вместо этой глупости, лучше бы осознал свою ошибку.
Запусти свою программу на компьютере с маленьким объёмом оперативной памяти.
← →
miek © (2004-04-17 23:27) [7]Вместо ЭТОЙ глупости, взял бы да доказал. Примером. Жду ответа, как соловей лета.
← →
Serzh ML © (2004-04-17 23:54) [8]Я вот сомневаюсь что видеопамять окажеться в свопе, слишком уж медленно будет, да и для хранения 1024х768@32 нужно всего-то 3мб памяти,. оперативной полюбому хватит, а если и не хватит то скорее всего вылетит с ошибкой. Насчёт доступа к пикселу. я не особо вникал в твой код, особенно в ассемблерный, лень мне=)), зато могу с некоторой уверенностью сказать что чем меньше умножений/делений тем быстрее работать будет твоя прога, т.е. например для получения значения пиксела может лучше сразу считать абсолютное смещение?, т.е.
где-то в начале:Buff := sur.lpSurface
потом за каждый ход циклаBuff := Buff + 4;
← →
cyborg © (2004-04-18 08:59) [9]
> Я вот сомневаюсь что видеопамять окажеться в свопе
Я про видеопамять в свопе ничего не говорил, она никогда там не окажется.
[7] miek © (17.04.04 23:27)
Читай вторую строку из [6] cyborg © (17.04.04 20:58), если не понял, то ещё раз прочитай, и так пока не поймёшь.
← →
miek © (2004-04-18 11:36) [10]> вот сомневаюсь что видеопамять окажеться в свопе
Даже обычная память, пока твоя программа на переднем плане и пишет в нее, никогда в свопе не окажется. А если бы и оказалась (ну, Alt+Tab нажали) - и что с того? Подгрузит обратно.
>Читай вторую строку из
Кончая долдонить "стрижено-брито".
← →
VMcL © (2004-04-18 12:42) [11]>>2 cyborg
miek не тот человек, с которым можно что-либо обсуждать.
← →
cyborg © (2004-04-19 08:07) [12]Реши задачу:
Кулгеймдевелопер miek сделал игру. Вней много высококачественных спрайтов занимающих размером 90+ мегабайт. Для быстродействия кулгеймдевелопер miek не делает Lock поверхностям при чтении и записи в них, ведь итак всё работает на его компьютере.
Кулгеймер Федяй запускает супер игру кулгеймдевелопера miek на компьютере с 64 мегабайтами оперативной памяти.
Вопрос: какие слова произнесёт Федяй и что случится с игрой на его диске?
← →
miek © (2004-04-19 16:46) [13]Еще чуть-чуть, товарищ Федя, и ты перейдешь на голый флейм.
Специально для остальных и для автора ветки в особенности довожу: буквально позавчера я такой эксперимент проводил, не пожалел времени. Результат нормальный. Теряются в состояние Lost поверхности при переключени задач, и это все. Сделав им Restore, спокойно продолжаю работу. Комп был именно с 64 мегабайтами памяти.
← →
VMcL © (2004-04-19 17:44) [14]>>miek © (19.04.04 16:46) [13]
Если на одном конкретном компьютере заработало, то ещё ни о чём не говорит; тем более ты не указал параметры оного (железо, ОС, ...).
← →
miek © (2004-04-19 19:37) [15]Проверено как миниму на 8 компах (два моих, 6 - здешних обитателей, добровольное тестирование).
Если автора ветки не настаивает, обсуждение считаю законченным.
← →
GrayFace © (2004-04-19 19:44) [16]А что плохого в длительном локе?
> Buff := Buff + 4;
Быстрее будет Inc(Buff,4);
← →
VMcL © (2004-04-19 21:15) [17]>>miek © (19.04.04 19:37) [15]
Да автор вообще вопрос задал и смылся...
← →
NikeOLD (2004-04-19 22:18) [18]Да... слов нет, одни буквы и те нецензурные...
А что будет, когда ты попытаешься залоченую страницу переключить? Никто не подумал. Что плохого в длительном локе? Сказано же в SDK - все! Залочил, сделал дело и немедленно разлочь. Если залочить надолго, лучшее что может случиться - Access Violation, худшее - сам попробуй!
Потом, miek, похоже никогда не усыплял компьютер во время работы своей программы или не перключал Alt-Tab. Залоченная память такие фокусы выдаст при этом, кроме того Lock всегда значит "блокировка", а раз заблокировал - разблокируй когда все сделал! По-английски же написано, ну в самом деле для детей. А у автора miek"a похоже поверхности никогда не терялись, а отслеживать утечки память он тоже не научился... Ну да, в его рекомендуемой программе после Alt-Tab красивая картинка на Рабочем столе выскочила. Естественно автору невдомек, что при обратном переключении в игру поверхности надобно восстанавливать, а графику bmp заново на поверхности заливать! Тьфу, а еще с советами лезет! Мой совет Miek сначала избавься от этих багов, а затем учи как лочить поверхности!!!!
← →
miek © (2004-04-19 23:47) [19]> или не перключал Alt-Tab
Переключал. Вон #10 почитай. Только, прошу уточнить, мой-то подход в том, что именно поверхность НЕ лочить. При переключении поверхности исправно теряются (как и должно быть), но сделаешь им Restore и все ОК.
>Естественно автору невдомек
Ну, выложу я завтра версию с восстановлением - легче тебе будет?
>Тьфу, а еще с советами лезет
Собака лает - караван идет.
← →
cyborg © (2004-04-20 08:05) [20][18] NikeOLD (19.04.04 22:18)
Писать не лень было, а прочитать лень? :)
Речь идёт о том, что перед использованием прямого доступа к поверхности нужно делать Lock поверхности, после использования Unlock, а miek утверждает, что можно один раз получить адрес поверхности и затем Lock Unlock можно не делать.
Смотри [1] miek © (16.04.04 20:37)
← →
NikeOLD (2004-04-21 23:22) [21]
> cyborg © (20.04.04 08:05) [20]
Не прокатит! Поверхность (ее положение) в памяти будет постоянно меняться, при условии конечно, что эта поверхность принадлежит к flipping structure. И вообще пусть пример скинет. Как ему прямой доступ без Lock / Unlock удается, тогда и разберемся!
← →
miek © (2004-04-22 00:20) [22]>Не прокатит! Поверхность (ее положение) в памяти будет постоянно меняться
Еще один знаток. Развелось великих гуру - как...
>И вообще пусть пример скинет
Экзешник можешь уже сейчас смотреть (читай выше). С Alt+Tab я уже разобрался, только в W2000 не совсем правильно. Завтра выложу и исходники.
← →
VMcL © (2004-04-22 14:35) [23]>>miek © (22.04.04 00:20) [22]
Может стоило бы отдельную ветку завести по поводу Lock/Unlock, а то мы нафлудили в этой уже выше крыши?
← →
NikeOLD (2004-04-22 21:01) [24]
> Может стоило бы отдельную ветку завести по поводу Lock/Unlock,
> а то мы нафлудили в этой уже выше крыши?
Может и стоит!
> miek © (22.04.04 00:20) [22]
Что мне с твоего экзешника или исходники - времени нет по ним ползать! Ты просто скинь тот участок кода где получаешь указатель, а затем тот, где его используешь без Lock/Unlock.
← →
NikeOLD (2004-04-22 21:48) [25]В общем, нечего здесь огород городить, вот ссылка на другую ветвь. Приглашаются все желающие.
http://delphimaster.net/view/9-1082655981/
← →
Xerx © (2004-04-26 20:43) [26]VMcL, кто ещё смылся!!! Я ответы смотрю...
Страницы: 1 вся ветка
Текущий архив: 2004.08.08;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.034 c