Forum: SDL RSS
SDL üzerinde denemeler...
Sayfa:  önceki  1  2 
Avatar
Salih Dinçer #16
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7266
Açıkçası bu soruya net bir cevap verebilecek kadar zeki değilim...:)

Henüz tick kavramını bile anlamaya çalışıyorum! Belki tek anladığım şey sahnedeki nesnelerin güncel durumu ekrana yeniden yansıtıldığında bu bir frame olmakta. Biz bunu kolaylıkla (çünkü sıradan bir döngü ile işimizi hallediyoruz) sayabilmekte, ölçebilmekte ve FPS değeri olarak ekrana yansıtabilmekteyiz.

Belki de sorun tüm sahnenin frame ile ilişkisinden ziyade nesnelerden herhangi birinin sebep olduğu n ms. gecikmesinin, frame içindeki payı (yüzde olarak) önemli. Sanırım bir de konum (x, y) cinsinden bir düzeltme değerine daha ihtiyacımız var. Yani gecikme değeri bir şekilde hesap edilip (oran orantı olabilir) nesnenin konumunu yeniden hesaplatmalı(mı)yız, bilemiyorum... :rolleyes:
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #17
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4513 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben, oyun programcılığını bilmiyorum; siz, bunu herhalde zaten biliyorsunuz ama işletim sistemine 10ms bekle dediğimizde o bizi "en az" o kadar bekletir (üst sınırı yok).

Örnek olarak saniyede 100 kare düşünelim; yani kareler 10ms'de bir gösterilmeli. İşletim sistemi bizi 10ms yerine 30ms bekletmişse bence bu kareden sonraki iki kare için yine 10ms beklememeliyiz. O kareleri ya hiç göstermemeliyiz, ya da onlar için 5ms beklet demeliyiz. Yoksa işletim sisteminin fazladan bekletmeleri nedeniyle herşey yavaş ve tutuk tutuk olur... gibi geliyor bana... :)

Ali
Avatar
Salih Dinçer #18
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
FPS konusunda SDL'ye biraz güvenim sarsılsa da SDL2'nin başarımı daha iyi görünüyor...

Öncelikle SDL_GetTicks() işlevi, önceki sürümdeki gibi 0'dan başlamıyor! O yüzden aşağıdaki gibi main() işlevi başında ilk değeri almak gerekiyor. Ayrıca daha önce bahsettiğim timeLeft() işlevini de kullanırsak, 120 FPS'de hiç bir sorun yaşatmıyor ve oyun (henüz tam bir oyun sayılmaz!) tam istediğim gibi çalışıyor.
import pencere, nesne, olaylar;
import sdl2d.timer; /* DERLEME PARAMETRELERİ:
dmd oyun pencere nesne olaylar sdl2d/events sdl2d/surface -L-lSDL2 -release */
int loopCounter, startTick;
 
int timeLeft(int xTick) {
  int now = SDL_GetTicks();
  if(xTick <= now) return 0;
  else return xTick - now;
}
void main(){
  startTick = SDL_GetTicks();
    :    :    :
Tabi ayrıca döngü öncesinde ikinci bir tick değerini aşağıdaki gibi kaydetmemiz de gerekiyor. Sonrası çok basit, işlevi ana döngü içinde kullanmamız yetiyor. Aslında olay geçikme ve hesap (1 FPS = 1000 ms/tick) olmak üzere iki satırdan oluşuyor. Sondaki satırlar şart değil sadece test amaçlı olarak konsola güncel FPS gönderiyor.
  enum FPS = 120;
  int xTick = SDL_GetTicks();
  do {
    SDL_Delay(timeLeft(xTick));
    xTick += 1000 / FPS;
    loopCounter++;
    int clockFPS = (SDL_GetTicks() - startTick)/loopCounter;
    printf("%d(%.1f FPS) \r",
           SDL_GetTicks(), 1000.0 / cast(float)clockFPS);
    :    :    :
Ancak bu FPS'i 120'ye ayarlamama rağmen 125'de sabitleniyor; en azından benim bilgisayarımda. Belki küçük bir püf noktası olabilir veya değeri doğru yansıtmıyor da olabilirim. Neyse denemeyi şuraya (GitHub~sdl2d) yükledim. Ekran alanı aşağıdaki gibi ve yön tuşları ile karadelik kontrol edilebiliyor. Aslında bunu daha önce yapmıştım ama paylaşmayı unutmuşum.

[Resim: http://img256.imageshack.us/img256/4130/ekrangrntse.png]

Bu şu an için bir oyun değil ama fikir gelirse neden olmasın! Duvarda
sürünen bir karadelik de olabilir bir garip sürüngen de...:)

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #19
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4513 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yine tamsayı bölme işleminin gazabına uğramışsın. :D 1000 / 120'nin sonucu 8.333... değildir. ;)

Ali
Avatar
Salih Dinçer #20
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #18
Merhaba Erdem,

Bir takım geometrik şekilleri, ekrana yansıtmadan hafızada nasıl yapabileceğimizi biliyor musun? Aslında bir şeyi denedim ama içime sinmedi. Yani çalışıyor fakat doğru mu yapıyorum emin değilim:
SDL_Surface* boşDöndür() {
  return SDL_SetVideoMode(GENİŞLİK, YÜKSEKLİK, 0, SDL_DOUBLEBUF);
}
Görünüşe göre, yukarıda boş bir yüzey döndürmek yerine, başlangıçta kurulan ana ekranın yeni özellikler ile donatıp adresini döndürmekten başka bir şey yapmıyor. Çünkü SDL_DOUBLEBUF yerine SDL_FULLSCREEN kullandığımda, o satır işletildiği anda ekran tam ekran oluyor... :blush:

Ancak bu dönen değeri (sanırım sadece ana ekranın kopyası?) SDL_DisplayFormat() ile kullandığımda sanki ana ekrandan bağımsız boş yüzeyim oluyor ve orada her türlü oluşturma (generate) ve kesme (mask) işlemi yapabildiğim fark ettim. Yani ortada bir soru/sorun yok gibi ama cevaptan emin değilim...

İşye yukarıdaki işlevi şu şekilde (basit bir örnekle) kullanabiliyorum:
SDL_Surface * yatayKalınÇizgi() {
  SDL_Surface * img = SDL_DisplayFormat(boşDöndür());
  
  foreach(a; 0..img.pitch) {
    (cast(uint*)img.pixels)
               [img.pitch + a] = 0xFF0000;
  }
  return img;
}
Bir de SDL_MUSTLOCK() kullanmıyorum, kötü yapıyorum dersin?

Teşekkürler...

acehreli:
Yine tamsayı bölme işleminin gazabına uğramışsın. :D 1000 / 120'nin sonucu 8.333... değildir. ;)
Lanet olsun, lanet olsun... :-D
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
erdem (Moderatör) #21
Üye Tem 2009 tarihinden beri · 959 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #19
Çalışmaya devam! :) Gayet güzel..

Sadece kodla ilgili ufak bir yorum yapmak istiyorum. xTick gibi değişken isimlerini biraz okunaksız buluyorum. Bunun nedeni de şimdi bu xT ile başladığı için acaba extreme, chrystal mı gibi bir sürü şey aklıma geliyor. Kodu takip etmem zorlaşıyor. Zaten macar notasyonunu da hiç sevmiyordum  ;-)

C++'da sınıfların üye değişkenlerini önek ya da sonek _ kullanan yazım şeklini beğeniyordum. D'de bunların hiç birine gerek bile duymadan aynı ismi veriyorum geçiyor.
erdem (Moderatör) #22
Üye Tem 2009 tarihinden beri · 959 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #20
Salih Dinçer:
Bir takım geometrik şekilleri, ekrana yansıtmadan hafızada nasıl yapabileceğimizi biliyor musun?

Zaten hatırladığım kadarıyla bu işlemlerin hepsi ekran kartına basılana kadar grafik kartının belleğinde gerçekleşiyor. SDL_Flip() ise bu bilgileri ekrana basıyor.

SDL_DisplayFormat() ise örneğin bir resmi ekrana basmak istediğimizde işe yarıyor. Bu işleme blit bit-block [image] transfer deniliyor. Bu durumda SDL_DisplayFormat() bizim resmimizi SDL'in anlayacağı biçime çeviriyor ve performans artışı sağlanıyor.

SDL_MUSTLOCK() 'ın nerede kullanıldığından emin değilim. Ama buradaki cevaba göre sanırım tek bir pikseli değil de aynı anda birden fazla piksel üzerinde değişiklik yapmak gerektiği durumlarda kullanılıyormuş.

http://stackoverflow.com/questions/6852055/how-can-i-modif…
Avatar
Salih Dinçer #23
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
erdem:
Salih Dinçer:
Bir takım geometrik şekilleri, ekrana yansıtmadan hafızada nasıl yapabileceğimizi biliyor musun?
Zaten hatırladığım kadarıyla bu işlemlerin hepsi ekran kartına basılana kadar grafik kartının belleğinde gerçekleşiyor. SDL_Flip() ise bu bilgileri ekrana basıyor.
Evet, dediğin gibi SDL_Flip() işlevini görene kadar tık yok. Mutlaka GPU üzerinde bir şeyler yapıyor ki döngü çok hızlı işliyor; bunu da HW/SW ayrımında görüyoruz ki (-bknz. SDL_SetVideoMode) herhalde ben çok karmaşık bir uygulama yapmadığım için her ikisinin farkını görebilmiş değilim...:)

Ancak ortada tek bir  (SDL_Surface*)ekran varsa ve içi boş değilse işler karışıyor! Yapmak istediğim, SDL_BlitSurface() işlevini kullanarak oluşturduğum şekli, kenarlardan ufaltıp kesiyorum. Yani çevresindeki boşlukları alma işlemini icra ediyorum. Böylece sanki BMP imiş gibi SDL_FreeSurface() yapana kadar istediğim gibi kullanabiliyorum. Ama bunu, sağ elimle sol kulağım ensemden tutmak gibi yapmış olabilirim!

SDL_DisplayFormat() işlevini de genelde BMP dosyalarını düzeltmekte kullandıklarını gördüm:
  bmp = SDL_LoadBMP("Plane.bmp");
  SDL_Surface* resim = SDL_DisplayFormat(bmp);
  SDL_FreeSurface(bmp);
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #24
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #20
Salih Dinçer:
Bir takım geometrik şekilleri, ekrana yansıtmadan hafızada nasıl yapabileceğimizi biliyor musun? Aslında bir şeyi denedim ama içime sinmedi. Yani çalışıyor fakat doğru mu yapıyorum emin değilim:
SDL_Surface* boşDöndür() {
  return SDL_SetVideoMode(GENİŞLİK, YÜKSEKLİK, 0, SDL_DOUBLEBUF);
}
Bunun hala ne kadar yanlış olduğunu bilmiyorum ama başka sorunlar ile karşılaşınca alternatif aramaya başladım. Meğer SDL_CreateRGBSurface() adında bir işlev varmış. Tabi hemen, vakit kaybetmeden SDL ilintisine ekledim.
(Not: Yakında sdl.d için üçüncü bir güncelleme geliyor, duyurusunu yaptığımda lütfen siz de güncelleyin...)

Sonuçta bu işlev diğerine göre daha doğru görünüyor. Tamam, diğeri de bir yüzey (SDL_Surface*) gönderiyor ama aynı anda kurma yapması hiç içime sinmemişti. İşte bu aşağıdaki gerçekten boş ve şeffaf bir yüzey döndürüyor:
SDL_Surface* boşDöndür() {
  SDL_Surface* bmp = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, GENİŞLİK, YÜKSEKLİK,
                            0, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
  SDL_SetColorKey(bmp, SDL_SRCCOLORKEY, 0); // Şeffaflaştır...
  return bmp;
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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:  önceki  1  2 
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-10-22, 08:18:07 (UTC -07:00)