Jump to page: 1 2 3
Thread overview
SDL üzerinde denemeler...
Aug 06, 2012
Salih Dinçer
Aug 06, 2012
erdem
Aug 06, 2012
Salih Dinçer
Aug 06, 2012
erdem
Aug 06, 2012
Salih Dinçer
Aug 06, 2012
erdem
Aug 06, 2012
Salih Dinçer
Aug 06, 2012
Salih Dinçer
Aug 06, 2012
erdem
Aug 07, 2012
Salih Dinçer
Aug 07, 2012
erdem
Aug 07, 2012
Salih Dinçer
Aug 07, 2012
Salih Dinçer
Aug 22, 2012
Salih Dinçer
Aug 22, 2012
Salih Dinçer
Aug 22, 2012
erdem
Aug 22, 2012
Salih Dinçer
Aug 22, 2012
Salih Dinçer
Aug 22, 2012
erdem
Aug 06, 2012
erdem
August 06, 2012

Merhaba,

Şurada (http://ddili.org/forum/post/7232) bir deneme yapmıştım ve bunu biraz ilerlettim. Örneğin Nesne sınıfını oluşturdum ve Erdem'in hazırladığı Vector sınıfını kullanmaya başladım. Bu Nesne sınıfı üzerinden kolaylıkla ekranın ortasına bir futbol topu koymayı başardım!

Holey, holey, holeyyyy...:)

Sonra Vector sınıfı ile ilişkilendirdiğim nesnemin (futbol topu) konumunu değiştirerek Top.konumu*=2 yaptığımda ve sahneyi güncellediğimde topun bir kopyasının sağ alt köşede belirdiğini gördüm...

Her şey güzel gidiyor fakat bazı çekincelerim var! Elbette, Erdem'in pong.d (https://github.com/erdemoncel/oyun/blob/master/demos/pong.d)'de yaptığı gibi bu topu, bilardo masasındaki rasgele kenar çarpışmalarıyla veya tuşlarla hareket ettirebiliriz. Bunlar ulaşılabilir gözüktüğü gibi sağ olsun Erdem'in hazır bir örneği var. Asıl soruya/çekinceye gelirsek:

Peki topun her konum değiştirişte ekranı temizlemek mi gerekecek?

Bu soruyu şu yüzden soruyorum. İleride birbirinden bağımsız hareket eden (belki burada paralel programlama yapabilirim) nesneler olduğunda işler karışmayacak mı? Gerçi SDL'de lock özellikleri gördüm ama peki ya zemin bir resim olursa? Yani her seferinde zemindeki resmi ekrana mı yükleyeceğiz? Bu sanırım pratik bir yöntem değil ve belki de openGL olaylarından faydalanmak gerekecek. Yanılıyor muyum?

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

Alıntı (Salih Dinçer):

>

Peki topun her konum değiştirişte ekranı temizlemek mi gerekecek?

Evet.

Alıntı (Salih Dinçer):

>

Bu soruyu şu yüzden soruyorum. İleride birbirinden bağımsız hareket eden (belki burada paralel programlama yapabilirim) nesneler olduğunda işler karışmayacak mı?

Paralel programlama özelliklerini hiç test etmedim. Ama ilginç olabilir.

Alıntı (Salih Dinçer):

>

Gerçi SDL'de lock özellikleri gördüm ama peki ya zemin bir resim olursa? Yani her seferinde zemindeki resmi ekrana mı yükleyeceğiz? Bu sanırım pratik bir yöntem değil ve belki de openGL olaylarından faydalanmak gerekecek. Yanılıyor muyum?

Şimdi bu işlemler ekran kartığının belleğinde gerçekleştiği için çok hızlı oluyor. Hayır resmi sadece bir kere yüklüyoruz. Daha sonra oyun nesnelerinin konumlarını değiştiriyoruz (güncelle) ve ekrana çiziyoruz.

http://ddili.org/image/oyundongusu.jpg

Burada önemli olan çizme zamanlamasını iyi ayarlamak örneğin saniyede 60 kare çizmek istiyoruz. Böylece yavaş bilgisayarlarla hızlı bilgisayarlar arasında oyunumuzda hız farkı olmayacak.

Ali beyle bu oyun döngüsü ve zamanlayıcıyı nasıl geliştirebileceğimizi bu mesajda konuşmuştuk:

http://ddili.org/forum/thread/554

OpenGL için de gl.d isimli bir ilinti var. Ben genelde sadece ihtiyaç çevirdiğim ilintileri çeviriyorum. O da daha basit oluyor :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

Alıntı (erdem):

>

Alıntı (Salih Dinçer):

>

Peki topun her konum değiştirişte ekranı temizlemek mi gerekecek?

Evet.

Tüh, bu yavaş bilgisayarlar için kötü görünüyor. Ne kadar kötü göründüğünü tespit etmek için az önce bir deneme daha yaptım. Ancak ölçüm yapabilmek için hesap yapmam gerekiyordu. Baktım SDL_GetTicks() diye bir işlev halihazırda varmış. Sonuçta, TemelOyun sınıfı içindeki çiz() işlevi testin temeli oldu...

