Skocz do zawartości
PsichiX

Powder Toy Base

Rekomendowane odpowiedzi

Witajcie :) Wczoraj zostałem poproszony o zrobienie przykładu szybkiego wyświetlania i aktualizacji automatu komórkowego w grze typu Powder Toy, tak więc prezentuję Wam taki projekt bazowy systemu renderingu, gotowy do rozbudowania w symulator.

 

Download: http://psichix.gmclan.org/download.php?fil...wderToyBase.zip

 

Jak to działa?:

Zasada jest prosta - kluczowymi elementami są punkty, które reprezentują komórki środowiska (każda komórka może być jednego typu, w przykładzie jest to powietrze, ściana i woda). Jeśli byśmy chcieli rysować co klatkę wszystkie 800x600 komórek (czyli 480000 punktów) to nie było by to wydajne, tak więc z pomocą przychodzą nam powierzchnie rysowania, które robią nam za płótno na które będziemy malować punkty komórek tylko wtedy gdy dana komórka zmieni swój stan/typ, a potem będziemy rysować już tylko gotową powierzchnię rysowania na ekran. Pomysł prosty do realizacji a zarazem efektowny i wydajny.

 

Co zawiera projekt?:

Jak już wspomniałem, jest to tylko system wydajnej aktualizacji punktów, nie zawiera on żadnej symulacji komórek - tym drogie Żuczki musicie zająć się sami :)

 

Byłbym szczęśliwy gdyby komuś przydałby się ten system, bądź nawet ktoś by go udoskonalił jeśli by dało radę, zwłaszcza że ostatnio zrobiło się dość popularne pisanie klonów Powder Toy :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Farkraj, tu nie ma fizyki ani niczego w żaden sposób efektownego, to jest czarny ekran z pojawiającymi się losowo białymi kropkami :)

 

Jeśli byśmy chcieli rysować co klatkę wszystkie 800x600 komórek (czyli 480000 punktów) to nie było by to wydajne
Stary, co Ty pierdzielisz O.o ?

W xna, które raczej nie słynie z wydajności, zmieniając co klatkę każdy piksel tekstury 800*600 mam 460 fps.

A równie dobrze można było to rysować pixel shaderem (tego nie sprawdzałem, ale tak "na wyobraźnię" nie widzę przeciwwskazań).

 

Ed: I jeśli dobrze rozumiem (z opisu, kodu nie czytałem) - dla każdego piksela (ruszającego się) będziesz musiał rysować dwa piksele - jeden aby zaciemnić jego dawną pozycję, i drugi aby narysować go na nowej.

Ja bym to moje rozwiązanie podzielił na party powiedzmy 16*16px (albo i mniejsze), i aktualizował te, w których się coś zmieniło - i w takiej sytuacji dla zalanego cieczą kwadratu Twój sposób narysuje 16*16*2 = 512, a mój 256 punktów.

Mówię rzecz jasna o sposobie, bo pewnie rysowanie punktów w xenonie jest szybsze niż aktualizacja tekstury w xna i wyjdzie na jedno :P

 

No i w sumie to jest dyskusja o niczym, bo i tak nikt nie będzie robił tego typu gry na ekranie 800*600 ;d

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Ed: I jeśli dobrze rozumiem (z opisu, kodu nie czytałem) - dla każdego piksela (ruszającego się) będziesz musiał rysować dwa piksele - jeden aby zaciemnić jego dawną pozycję, i drugi aby narysować go na nowej.

Ja bym to moje rozwiązanie podzielił na party powiedzmy 16*16px (albo i mniejsze), i aktualizował te, w których się coś zmieniło - i w takiej sytuacji dla zalanego cieczą kwadratu Twój sposób narysuje 16*16*2 = 512, a mój 256 punktów.

Mówię rzecz jasna o sposobie, bo pewnie rysowanie punktów w xenonie jest szybsze niż aktualizacja tekstury w xna i wyjdzie na jedno tongue2.gif

no wlasnie sie nie zrozumielismy, ja nadrysowuje pixel nie potrzebujac wczesniej czyszczenia punktu. wlasnie w tym przykladzie aktualizowane sa same punkty, a nie czesci punktow i tylko te ktore podlegaja aktualizacji, co jest jeszcze szybsze. ah i bierz poprawke ze w xenonie nie rysujesz tak jak w GMie primitive_begin/end i osobno wierzcholki tylko pakujesz dane do tablicy i tablice wysylasz do karty czyli jednym drawcallem rysujesz wszystkie punkty do aktualizacji, czyli jeszcze szybciej niz Ci sie wydaje. Testowalem rozne techniki i ta okazala sie najszybsza :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

I chyba znowu nie zrozumiałem : D

 

Powiedz w którym momencie moje myślenie jest błędne.

1. Masz sobie tablicę 800*600, czy tam 480000, nieważne.

2. W grze jest tylko jeden punkt, nieważne gdzie.

3. Z obliczeń fizyki wyszło, że trzeba go przesunąć o nieważne ile pikseli w dół

4. I jeśli teraz tylko nadpiszesz w tablicy wartość dla nowej pozycji pikselka, a starej nie ruszysz to pikselek się nam sklonuje - bo starej wartości nikt nie usunął, a doszła jedna nowa.

 

Trzeba było w tym przykładzie po prostu losowo przesuwać 10000 cząstek zamiast tylko tworzyć nowe i by nie było tej rozmowy :P

 

Spróbuj jakoś tak robić przykłady, aby ich efekt był jakimś demem, pokazywał jakieś możliwości, bo na razie wszystkie przykłady które widziałem pokazują jakieś proste efekty które nietrudno zrobić nawet w gmie (nieistotne, jak działają - efekt jest do pupy :()

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Chyba raczej chodziło, że jest rysowana czarna tablica, a na nią nakładane piksele rysowane w okreslonych pozycjach. To nie wymaga usuwania poprzedniej pozycji, chyba ze i ja zle zrozumialem.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

3 rodzaje to powietrze (pusty pixel), woda (niebieski) i solidny (bialy). Jemu nie dziala bo ma bialy ekran, cos mi siadlo w nowej wersji, tez niedawno to zauwazylem przy nie obslugiwanym fbo, trafilo do naprawy.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×