forum.boolean.name

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

burovalex 13.04.2012 18:57

Write & ReadPixelFast
 
Ктонибудь знает как он одним значением хранит Р,Г,Б и альфу? :4to:

HolyDel 13.04.2012 19:00

Ответ: 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-ричные числа пишутся в блице

NitE 13.04.2012 19:00

Ответ: Write & ReadPixelFast
 
При помощи совершенно умопомрачительной фичи - называется битовый сдвиг.

http://forum.boolean.name/showthread.php?t=13646

burovalex 13.04.2012 19:13

Ответ: 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


HolyDel 13.04.2012 19:23

Ответ: Write & ReadPixelFast
 
SetBuffer ImageBuffer(imb) зачем? попробуй вообще его убрать.

SBJoker 13.04.2012 19:52

Ответ: Write & ReadPixelFast
 
А ещё во всяких плюсах можно тупо память int скопировать в массив из 4х байт.

burovalex 13.04.2012 21:26

Ответ: Write & ReadPixelFast
 
Хотел написать чтото типа блура(тупо размазываю два ближийших пикселя), вот так
Но оооочень медленно работает на обработку уходит целая секунда :4to:

Код:

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

Даже если я написать правильно и обрабатывать через один столбец, всё равно будет делать обработку пол секунды Что нереально долго, что посоветуете?

HolyDel 13.04.2012 22:40

Ответ: Write & ReadPixelFast
 
не делать постэффекты на цпу?

burovalex 13.04.2012 22:52

Ответ: Write & ReadPixelFast
 
Это вопрос или предъява? ))
Да шучу, блин, ну выбора вроде как нету, или на блитце можно пользоваться ресурсами видеокарты для расчетов? :4to:

Хотя не понимаю что тут тяжелого для проца, конечно точек многовато, но числа вроде простые, без плавущей точки. Я конечно плохо в этом разбираюсь, но думал для проца это фигня...

NitE 13.04.2012 23:44

Ответ: Write & ReadPixelFast
 
78643200 вычислений в секунду, при 60 фпс. Это много.

HolyDel 14.04.2012 00:20

Ответ: Write & ReadPixelFast
 
во первых блицовое a+b это вовсе не
Код:

MOV EAX,[a]
MOV EBX,[b]
ADD EAX,EBX

оно не транслируется в нативный код.

во вторых кроме блица есть еще очень много хороших движков. тот же Хорс, например.

Платон Александрович 14.04.2012 06:57

Ответ: Write & ReadPixelFast
 
burovalex
Эта твоя blur вообще полнейшая жесть, да еще с ошибками.

Если хочешь блур, установи перед камерой спрайт (так чтобы было пиксель-в-пиксель, с небольшим сдвигом), сделай его полупрозрачным, в его текстуру скопируй с экрана изображение с помощью CopyRect.

Цитата:

Сообщение от HolyDel (Сообщение 225425)
во первых блицовое a+b это вовсе не
Код:

MOV EAX,[a]
MOV EBX,[b]
ADD EAX,EBX

оно не транслируется в нативный код.

Транслируется, причем именно так :) Другое дело что оптимизаций, кроме свертки константных выражений, там нет и все транслируется "влоб", шаблонно.

HolyDel 14.04.2012 12:25

Ответ: 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с плюсов). был неправ :)

impersonalis 14.04.2012 13:29

Ответ: Write & ReadPixelFast
 
Цитата:

Сообщение от SBJoker (Сообщение 225379)
А ещё во всяких плюсах можно тупо память int скопировать в массив из 4х байт.

или просто указатель привести к типу char*
int bar;
char *foo=(char*)(&bar);
foo[2]=0;//например

или использовать объединения, однако Страуструп рекомендует использовать их только для низкоуровневого кода (тут как раз такой случай)


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

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