-
1. Data: 2009-09-26 06:51:25
Temat: Rysowanie wartości tablicy w okienku.
Od: Jan Górski <j...@g...com>
Jak szybko narysować w okienku Win32 tablicę n x m (u mnie około
600x400) pikseli w 256 odcieniach szarości (licząc czarny). Czy warto
użyć GDI, czy może zakotwiczyć tam DirectX i wspomagać sprzętowo ?
Programuję w c++, używając Visual C++ Express Edition.
Myślałem o wypisywaniu piksel po pikselu SetPixel. Ale dopiero
zaczynam Win32 i okienka. Do tej pory konsola, SDL albo winbgim.
Chciałbym to zrobić mądrze, odświeżać nie będzie się często, jednak
SetPixel jest bardzo wolna.
-
2. Data: 2009-09-26 07:41:58
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>
Jan Górski <j...@g...com> napisał(a):
> Jak szybko narysowa=E6 w okienku Win32 tablic=EA n x m (u mnie oko=B3o
> My=B6la=B3em o wypisywaniu piksel po pikselu SetPixel.
Nie wiem co to znaczy dla Ciebie "szybko".
Szybciej od "SetPixel" będzie, gdy utworzysz pixmape i pobierzesz adres
piseli w tej pixmapie. Później do pixmapy piszesz tak jak do zwykłej
tablicy w pamięci RAM, zamiast używać funkcji typu SetPixel, albo LineTo, itd.
Jak juz w pamięci RAM zrobisz kompletny rysunek, to przerzucasz całą pixmape
na ekran przy pomocy jednego wywołania BitBlt.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
3. Data: 2009-09-26 08:23:00
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: Jan Górski <j...@g...com>
Czy mógłbym poprosić o dokładniejsze naprowadzenie w tym temacie ? Mam
utworzyć bitmapę używając GDI? Czy stworzyć po prostu dynamicznie
układ tablic charów 2D w czystym C/C++ - tam byłoby prościej.
Następnie znając ograniczenia tablic i ich ilość użyć BitBlt ?
Szukałem w google, jednak z marnym rezultatem, na msdn jest taka
funkcja tworząca pixmapę, ale w openGL.
-
4. Data: 2009-09-26 09:30:28
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>
Jan Górski <j...@g...com> napisał(a):
> Czy m=F3g=B3bym poprosi=E6 o dok=B3adniejsze naprowadzenie w tym temacie ? =
> Mam
> utworzy=E6 bitmap=EA u=BFywaj=B1c GDI? Czy stworzy=E6 po prostu dynamicznie
> uk=B3ad tablic char=F3w 2D w czystym C/C++ - tam by=B3oby pro=B6ciej.
> Nast=EApnie znaj=B1c ograniczenia tablic i ich ilo=B6=E6 u=BFy=E6 BitBlt ?
>
> Szuka=B3em w google, jednak z marnym rezultatem, na msdn jest taka
> funkcja tworz=B1ca pixmap=EA, ale w openGL.
Wpisalem w google msdn bitblt. Pierwszy link w googach prowadzi na strone
msdn u samego microsofta. Na stronie jest opisana (niestety pa angielsku,
ale jest opisana) owa funkcja bitblt. Funkcja bitblt jest w tym samym
rozdziale co inne funkcje do bitmap (prawde powiedziawszy do pixmap), spis
wszystkich funkcji do bitmap widac po lewej stronie. Jedna z tych funkcji
to CreateDIBSection. Pobiera ona wskaźnik do wskaźnika typu VOID. Pod
ten wskaźnik kopiuje uchwyt do pamięci pikseli i w tej pamieci mozesz
"recznie" wykonywac operacje bez uzycia SetPixel, LineTo, itd. Nastepnie
to co zwróci CreateDIBSection, czyli uchwyt HBITMAP, wykorzystujesz normalnie
w BitBlt (albo w innych funkcjach do kopiowania bitmap) do przerzucenia
na ekran.
Jeśli chcesz gotowca to chętnie dam, ale dopiero wieczorem albo jutro.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
5. Data: 2009-09-26 11:22:27
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: Mateusz Loskot <s...@s...net>
Jan Górski wrote:
> Jak szybko narysować w okienku Win32 tablicę n x m (u mnie około
> 600x400) pikseli w 256 odcieniach szarości (licząc czarny).
Co ta tablica reprezentuje?
Co tak na prawdę rysujesz?
Tablica n x m może zawierać różne dane, na przykład sample rastra
albo punkty, które tworzą geometrię (łamaną, poligon).
Każdy wariant to różny sposób renderowania, a więc i różne możliwości
optymalizacji.
> Czy warto użyć GDI, czy może zakotwiczyć tam DirectX i wspomagać sprzętowo ?
Za wcześnie na to pytanie, bo nie podałeś konkretów.
Po drugie, zakładając że nie ma innych wymagań (np. wymagania klienta o
zakazie stosowanie DirectX) użyj tego z czym masz najlepsze
doświadczenie. Zmierz. Zoptymalizuj. Zmierz. Z...
> Myślałem o wypisywaniu piksel po pikselu SetPixel.
Cokolwiek byś nie chciał renderować, jest to tak zwany brute-force,
a więc mało optymalne.
Ponownie, brak konkretów, trudno ocenić.
> Ale dopiero zaczynam Win32 i okienka. Do tej pory konsola, SDL albo winbgim.
> Chciałbym to zrobić mądrze, odświeżać nie będzie się często, jednak
> SetPixel jest bardzo wolna.
Najpierw określ, co to za obiekty które reprezentujesz w tablicy n x m.
Pozdrawiam
--
Mateusz Loskot, http://mateusz.loskot.net
Charter Member of OSGeo, http://osgeo.org
-
6. Data: 2009-09-26 18:52:34
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: Jan Górski <j...@g...com>
> Wpisalem w google msdn bitblt. Pierwszy link w googach prowadzi na strone
> msdn u samego microsofta. Na stronie jest opisana (niestety pa angielsku,
> ale jest opisana) owa funkcja bitblt. Funkcja bitblt jest w tym samym
> rozdziale co inne funkcje do bitmap (prawde powiedziawszy do pixmap), spis
> wszystkich funkcji do bitmap widac po lewej stronie. Jedna z tych funkcji
> to CreateDIBSection. Pobiera ona wskaźnik do wskaźnika typu VOID. Pod
> ten wskaźnik kopiuje uchwyt do pamięci pikseli i w tej pamieci mozesz
> "recznie" wykonywac operacje bez uzycia SetPixel, LineTo, itd. Nastepnie
> to co zwróci CreateDIBSection, czyli uchwyt HBITMAP, wykorzystujesz normalnie
> w BitBlt (albo w innych funkcjach do kopiowania bitmap) do przerzucenia
> na ekran.
>
> Jeśli chcesz gotowca to chętnie dam, ale dopiero wieczorem albo jutro.
>
> Pozdrawiam
>
> --
> Wysłano z serwisu Usenet w portalu Gazeta.pl ->http://www.gazeta.pl/usenet/
Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
sobie to i postaram się sam wymodzić.
-
7. Data: 2009-09-26 19:07:43
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>
Jan Górski <j...@g...com> napisał(a):
> Dzi=EAkuj=EA za pomoc, w=B3a=B6nie o tak=B1 odpowied=BC mi chodzi=B3o. Docz=
> ytam
> sobie to i postaram si=EA sam wymodzi=E6.
Poniżej obiecany gotowiec :)
Pozdrawiam
#undef UNICODE
#include <windows.h>
#include <stdio.h>
HINSTANCE hInst;
int w,h,wrow;
HBITMAP mem_bmp;
HDC mem_hdc;
unsigned __int8 *pix;
unsigned __int8 *buf1;
unsigned __int8 *buf2;
unsigned __int8 *ptr_buf1,*ptr_buf2;
unsigned __int8 colot_table[5*5*5];
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
static DWORD czas=0;
static DWORD frame=0;
static TCHAR buf[256];
static int start=0;
static int licz=0;
switch (message)
{
case WM_CREATE:
break;
case WM_TIMER:
InvalidateRect( hWnd , NULL , FALSE );
break;
case WM_KEYDOWN:
if( wParam == VK_ESCAPE )
DestroyWindow( hWnd );
if( wParam == VK_SPACE )
{
if( start )
KillTimer( hWnd , 0 );
else
{
SetTimer( hWnd , 0 , 0 , NULL );
czas = GetTickCount();
}
start = !start;
}
break;
case WM_PAINT:
{
int x,y,x1,y1,t,sum;
unsigned __int8 *swp;
t = GetTickCount();
if( t - czas > 5000 )
{
sprintf( buf , "fps: %5.2lf", frame * 1000.0 / ( t - czas ) );
czas = t;
frame = 0;
}
frame ++ ;
hdc = BeginPaint(hWnd, &ps);
for( y=20 ; y<h-20 ; y++ )
{
for( x=20 ; x<w-20 ; x++ )
{
sum = 0;
for(x1=x-2;x1<=x+2;x1++)
for(y1=y-2;y1<=y+2;y1++)
sum += ptr_buf1[y1*w+x1];
sum -= ptr_buf1[y*w+x];
ptr_buf2[y*w+x] = colot_table[sum];
pix[y*wrow*3+x*3+0] = 0;
pix[y*wrow*3+x*3+1] = 0;
pix[y*wrow*3+x*3+2] = ptr_buf2[y*w+x] ? 255 : 0;
}
}
TextOut( mem_hdc , 20 , 30 , buf , (int)strlen(buf) );
BitBlt( hdc , 0 , 0 , w , h , mem_hdc , 0 , 0 , SRCCOPY );
EndPaint(hWnd, &ps);
swp = ptr_buf1;
ptr_buf1 = ptr_buf2;
ptr_buf2 = swp;
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)
{
int i;
MSG msg;
WNDCLASSEX wcex;
hInst = hInstance;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION );
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT("dywan_wnd_class");
wcex.hIconSm = NULL;
ATOM res = RegisterClassEx(&wcex);
w = GetSystemMetrics(SM_CXSCREEN);
h = GetSystemMetrics(SM_CYSCREEN);
mem_hdc = CreateCompatibleDC( NULL );
BITMAPINFO bmi;
memset(&bmi,0,sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = w;
bmi.bmiHeader.biHeight = -h;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 24;
mem_bmp = CreateDIBSection(mem_hdc,&bmi,DIB_RGB_COLORS,(void**
)&pix,NULL,0);
SelectObject(mem_hdc,mem_bmp);
wrow = w;
while(wrow & 0x3)
wrow++;
SetTextColor( mem_hdc , RGB(100,100,255));
SetBkMode( mem_hdc , TRANSPARENT );
buf1 = new unsigned __int8[w*h];
buf2 = new unsigned __int8[w*h];
ptr_buf1 = buf1;
ptr_buf2 = buf2;
memset( buf1 , 0 , w*h );
memset( buf2 , 0 , w*h );
memset( colot_table , 0 , sizeof(colot_table) );
colot_table[3] = 5;
colot_table[4] = 2;
colot_table[7] = 5;
colot_table[11] = 1;
colot_table[18] = 5;
colot_table[29] = 1;
colot_table[46] = 3;
colot_table[76] = 1;
colot_table[123] = 5;
ptr_buf1[w*(h/2-2)+w/2-2] = 1;
ptr_buf1[w*(h/2-2)+w/2+1] = 1;
ptr_buf1[w*(h/2+1)+w/2-2] = 1;
ptr_buf1[w*(h/2+1)+w/2+1] = 1;
HWND hWnd = CreateWindow(TEXT("dywan_wnd_class"), TEXT("xx") ,
WS_POPUP|WS_VISIBLE , 0 , 0, w , h , NULL, NULL, hInstance, NULL);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
delete[] buf1;
delete[] buf2;
DeleteDC( mem_hdc );
DeleteObject( mem_bmp );
return (int) msg.wParam;
}
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
8. Data: 2009-09-26 19:40:06
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: Mateusz Loskot <s...@s...net>
Jan Górski wrote:
> Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
> sobie to i postaram się sam wymodzić.
Jak lecisz po BitBlt, to polecam codeproject.com i tam doczytać o
"double buffering" z użyciem Windows GDI.
Pozdrawiam
--
Mateusz Loskot, http://mateusz.loskot.net
Charter Member of OSGeo, http://osgeo.org
-
9. Data: 2009-09-30 08:17:28
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: "pkorbut" <p...@i...pl>
> Jan Górski wrote:
> > Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
> > sobie to i postaram się sam wymodzić.
>
> Jak lecisz po BitBlt, to polecam codeproject.com i tam doczytać o
> "double buffering" z użyciem Windows GDI.
Właśnie takie użycie BitBlt jak w podanym przykładzie to jest dokładnie "double
buffering z użyciem Windows GDI"...
Nie mieszaj chłopakowi w głowie...
PK
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
10. Data: 2009-09-30 10:46:01
Temat: Re: Rysowanie wartości tablicy w okienku.
Od: "Mateusz Loskot" <m...@l...net>
"pkorbut" <p...@i...pl> wrote in message
news:1557.000002d6.4ac31418@newsgate.onet.pl...
>> Jan Górski wrote:
>> > Dziękuję za pomoc, właśnie o taką odpowiedź mi chodziło. Doczytam
>> > sobie to i postaram się sam wymodzić.
>>
>> Jak lecisz po BitBlt, to polecam codeproject.com i tam doczytać o
>> "double buffering" z użyciem Windows GDI.
>
> Właśnie takie użycie BitBlt jak w podanym przykładzie to jest dokładnie
> "double
> buffering z użyciem Windows GDI"...
>
> Nie mieszaj chłopakowi w głowie...
Nie mieszam, po prostu nie miałem czasu na analize podanego przykładu
ale podałem nazwy, dzięki którym przykładów znajdzie na pęczki.
Pozdrawiam
--
Mateusz Loskot, http://mateusz.loskot.net
pl.comp.lang.c FAQ: http://pl.cpp.wikia.com/wiki/FAQ
C++ FAQ: http://parashift.com/c++-faq-lite