class TemelOyun
{
   :    :    :

   SDL_Surface * ekran, zemin; // Başlangıçta zemin resmi ve FPS için toplamda,
   uint sahneBaşlangıç, clockFPS, frameCounter; //3 değişkene ihtiyacımız var...

   this() // ilklendir
   {
       SDL_Init(SDL_INIT_EVERYTHING);
       ekrangenişlik = 1000, ekranyükseklik = 400; // Boyutları ayarlamayı unutmayın!

   :    :    :

   void çiz()
   {
       frameCounter++;
       clockFPS = SDL_GetTicks()/frameCounter;
       SDL_GetTicks().write("(", 1000.0/cast(float)clockFPS," FPS)\r");

       // Ekranı temizle
       SDL_BlitSurface(zemin, null, ekran, null);/* Atom N450 işlemcide ~ 43.5 FPS
       SDL_FillRect(ekran, &ekran.clip_rect,
                    SDL_MapRGB(ekran.format, 0x64, 0x95, 0xED));//*/
   }

Testi bu arada pong.d (https://github.com/erdemoncel/oyun/blob/master/demos/pong.d)'de yaptım. Resim ise kullandığım netbook ekranına küçük olduğu için 1000x400 oranında küçültmek zorunda kaldım. Bu resme şuradan (http://www.pulsarmedia.eu/data/media/27/EarthFromSpace_2560x1024.jpg) erişebilirsiniz. Ayrıca aşağıdaki satırı da yine aynı sınıfın içerikYükle() işlevine eklemeyi unutmayın:

zemin = IMG_Load("EarthFromSpace_1000x400.jpg");

Sonuçlara gelince...:)

Aslında, boş ile resimli zemin arasında 6 kata kadar bir yavaşlama olduğunu belirtmeliyim. Ancak ilk ölçümlerim 62,5'a 43.5 FPS idi. Sonra, aşağıda naklettiğim ve çalıştır() işlevi içinde olan tick'e göre bir yavaşlatma yapılmış. Bunu iptal ettiğimde resimlide pek bir değişme yoktu ama boş zeminli bir anda 250 FPS'lere fırladı...:)

        //*
           if (SDL_GetTicks() - sahneBaşlangıç < 16)
               SDL_Delay(16 - (SDL_GetTicks() - sahneBaşlangıç));//*/

Burada ara vermeliyim, devamı gelecek...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

https://github.com/erdemoncel/oyun/blob/master/src/test.d

Bu programda bazı denemeler yapmıştım. Ama gerçekten saniyedeki kare sayısını ve oyun döngüsünü doğru bir şekilde oluşturmak oldukça teknik bir konu.

http://bit.ly/N9w2V1
http://bit.ly/mIuxSS
http://bit.ly/QyqdS1

Anladığım kadarıyla saniyede 60 kare sayısı elde edebilmek için örneğin 'güncelle ()' işlevini 3ms bekletmeye çalışıyorlar. Ama diyelim 6ms mi sürdü. 'çiz() 'işlevi de 5ms sürüyor. Bizim bir aralığımız 16.7 ms idi. Hala geriye 5.7 ms kalıyor. Sistem bu sürede de bekliyor.

Böylece 60 kere 'güncelle()' çağrılmış oldu.

Ama bir de şöyle düşünelim.' çiz()' işlevi çok zaman alıyor ve 'güncelle()' / 'çiz()' 16ms'den fazla sürüyor. O zaman da oyun saniyede 60 kere 'güncelle()' işlevinin çağrıldığından emin olmak için bazı çizimleri es geçiyordur diye düşünüyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

Alıntı (acehreli):

>

Peki bu oyun programlarında hep iki resim bulunduruluyor da bir birisi bir diğeri gösterilmiyor mu? Birinci resim çiziliyor ve grafik kartına "şunu göster" deniyor. O sırada ikinci resmin çizilmesine geçiliyor ve hazır olunca (ve zamanı da gelmişse) "şimdi de şunu göster" deniyor. Mu? :)

Evet aynen Ali beyin dediği gibi bir tanesi hazır olarak bekletiliyor diye biliyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

Alıntı (erdem):

>

https://github.com/erdemoncel/oyun/blob/master/src/test.d

Bu programda bazı denemeler yapmıştım. Ama gerçekten saniyedeki kare sayısını ve oyun döngüsünü doğru bir şekilde oluşturmak oldukça teknik bir konu.

http://bit.ly/N9w2V1
http://bit.ly/mIuxSS
http://bit.ly/QyqdS1

Doğrudur, bağlantılara baktım da basit bir konu değil. Ama sadece aralarındaki farkı ölçmeyi denedim ki bu basit bir şey. Kareleri say ve tick'lere oranla. Per Second için de 1000'de birini aldım.

Ayrıca konuyla alakalı (gerçek FPS ile hedeflenen FPS'i tutturmak) şu bağlantı (http://sdl.beuc.net/sdl.wiki/Time_Examples)yı görmüştüm. Gerçi biliyor olmalısın...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

Evet o bağlantıyı okumuştum.

Hatta XNA oyun motoru ile burada anlatılan dersi hem SDL kullanarak, hem de C# ve XNA kullanarak oluşturdum.

http://create.msdn.com/en-US/education/tutorial/2dgame/getting_started

XNA'in oyun motoru oyun nesnelerinin daha akıcı hareket etmesini sağlıyor. Ancak bizim yaptığımızın performansı da fena değildi. Karışık ve teknik bir konu olduğu için daha sonraya ertelemiştim.

Eğer oyun döngüsünü geliştirmek istiyorsan diğer oyun motorlarının, grafik kütüphanelerinin bu işlemi nasıl yaptığını incelemenin çok faydası olabilir. (Özellikle ilk bağlantı XNA'in bu işlemi nasıl yaptığını anlatıyor)

Bu da daha bugün gördüğüm bir grafik kütüphasini. C++ ve Ruby ile kodlanmış. Ama oldukça temiz kodlandığını söyleyebilirim.

https://github.com/jlnr/gosu

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

Teşekkürler Erdem,

Oyun konularıyla bayağ ilgilisin. Gerçi benim hedefimde oyun yapmak olmasa da ömrümde bir tane kodlamak hoş olurdu. Senin bu konuda profesyonel manada yazdığın bir oyun var mı?

Alıntı (erdem):

>

XNA'in oyun motoru oyun nesnelerinin daha akıcı hareket etmesini sağlıyor. Ancak bizim yaptığımızın performansı da fena değildi. Karışık ve teknik bir konu olduğu için daha sonraya ertelemiştim.
Atölyedeki bilgisayarıma geçtim ve i3-540-Fedora 64bit ile normal PC'deki değerleri merak ettim. Sonuç hiç de kötü değilmiş...:)

Gerçi yukarıda bağlantısını verdiğim Earth From Space fotoğrafı 1 MB'dan fazla. Çözünürlüğü ise çoğu standardın üstünde ve herhalde HD'nin de üstünde olsa gerek. Belki ekran çözünürlüğü olarak 2560x1024px mümkün ama böyle bir zemin ile pong.d'yi derlersem 32 FPS gibi tüm zamanların en kötü sonucunu alıyorum. Ama bunu saymıyoruz ve geçiyoruz...

Asıl test kabül edilebilir sınırlar olan 1280x512px idi. Mutlaka denemenizi isterim ki ekranda dünyanın uzaydan fotoğrafı çok güzel gözüküyor. Gerçi top ve raket absürt olabilir ama neden olmasın. Bence bu oyunu bitirelim. Neyse, test sonuçları ise gayet iyi 117 FPS. ki bir ara 123.4284 FPS değerini kopyalamışım. Tabi bilgisayarın meşguliyetine göre 100 FPS altına da düşmekte ama kimin umrunda ki...:)

Özetle gerçekten yüksek çözünürlük (hesaplayalım 1280x512 = 655.360 benek) ve 60 FPS'in üstünde değerler benim için tatmin edici. Bir de sahnedeki nesne sayısını arttıralım da bakalım neler oluyor?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

FPS üzerine son bir not...

Erdem'in yavaşlatma bölümünü açınca (etkinleştirince) 60 FPS'ler civarında seyrederken işlemci kullanımı ise %60'lar civarında. Elbette bu iki değerin birbirine benzemesi sadece bir denk gelme hadisesi. Çünkü FPS'i çıkabildiği kadara ayarladığımızda işlemci kullanımı %80'lere çıkıyor.

Önemle eklemeliyim 60 FPS'in üstündeki değerlerde topun gidişatında 2-3 sn.'de bir tekleme meydana geliyor. Hani eskilerden tanıdık olduğumuz bilgisayarın durma (itikleme) hadisesi var ya işte böyle bir şey oluyor. Herhalde %100'e yakın değerlerde işlemciyi kullandığından, geri kalan rutin işletim için yeterli olmuyor.

O yüzden bu yavaşlatma bölümü şart ama arada kapatıp azami FPS'i bilmekte fayda görüyorum...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 06, 2012

Alıntı (Salih Dinçer):

>

Oyun konularıyla bayağ ilgilisin. Gerçi benim hedefimde oyun yapmak olmasa da ömrümde bir tane kodlamak hoş olurdu. Senin bu konuda profesyonel manada yazdığın bir oyun var mı?

Maalesef ben hep amatör ligde top koşturuyorum :) Tee fi tarihinde (http://bit.ly/Idx9Pg) gametutorials isimli bir sitenin dökümanlarını Türkçeye çevirerek oyun programlamaya merak salmıştım.

Yaptığım oyunlar arasında da biten oyun yok sanırım :-) Ama Programming Linux Games diye bir kitap okumuştum. Sonra penguenli bir oyun yapmıştım. Sonra Pacman tarzı bir şeyler yaptım. Bir de en son Programming Game AI By Example diye bir kitap okumuştum. Bu kitap çok harika bir kitap. Eğer bu konulara meraklıysan ve C++ biliyorsan kütüphanende bulunmasını tavsiye ederim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2 3