Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 11.12.2010, 19:28   #1
Crayzi
ПроЭктировщик
 
Регистрация: 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 кб.)
Вложения
Тип файла: rar Test.rar (12.1 Кб, 459 просмотров)
(Offline)
 
Ответить с цитированием
Старый 11.12.2010, 19:51   #2
L.D.M.T.
Бывалый
 
Аватар для L.D.M.T.
 
Регистрация: 10.06.2006
Сообщений: 808
Написано 354 полезных сообщений
(для 832 пользователей)
Ответ: ReadPixelFast...

Используй вместо WritePixelFast/ReadPixelFast просто WritePixel/ReadPixel и будет тебе счастье! либо сделай так, чтобы при "быстрой" отрисовке координаты не выходили за экран/буффер. Я уже об этом как-то писал...
__________________
Per Aspera Ad Astra...
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Crayzi (11.12.2010)
Старый 11.12.2010, 20:12   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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 за это полезное сообщение:
Arles (11.12.2010), Crayzi (11.12.2010), LLI.T.A.L.K.E.R. (11.12.2010), tormoz (12.12.2010)
Старый 12.12.2010, 04:12   #4
Venom2
 
Сообщений: n/a
Ответ: 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 пользователя(ей) сказали Спасибо за это полезное сообщение:
Crayzi (12.12.2010), impersonalis (12.12.2010)
Старый 12.12.2010, 04:15   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: ReadPixelFast...

Не смею сомневаться в вашей компетенции, однако остаётся непонятным:
один и тот же (некорректный) код стабильно работает на GeForce 5700 и приводит к закрытию приложения на жирафе 9600.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 12.12.2010, 04:31   #6
Venom2
 
Сообщений: n/a
Ответ: ReadPixelFast...

Сообщение от impersonalis Посмотреть сообщение
Не смею сомневаться в вашей компетенции, однако остаётся непонятным:
один и тот же (некорректный) код стабильно работает на GeForce 5700 и приводит к закрытию приложения на жирафе 9600.
Может просто совпадение, в одном случае чтение за пределами массива происходило из другого "валидного" участка памяти, в другом случае нет, отчего была ошибка.
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Crayzi (12.12.2010)
Старый 12.12.2010, 09:57   #7
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: ReadPixelFast...

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com