|
11.12.2010, 19:28
|
#1
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
ReadPixelFast...
Не пойму в чем проблемма, стандартный сэмпл насчет команды ReadPixelFast работает вроде корректно... Но если я начинаю его колупать (а колупать там почти нечего) то начинаются такие проблеммы:
1. Меняю разрешение экрана с Graphics 640,480,16 на любое другое (3 разрешения перепробовал) - Mav...
2. При разрешении Graphics 640,480,16,2 (запускаю в окне) - Mav...
3. -
Graphics 640,480,16
Print "Нажмите любую клавишу для начала чтения пиксела";Если убрать эту строчку то тоже MAV...
WaitKey()
;Загружаем и выводим рисунок на экран
pic=LoadImage("Media/blitzlogo.bmp")
DrawImage pic,0,0
; Организуем массив, в который занесем цвета всех точек экрана
Dim pix(GraphicsWidth(),GraphicsHeight())
LockBuffer
; Используя ReadPixelFast, занесем каждый пиксел в массив
For y=0 To GraphicsHeight()
For x=0 To GraphicsWidth()
pix(x,y)=ReadPixelFast(x,y)
Next
Next
; Разблокируем буфер
UnlockBuffer
Cls
; Заблокируем буфер перед применением WritePixelFast
LockBuffer
;Используя WritePixelFast, выведем сохраненные пикселы снова на экран
For y=0 To GraphicsHeight()
For x=0 To GraphicsWidth()
WritePixelFast x,y,pix(x,GraphicsHeight()-y) ; координату y перевернем
Next
Next
; разблокируем буфер после WritePixelFast
UnlockBuffer
WaitKey()
В чем проблемма?
Прилагаю сэмпл (13 кб.)
|
(Offline)
|
|
11.12.2010, 19:51
|
#2
|
Бывалый
Регистрация: 10.06.2006
Сообщений: 808
Написано 354 полезных сообщений (для 832 пользователей)
|
Ответ: ReadPixelFast...
Используй вместо WritePixelFast/ReadPixelFast просто WritePixel/ReadPixel и будет тебе счастье! либо сделай так, чтобы при "быстрой" отрисовке координаты не выходили за экран/буффер. Я уже об этом как-то писал...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.12.2010, 20:12
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: ReadPixelFast...
For y=0 To GraphicsHeight()-1
For x=0 To GraphicsWidth() -1
Что любопытно - на некоторых моделях карточек драйвер (я так понимаю) сам фиксит выход за пределы, на некоторых же происходит ошибка
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
12.12.2010, 04:12
|
#4
|
|
Ответ: ReadPixelFast...
Сообщение от impersonalis
For y=0 To GraphicsHeight()-1
For x=0 To GraphicsWidth() -1
Что любопытно - на некоторых моделях карточек драйвер (я так понимаю) сам фиксит выход за пределы, на некоторых же происходит ошибка
|
Нет, драйвер здесь не причем, чтение происходит из массива в оперативной памяти (смотри структуру http://www.tesko-sport.ru/temp/buffer.gif)
А теперь смотри дизасм ReadPixelFast:
ReadPixelFast(x, y, buffer)
{
00D90069: 81EC0C000000 sub esp, 0000000Ch
00D9006F: 8B5DF8 mov ebx, [ebp-08h]
00D90072: 895C2404 mov [esp+04h], ebx <- y
00D90076: 8B75F4 mov esi, [ebp-0Ch]
00D90079: 89742408 mov [esp+08h], esi <- buffer
00D9007D: 8B45FC mov eax, [ebp-04h]
00D90080: 890424 mov [esp], eax <- x
00D90083: E8E85FBDFF call 00966070h
}
call 00966070h
{
00966070: 8B44240C mov eax, [esp+0Ch] <- адрес буфера
00966074: 85C0 test eax, eax <- не указан?
00966076: 7505 jnz 96607Dh
00966078: A1700FA700 mov eax, [A70F70h] <- используем текущий буфер
0096607D: 8B4868 mov ecx, [eax+68h] <- байтов на пиксель (depth)
00966080: 8B5038 mov edx, [eax+38h] <- байтов на строку пикселей (pitch)
00966083: 0FAF4C2404 imul ecx, [esp+04h] <- x * depth
00966088: 0FAF542408 imul edx, [esp+08h] <- y * pitch
0096608D: 03CA add ecx, edx <- x * depth + y * pitch
0096608F: 034848 add ecx, [eax+48h] <- адрес массива + x * depth + y * pitch
00966092: FF908C000000 call [eax+0000008Ch] <- читаем значение по полученому адресу
00966098: C20C00 retn 000Ch
}
call [eax+0000008Ch]
{
00EA0040: 53 push ebx
00EA0041: 8B01 mov eax, [ecx]
00EA0043: 5B pop ebx
00EA0044: 0D000000FF Or eax, FF000000h
00EA0049: C3 ret
}
Обрати внимание на смещения, те же что и в структуре на картинке, так что там простое чтение с массива
|
|
|
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
|
|
12.12.2010, 04:15
|
#5
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: ReadPixelFast...
Не смею сомневаться в вашей компетенции, однако остаётся непонятным:
один и тот же (некорректный) код стабильно работает на GeForce 5700 и приводит к закрытию приложения на жирафе 9600.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
12.12.2010, 04:31
|
#6
|
|
Ответ: ReadPixelFast...
Сообщение от impersonalis
Не смею сомневаться в вашей компетенции, однако остаётся непонятным:
один и тот же (некорректный) код стабильно работает на GeForce 5700 и приводит к закрытию приложения на жирафе 9600.
|
Может просто совпадение, в одном случае чтение за пределами массива происходило из другого "валидного" участка памяти, в другом случае нет, отчего была ошибка.
|
|
|
Сообщение было полезно следующим пользователям:
|
|
12.12.2010, 09:57
|
#7
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: ReadPixelFast...
В хелпе блитза про WritePixelFast написано, что если значение записано за пределы буфера, то оно заносится в неизвестный участок памяти и это может привести к зависанию компа..
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:31.
|