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

Вниз

быстрый доступ к пикселам поверхности   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.036 c
4-1088188305
Timyrlan
2004-06-25 22:31
2004.08.08
Получить сообщение другому приложению


1-1090908906
lightix
2004-07-27 10:15
2004.08.08
Установить в программе формат вывода даты для DateTimePicker


1-1090875187
ANT
2004-07-27 00:53
2004.08.08
Размер имеет значение!


3-1089724493
Helga
2004-07-13 17:14
2004.08.08
Мастера! помогите девушке разобраться с Rave report!


6-1086713111
Dubensky
2004-06-08 20:45
2004.08.08
Привет всем. Подскажите как по сети динуть файл, если нету шар?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский