Forum: SDL RSS
SDL üzerinde denemeler...
Sayfa:  1  2  sonraki 
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: SDL üzerinde denemeler...
Merhaba,

Şurada 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'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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Peki topun her konum değiştirişte ekranı temizlemek mi gerekecek?

Evet.
 
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.

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.

[Resim: 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 :)
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
erdem:
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'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 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...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
erdem:
Salih Dinçer:
Peki topun her konum değiştirişte ekranı temizlemek mi gerekecek?

Evet.

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? :)

Ali
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
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.
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
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.
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
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ıyı görmüştüm. Gerçi biliyor olmalısın...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-08-06, 14:32.
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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/get…

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
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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ı?

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?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #10
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #9
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 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.
Avatar
Salih Dinçer #12
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
SDL'de int veri türünün hakim olması ve bizim Vector sınıfında float'ı tercih etmemiz, acaba şu uzayda dolanan topumuzun takılmasına mı sebep oluyor diye düşündüm. Çünkü ondalıklı sayılar SDL_Rect sınıfına dahil olurken tür dönüşümlerine tabi oluyor. Belki aşağı/yukarı yuvarlamalar buna sebep olabilirdi ve denedim...
    private int uzaklık(int x1, int y1, int x2, int y2) 
    {
        immutable float araToplam = pow(y2 - y1, 2) + pow(x2 - x1, 2);
        return cast(int)sqrt(araToplam);
    }
Tek tür dönüşümünü yukarıdaki işlevde yaptım ve Vector2 artık bir Vector!int idi. Ancak hiç bir fark yok ki, en azından gözlerim benim yanıltmıyotsa...:)

Demek ki int türünü kullanabiliriz ama hala bir tekleme/takılma sorunu vardı. Bir kaç deneme ile sorunun 60 FPS'e sabitlememizden kaynaklandığını keşfettim. Bunu da şu algoritma ile yapıyoruz. Acaba biraz geliştirsek (en azından bir if daha eklesek) sorunu çözebilir miyiz?
            // bekle
            //*
            if (SDL_GetTicks() - sahneBaşlangıç < 16)
                SDL_Delay(16 - (SDL_GetTicks() - sahneBaşlangıç));//*/ 
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1881 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #7
erdem:
Salih Dinçer:
Ayrıca konuyla alakalı (gerçek FPS ile hedeflenen FPS'i tutturmak) şu bağlantıyı görmüştüm. Gerçi biliyor olmalısın...
Evet o bağlantıyı okumuştum.
Dün gece bahsettiğim işlevi (timeLeft'i) denedim de yine aynı...:(
    int timeLeft() {
        uint now = SDL_GetTicks();
        if(sahneBaşlangıç <= now) return 0;
        else return sahneBaşlangıç - now;
    }
 
    void çalıştır() {
        içerikYükle();
        sahneBaşlangıç += SDL_GetTicks() + 16;
        while (çık != true) {
            güncelle();
            çiz();
            SDL_Delay(timeLeft());
            sahneBaşlangıç += 16;
            /*
            if (SDL_GetTicks() - sahneBaşlangıç < 16)
                SDL_Delay(16 - (SDL_GetTicks() - sahneBaşlangıç));//*/
        }
    }
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bekleme süresi en az istediğimiz kadardır ama bazen çok çok daha fazla oluyor. Gerçekte ne kadar beklediğine bakmak ve gerekirse bir veya daha fazla kareyi atlamak doğru olmaz mı?

Ali
erdem (Moderatör) #15
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #12
Salih Dinçer:
Demek ki int türünü kullanabiliriz ama hala bir tekleme/takılma sorunu vardı.

Ben de henüz test edemedim ama sanki öyle hatırlıyorum. Bir de incelediğim diğer kütüphaneler de sanki tamsayı kullanmış gibi hatırlıyorum.

Kişisel tavsiyem bence performansla alakalı iyileştirmelerden önce ilk planda çalışan basit bir örnek kodlamak daha yerinde olur diye düşünüyorum. Çünkü ben de senin gibi ilk planda bu oyun döngüsü vs.. iyileştirmelerle uğraştım. Ama tahminimden çok fazla zaman aldığını görünce sonraya ertelemeye karar verdim.

Örneğin verdiğin örnekteki gibi tuğla kırma gibi bir oyun yapsaydık şunlara ihtiyacımız olacaktı :)

  • Ses kütüphaneleri
  • Çarpışma algılaması
  • Animasyon kütüphanesi

Bunların oldukça vakit alacağını tahmin ediyorum. Ben olsam sanırım tamamen oyun ve oyuncu.d'yi siler sil baştan kodlardım.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Forum: SDL RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-05-27, 12:25:19 (UTC -07:00)