|
13.04.2012, 18:57
|
#1
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Write & ReadPixelFast
Ктонибудь знает как он одним значением хранит Р,Г,Б и альфу?
__________________
|
(Offline)
|
|
13.04.2012, 19:00
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Write & ReadPixelFast
да, есть такие люди
в одном инте 32 бита
на компоненту надо 8 бит (байт)
они запакованы слева направо как A R G B
запаковать можно так:
value = A shl 24 + R shl 16 + G shl 8 + B
распаковать так:
A = value and $FF000000
B = value and $00FF0000
B = value and $0000FF00
B = value and $000000FF
или как там 16-ричные числа пишутся в блице
|
(Offline)
|
|
13.04.2012, 19:00
|
#3
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Write & ReadPixelFast
|
(Offline)
|
|
13.04.2012, 19:13
|
#4
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Write & ReadPixelFast
Короче вот такой код, после 2-х секунд висения выкидывает ошибку Мемори..
Graphics3D 1280,1024,32,1
SetBuffer BackBuffer()
Global gw=GraphicsWidth()
Global gh=GraphicsHeight()
Global imb=CreateImage(gw,gh)
Dim pix(GraphicsWidth(),GraphicsHeight())
camera=CreateCamera()
PositionEntity camera,0,0,-10
sp=LoadSprite("Grass1.png",2)
ScaleSprite sp,12,12
Global key%=True
While Not KeyHit(1)
RenderWorld()
blur(0,0,gw,gh)
Text 300,300,"TEXT"
Flip
Wend
End
Function blur(x,y,dx,dy)
CopyRect x,x,dx,dy,x,y,BackBuffer(),ImageBuffer(imb)
SetBuffer ImageBuffer(imb)
LockBuffer ImageBuffer(imb)
; Используя ReadPixelFast, занесем каждый пиксел в массив
For y=0 To GraphicsHeight()
For x=0 To GraphicsWidth()
pix(x,y)=ReadPixelFast(x,y,ImageBuffer(imb))
Next
Next
UnlockBuffer ImageBuffer(imb)
CopyRect x,x,dx,dy,x,y,ImageBuffer(imb),BackBuffer()
End Function
__________________
|
(Offline)
|
|
13.04.2012, 19:23
|
#5
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Write & ReadPixelFast
SetBuffer ImageBuffer(imb) зачем? попробуй вообще его убрать.
|
(Offline)
|
|
13.04.2012, 19:52
|
#6
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Write & ReadPixelFast
А ещё во всяких плюсах можно тупо память int скопировать в массив из 4х байт.
__________________
|
(Offline)
|
|
13.04.2012, 21:26
|
#7
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Write & ReadPixelFast
Хотел написать чтото типа блура(тупо размазываю два ближийших пикселя), вот так
Но оооочень медленно работает на обработку уходит целая секунда
Function blur(x,y,dx,dy)
LockBuffer BackBuffer()
For y=0 To GraphicsHeight()
For x=0 To GraphicsWidth()
pix(x,y)=ReadPixelFast(x,y)
If (x Mod 2=1) Then WritePixelFast x,y,pix(x-1,y)
Next
Next
UnlockBuffer BackBuffer()
End Function
Даже если я написать правильно и обрабатывать через один столбец, всё равно будет делать обработку пол секунды Что нереально долго, что посоветуете?
__________________
|
(Offline)
|
|
13.04.2012, 22:40
|
#8
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Write & ReadPixelFast
не делать постэффекты на цпу?
|
(Offline)
|
|
13.04.2012, 22:52
|
#9
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Write & ReadPixelFast
Это вопрос или предъява? ))
Да шучу, блин, ну выбора вроде как нету, или на блитце можно пользоваться ресурсами видеокарты для расчетов?
Хотя не понимаю что тут тяжелого для проца, конечно точек многовато, но числа вроде простые, без плавущей точки. Я конечно плохо в этом разбираюсь, но думал для проца это фигня...
__________________
|
(Offline)
|
|
13.04.2012, 23:44
|
#10
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Write & ReadPixelFast
78643200 вычислений в секунду, при 60 фпс. Это много.
|
(Offline)
|
|
14.04.2012, 00:20
|
#11
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Write & ReadPixelFast
во первых блицовое a+b это вовсе не
MOV EAX,[a]
MOV EBX,[b]
ADD EAX,EBX
оно не транслируется в нативный код.
во вторых кроме блица есть еще очень много хороших движков. тот же Хорс, например.
|
(Offline)
|
|
14.04.2012, 06:57
|
#12
|
Нуждающийся
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений (для 83 пользователей)
|
Ответ: Write & ReadPixelFast
burovalex
Эта твоя blur вообще полнейшая жесть, да еще с ошибками.
Если хочешь блур, установи перед камерой спрайт (так чтобы было пиксель-в-пиксель, с небольшим сдвигом), сделай его полупрозрачным, в его текстуру скопируй с экрана изображение с помощью CopyRect.
Сообщение от HolyDel
во первых блицовое a+b это вовсе не
MOV EAX,[a]
MOV EBX,[b]
ADD EAX,EBX
оно не транслируется в нативный код.
|
Транслируется, причем именно так Другое дело что оптимизаций, кроме свертки константных выражений, там нет и все транслируется "влоб", шаблонно.
|
(Offline)
|
|
14.04.2012, 12:25
|
#13
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Write & ReadPixelFast
да? отчегож оно тогда это:
a = MilliSecs()
b = 0
For i = 1 To 1000000000
b = b + i
Next
time = MilliSecs() - a
Print b
Print time
WaitKey
работает в 11 раз медленнее чем это:
#include <Windows.h>
#include <iostream>
int main()
{
int a = GetTickCount();
int b =0;
for(int i=1;i<=1000000000;++i)
{
b = b + i;
}
int time = GetTickCount() - a;
std::cout<<b<<std::endl<<time;
std::cin.get();
}
?
//правка, проверил без оптимизации, скорость сопоставимая (3c блица против 2.6с плюсов). был неправ
|
(Offline)
|
|
14.04.2012, 13:29
|
#14
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Write & ReadPixelFast
Сообщение от SBJoker
А ещё во всяких плюсах можно тупо память int скопировать в массив из 4х байт.
|
или просто указатель привести к типу char*
int bar;
char *foo=(char*)(&bar);
foo[2]=0;//например
или использовать объединения, однако Страуструп рекомендует использовать их только для низкоуровневого кода (тут как раз такой случай)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:01.
|