forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   ReadPixelFast... (http://forum.boolean.name/showthread.php?t=13874)

Crayzi 11.12.2010 19:28

ReadPixelFast...
 
Вложений: 1
Не пойму в чем проблемма, стандартный сэмпл насчет команды 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 кб.)

L.D.M.T. 11.12.2010 19:51

Ответ: ReadPixelFast...
 
Используй вместо WritePixelFast/ReadPixelFast просто WritePixel/ReadPixel и будет тебе счастье! либо сделай так, чтобы при "быстрой" отрисовке координаты не выходили за экран/буффер. Я уже об этом как-то писал...

impersonalis 11.12.2010 20:12

Ответ: ReadPixelFast...
 
For y=0 To GraphicsHeight()-1
For x=0 To GraphicsWidth() -1
Что любопытно - на некоторых моделях карточек драйвер (я так понимаю) сам фиксит выход за пределы, на некоторых же происходит ошибка

Venom2 12.12.2010 04:12

Ответ: ReadPixelFast...
 
Цитата:

Сообщение от impersonalis (Сообщение 171631)
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
}

Обрати внимание на смещения, те же что и в структуре на картинке, так что там простое чтение с массива

impersonalis 12.12.2010 04:15

Ответ: ReadPixelFast...
 
Не смею сомневаться в вашей компетенции, однако остаётся непонятным:
один и тот же (некорректный) код стабильно работает на GeForce 5700 и приводит к закрытию приложения на жирафе 9600.

Venom2 12.12.2010 04:31

Ответ: ReadPixelFast...
 
Цитата:

Сообщение от impersonalis (Сообщение 171678)
Не смею сомневаться в вашей компетенции, однако остаётся непонятным:
один и тот же (некорректный) код стабильно работает на GeForce 5700 и приводит к закрытию приложения на жирафе 9600.

Может просто совпадение, в одном случае чтение за пределами массива происходило из другого "валидного" участка памяти, в другом случае нет, отчего была ошибка.

Nex 12.12.2010 09:57

Ответ: ReadPixelFast...
 
В хелпе блитза про WritePixelFast написано, что если значение записано за пределы буфера, то оно заносится в неизвестный участок памяти и это может привести к зависанию компа..


Часовой пояс GMT +4, время: 12:07.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot