Şimdi Ara

C# Nasıl Hız Kazanabilirim ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
16
Cevap
0
Favori
1.195
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba arkadaşlar.

    Ben C#'ta form nesneleri ile çiftlik oyunu yapıyorum bir yerde takıldım:

    şimdi veritabanına tarla bilgilerini kaydeditiriyorum vs şimdi bir mahsul ekildiğinde o mahsulun bilgilerini o veritabınındaki tarla bilgilerine ekletiyorum(gelir, exp, süre) şimdi bu ekilen mahsul'ün süresi saniye saniye azalacak işte sorun burda bu süreyi veritabanından azaltmayı düşünüyorum ve bu tarla gibi 1000 tane tarlada olabilr yani hız bakımından nasıl olur düşünemiyorum:
    yani her mahsul ekili tarlayı gezecek veritabınından o tarlanın süresini 1 sn eksitecek bu biraz hız bakımından sıkıntılı gibi birde şöyle düşündüm her tarla için timermi oluştursam ? Nasıl daha hızlı yapabilrim ?

    Fikirlerinizi Alabilirmiyim ? :)

    < Bu ileti mobil sürüm kullanılarak atıldı >



  • Saniyede bir sürekli veritabanında veri güncellemek verimli olmaz.
    Şöyle birşey yapman gerek çoğu oyun zaten kullanıcıların aktivitileriyle çalışan scriptler üzerine kurulu, bu scriptler kontrolleri yapıyor.
    Veritabanına süreye ek olarak o anki tarih ve saatide ekle (DateTime.Now) .Formada bir tane timer ekle interval değeri 1000 olan, bu tek timerle formdaki tüm tarla sürelerini temsili olarak ifade edebilirsin, yani bu timer sadece kullanıcıya geri sayım yapacak ve süre 0 olunca kontrol adında bir fonksiyonu çağıracak.Buna ek olarak kullanıcın yaptığı işlemlerde mesela yeni tarla ekme ve ya silah alma gibi.... yine kontrol adında fonksiyonu çağıracaksın, peki bu kontrol fonksiyonu ne yapacak, örnek veriyim:

    private void kontrol(int i){

    databesede id si i olan satıra bakacak ve şu işlemleri yapacak:
    1-tarih ve saatin olduğu sütunundaki zamana süre sütunundaki süreyi ekleyecek çıkan sonuca X diyelim
    2-Eğer X o anki zamandan (DateTime.Now) küçükse demekki süre bitmiş demek ve işlemi tamamlayabilir, değilse hiçbirşey yapmaz.

    }




  • Veritabanına erişimi ne kadar azaltırsan o kadar hızlanırsın. Veriyi ana belleğe al ve sadece kritik durumlarda veritabanı ile senkronize et. Mesela oyun kapatılırken, oyuncu save ettiğinde, ya da veri üzerinde çoklu değişiklik yapıldığında.

    Kullandığın veritabanının dokümanlarına bak. Modifiye işlemi "blocking" yapıda ise ayrı thread te yapman gerekecek. Çünkü disk erişimi yavaştır ve bütün uygulamayı bloklar. Söylediğin işlemi veritabanı üzerinde yapmak ile ram üzerinde yapmak arasında binlerce kat hız farkı var.

    Algoritmasına gelince; tek timer kurarsın ve event gelince bütün tarlaları gezerek saniyeleri birer tane arttırırsın. Taş çatlasa 1 ms sürer (%0.1 cpu).
  • quote:

    Orijinalden alıntı: CatchFire

    Saniyede bir sürekli veritabanında veri güncellemek verimli olmaz.
    Şöyle birşey yapman gerek çoğu oyun zaten kullanıcıların aktivitileriyle çalışan scriptler üzerine kurulu, bu scriptler kontrolleri yapıyor.
    Veritabanına süreye ek olarak o anki tarih ve saatide ekle (DateTime.Now) .Formada bir tane timer ekle interval değeri 1000 olan, bu tek timerle formdaki tüm tarla sürelerini temsili olarak ifade edebilirsin, yani bu timer sadece kullanıcıya geri sayım yapacak ve süre 0 olunca kontrol adında bir fonksiyonu çağıracak.Buna ek olarak kullanıcın yaptığı işlemlerde mesela yeni tarla ekme ve ya silah alma gibi.... yine kontrol adında fonksiyonu çağıracaksın, peki bu kontrol fonksiyonu ne yapacak, örnek veriyim:

    private void kontrol(int i){

    databesede id si i olan satıra bakacak ve şu işlemleri yapacak:
    1-tarih ve saatin olduğu sütunundaki zamana süre sütunundaki süreyi ekleyecek çıkan sonuca X diyelim
    2-Eğer X o anki zamandan (DateTime.Now) küçükse demekki süre bitmiş demek ve işlemi tamamlayabilir, değilse hiçbirşey yapmaz.

    }



    teşekkürler hocam bu dediğiniz mantıklı geldi ama kullanıcıya kalan süreyi göstermem lazım yani kullanıcı fare ile ekili tarlanın üstüne geldiğinde tooltip ile göstermem gerek ben biraz daha kafa yorayım bi :)

    < Bu ileti mobil sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: elektro_gadget

    Veritabanına erişimi ne kadar azaltırsan o kadar hızlanırsın. Veriyi ana belleğe al ve sadece kritik durumlarda veritabanı ile senkronize et. Mesela oyun kapatılırken, oyuncu save ettiğinde, ya da veri üzerinde çoklu değişiklik yapıldığında.

    Kullandığın veritabanının dokümanlarına bak. Modifiye işlemi "blocking" yapıda ise ayrı thread te yapman gerekecek. Çünkü disk erişimi yavaştır ve bütün uygulamayı bloklar. Söylediğin işlemi veritabanı üzerinde yapmak ile ram üzerinde yapmak arasında binlerce kat hız farkı var.

    Algoritmasına gelince; tek timer kurarsın ve event gelince bütün tarlaları gezerek saniyeleri birer tane arttırırsın. Taş çatlasa 1 ms sürer (%0.1 cpu).

    teşekkürler hocam şimdi şunumu yapmam gerer veritabanında ekili olanlarının sürelerini bir array'e alıp o array'den azaltacam ve mesela 5 dk bir veritabanına kaydetcem ve çıkış yapılırken kaydetçem ama şuda var bu ekili tarlaların sürelerini kullanıcıya göstermem gerek bunu nasıl yapacağım anlayamadım yani fazla saniye kayıpları olurmu yani kullanıcı A tarlasının üstüne geldi ve kalan süreyi 24 dk. 32 sn. Gösteriyor ama gerçekte 24 dk. 10 sn. ?
    Bu çiftlik oyunlarını nasıl yapıyorlar anlayamadım bi türlü(Farm Ville vs) :D Thread kullansam diyorum oda timer ile aynı hesap zaten timer thread nasıl yapacam bi türlü sağlıklı yöntem bulamadım :)

    < Bu ileti mobil sürüm kullanılarak atıldı >




  • lavara123 kullanıcısına yanıt
    Kalan süreleri List yapısında tutabilirsin, arraylardan daha dinamik yapılardır eleman ekleyip kaldırması daha kolaydır.
    Dediğim gibi tek bir timer ,ile tüm tarlaların süresini 1 er saniye azaltabilirsin, timerin tek görevide bu zaten.Kalan süre 0 olunca elemanı silersin Listeden
    Kullanıcı tarlanın üzerine gelincede bir fonksiyon çağrırsın bu fonksiyonda List teki idsi üstüne geldiği tarla olan elemanı arar -> eleman varsa kalan süreyi gösterir yoksa bitmiş demektir.
    Yukarıdaki mesajda bahsettiğim kontrol yapısıda kullanıcın bu timeri manipule edebilmesini engellemek için, etse bile sadece görünüşte zaman azalacak ama asıl kontolü sen zaten timere göre değil databasedeki süre ve tarihe göre yapıyorsun, tabi kullanıcının kendi makinesinin tarih ve saatini değiştirmesi durumunda bu kontrolde manipule edebilir, bu yüzden kendi sunucunun saat dilimini kullanmalısın.
  • inmemory veri tabanı kullanabilirsiniz oyun için 300kat daha hızlı okuma yapabilirsiniz. c# ile bir program vardı ismini bilmiyorum, c# uygulamasa içindeki gereksiz şeyleri silerek hızı artıtırıyordu. 2-3 kat .
    kesinlikle ve kesinlikle TİMER kullanmayın. Thread ve sleep kullanın. gerçek zamanlı oyun dongusü kullanın :http://www.informit.com/articles/article.aspx?p=2167437&seqNum=2
    javadan bir örneği
    public class ana { 

    /**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    long beginTime = System.currentTimeMillis();
    long endTime = System.currentTimeMillis();
    long difference = endTime - beginTime;
    long oyunfps;
    final int vsync = 30;
    // ### VSYNC ###
    // DÖNGÜNÜN ÇOK HIZLI DÖNÜP
    // İŞLEMCIYI ZORLAMASINI ENGELLER
    int i=0,a=544;
    boolean don=true;

    while(don){ // oyun döngüsü

    beginTime = System.currentTimeMillis();

    if (difference<(vsync+3)){ // fps yavaşlatma = Vsync
    try {
    Thread.sleep(vsync);
    } catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
    }

    }

    // Oyun Döngüsü Buraya
    // işlemler dfasfasf



    // ZAMAN FARKINI HESAPLAMA
    endTime = System.currentTimeMillis();
    difference = endTime - beginTime;
    oyunfps=1000/(difference+1);
    System.out.println(oyunfps+"fps");
    }// Döngü sonu



    }

    }




  • quote:

    Orijinalden alıntı: .fcan

    inmemory veri tabanı kullanabilirsiniz oyun için 300kat daha hızlı okuma yapabilirsiniz. c# ile bir program vardı ismini bilmiyorum, c# uygulamasa içindeki gereksiz şeyleri silerek hızı artıtırıyordu. 2-3 kat .
    kesinlikle ve kesinlikle TİMER kullanmayın. Thread ve sleep kullanın. gerçek zamanlı oyun dongusü kullanın :http://www.informit.com/articles/article.aspx?p=2167437&seqNum=2
    javadan bir örneği
    public class ana { 

    /**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    long beginTime = System.currentTimeMillis();
    long endTime = System.currentTimeMillis();
    long difference = endTime - beginTime;
    long oyunfps;
    final int vsync = 30;
    // ### VSYNC ###
    // DÖNGÜNÜN ÇOK HIZLI DÖNÜP
    // İŞLEMCIYI ZORLAMASINI ENGELLER
    int i=0,a=544;
    boolean don=true;

    while(don){ // oyun döngüsü

    beginTime = System.currentTimeMillis();

    if (difference<(vsync+3)){ // fps yavaşlatma = Vsync
    try {
    Thread.sleep(vsync);
    } catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
    }

    }

    // Oyun Döngüsü Buraya
    // işlemler dfasfasf



    // ZAMAN FARKINI HESAPLAMA
    endTime = System.currentTimeMillis();
    difference = endTime - beginTime;
    oyunfps=1000/(difference+1);
    System.out.println(oyunfps+"fps");
    }// Döngü sonu



    }

    }


    Çok teşekkürler hocam final int noluya yani final java ile hiç uğraşmadım da :D

    şuan zaman kaybı olmasın diye timer ile yapakoyacağım sonra projeyi bitirmeye yakın thread vs iyice öğrenip daha hızlı ve sağlıklı birşey yapacağım şöyle bir şey düşündüm(şimdilik):

    mesela adamın 10 tarlası var timer bunların her 1'ini gezip geri dönme süresi 1 saniye olacak ya şimdi 1000/10 = 100 ms yani timerin süresini 100 ms yaptıracağım mesela 20 tarlası var 1000/20 = 50 ms yapacağım 1000 tarlası var diyelim 1000/1000 = 1ms 1000'den sonra tohum ekmeye izin vermeyecğim :D yani şöule bir şey

    int index = 0;
    timer-tick()
    {
    ekiliTarlaDizisi[index].Sure--;
    index++;
    }

    yukarda ekiliTarla 10 tane diyelim timer'in süresi 100 ms olacak ve 10 tane tarlada işini bitirdikten sonra hepsi 1 sn azalıyormuş gibi olcak şimdilik bu şekilde yapacağım :)

    < Bu ileti mobil sürüm kullanılarak atıldı >




  • Birşeyleri yanlış biliyorsun gibi geldi bana. Bikere yukardaki timer kullanma diyen arkadaşı ciddiye alma, yok öyle bişey.

    İkincisi timer dan dönme diye bişey olmaz çünkü timer arka planda kendisi çalışır. Ne zaman tetiklendiğini, ne zaman sonlandığını bilmezsin ve bilmen gerekmez. O çıkarttığın formülller de geçersiz. :) İster 1 tarla olsun ister 10000 zamanlamaya etkisi olmaz. Timer ın iyi yanı da bu. Thread-sleep ile aynı şeyi yapmak uğraştırıcı.

    Daha önce dediğim gibi tarlaları bir diziye al (tercihen List<>). Sonra 1 saniyelik timer ile işlemlerini yap. Ha birde windowsta 1ms çözünürlüklü timer olmaz zaten. En düşüğü 15.6 falan dı galiba.
  • quote:

    Orijinalden alıntı: elektro_gadget

    Birşeyleri yanlış biliyorsun gibi geldi bana. Bikere yukardaki timer kullanma diyen arkadaşı ciddiye alma, yok öyle bişey.

    İkincisi timer dan dönme diye bişey olmaz çünkü timer arka planda kendisi çalışır. Ne zaman tetiklendiğini, ne zaman sonlandığını bilmezsin ve bilmen gerekmez. O çıkarttığın formülller de geçersiz. :) İster 1 tarla olsun ister 10000 zamanlamaya etkisi olmaz. Timer ın iyi yanı da bu. Thread-sleep ile aynı şeyi yapmak uğraştırıcı.

    Daha önce dediğim gibi tarlaları bir diziye al (tercihen List<>). Sonra 1 saniyelik timer ile işlemlerini yap. Ha birde windowsta 1ms çözünürlüklü timer olmaz zaten. En düşüğü 15.6 falan dı galiba.

    ama şundan çekiniyom ( o formülüde ona oluşturmuştum :D ) mesela adamın 1000 tane ekili tarlası var bu 1000 tarlayı timer( 1000 ms ) olan timer ile kontrol ettirsen 1. Tarlaya gelecek süresini 1 azaltacak taa 1000. Tarlaya kadar birer birer diziyi kontrol etcek ve 1000 tarlaya geldiğinde azaltmak için tekrar başa dönecek yani 1. tarlaya ama o 1. Tarlaya döndüğünde 1000 sn(16 dk) bir zaman açığı olacak buda pek bir durum değil gibi belki o 16 dk'da 1. Tarlada ekili olan ürün yetişmiş olacak ?



    < Bu mesaj bu kişi tarafından değiştirildi lavara123 -- 27 Haziran 2014; 11:50:20 >
    < Bu ileti mobil sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: lavara123


    quote:

    Orijinalden alıntı: .fcan

    inmemory veri tabanı kullanabilirsiniz oyun için 300kat daha hızlı okuma yapabilirsiniz. c# ile bir program vardı ismini bilmiyorum, c# uygulamasa içindeki gereksiz şeyleri silerek hızı artıtırıyordu. 2-3 kat .
    kesinlikle ve kesinlikle TİMER kullanmayın. Thread ve sleep kullanın. gerçek zamanlı oyun dongusü kullanın :http://www.informit.com/articles/article.aspx?p=2167437&seqNum=2
    javadan bir örneği
    public class ana { 

    /**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    long beginTime = System.currentTimeMillis();
    long endTime = System.currentTimeMillis();
    long difference = endTime - beginTime;
    long oyunfps;
    final int vsync = 30;
    // ### VSYNC ###
    // DÖNGÜNÜN ÇOK HIZLI DÖNÜP
    // İŞLEMCIYI ZORLAMASINI ENGELLER
    int i=0,a=544;
    boolean don=true;

    while(don){ // oyun döngüsü

    beginTime = System.currentTimeMillis();

    if (difference<(vsync+3)){ // fps yavaşlatma = Vsync
    try {
    Thread.sleep(vsync);
    } catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
    }

    }

    // Oyun Döngüsü Buraya
    // işlemler dfasfasf



    // ZAMAN FARKINI HESAPLAMA
    endTime = System.currentTimeMillis();
    difference = endTime - beginTime;
    oyunfps=1000/(difference+1);
    System.out.println(oyunfps+"fps");
    }// Döngü sonu



    }

    }


    Çok teşekkürler hocam final int noluya yani final java ile hiç uğraşmadım da :D

    şuan zaman kaybı olmasın diye timer ile yapakoyacağım sonra projeyi bitirmeye yakın thread vs iyice öğrenip daha hızlı ve sağlıklı birşey yapacağım şöyle bir şey düşündüm(şimdilik):

    mesela adamın 10 tarlası var timer bunların her 1'ini gezip geri dönme süresi 1 saniye olacak ya şimdi 1000/10 = 100 ms yani timerin süresini 100 ms yaptıracağım mesela 20 tarlası var 1000/20 = 50 ms yapacağım 1000 tarlası var diyelim 1000/1000 = 1ms 1000'den sonra tohum ekmeye izin vermeyecğim :D yani şöule bir şey

    int index = 0;
    timer-tick()
    {
    ekiliTarlaDizisi[index].Sure--;
    index++;
    }

    yukarda ekiliTarla 10 tane diyelim timer'in süresi 100 ms olacak ve 10 tane tarlada işini bitirdikten sonra hepsi 1 sn azalıyormuş gibi olcak şimdilik bu şekilde yapacağım :)

    final int, sabit tamsayı, yanı değişmeyen değer.
    sizi bir konuda uyarıyım. şimdi timer 100ms de bir bir işi çağırıyor, bu işide yavaş bilgisayarda 1msde yapıyor diyelim. oldu 101 ms. bu 1ms dakikalık oyunlarda bir sorun oluşturmayabilir, ama 1 saattten sonra işler karışabilir. bir gerçek zamanlı oyundaki hesaplamamda 27 nanosn bile 5saat içinde 5-10 sn oynama yapabiliryor. bu online/multi oyunlarda fena bir senkranizasyon hatası oluyor.
    onun için bunları hesaba katmanızı tavsiye ederim, tabi şuan - öğrenme - giriş projelerinde o kadar kasmanıza gerek yok ama aklınızda bulunsun




  • Nasıl yani? Timer ın her periyotunda bütün tarlaları birden güncelleyeceksin, sadece birini değil.

    void TimerEvent()
    {
    for(int i = 0; i < tarla.Count; ++i)

    tarla[ i].guncelle();
    // Süreyi azalt vs...
    }

    Bu biraz c++ gibi oldu ama idare et artık. Burada tarlaların güncelleme işleminin ne kadar sürdüğü önemsiz. Timer kendi thread'inde verileri güncellerken sende bu verileri okur, ekranda gösterirsin.

    Birde ben yerinde olsam veritabanı olarak serileştirme kullanırım. Mesela List'i olduğu gibi binary halde diske yazabilirsin. Özellikle oyunlar için biçilmiş kaftan.
  • Oyun motorlarının genel mantığında şöyle yapılıyor

    jenerik gameobject (grafiik ve transform bilgilerini tutuyor)

    World bütün game objectlerin eklendiği obje ve world update bütün game objectlerinin update fonksiyonlarını çağırır.

    mesela

    world.add(araba)
    world.add(ev)
    world.add(ağaç)
    world.add(taş)

    world update()
    {
    for(bütün game objectler)
    []->update
    }

    world kendi içinde bir sonsuz döngü oluşturabilirsin ve belli bir zaman aralığında update metodu çağırırsın

    anlık işlemlerde thread kullanmanı tavsiye etmem.
    Ancak kaynak kullanımlarını(dosya,veritabanı,network) asenkron yaparsan gecikmelerin frameratini etkilemesini önlemiş olursun.

    Soruna gelirsek bu tarz bir oyunda yapman gereken bir işlem yaparken datetime veya timestamptini veri tabanına yazmak ve ne kadar sürecekse onu belirlemek
    ve oyun döngüsü içinde datetime değerini kontrol etmek ,süre bittiğinde veritabanından kontrol etmek gerekir. Yani diyelim bir bina kurdun 5 dakika sürecek.
    veritabanına yapılma başlangıç süresini yazdın. Sonra oyun döngüsü içinde datetime farkına bakarak süreyi bitirdin. Sonra veritabanındanda kontrol ettin ve bina kurulmuş oldu.
    Veritabanından tekraar kontrol etmenin temel amacı browser oyunlarında clientdaki veriler üzerinde oynama yapılabileceği içindir.




  • quote:

    Orijinalden alıntı: .fcan

    quote:

    Orijinalden alıntı: lavara123


    quote:

    Orijinalden alıntı: .fcan

    inmemory veri tabanı kullanabilirsiniz oyun için 300kat daha hızlı okuma yapabilirsiniz. c# ile bir program vardı ismini bilmiyorum, c# uygulamasa içindeki gereksiz şeyleri silerek hızı artıtırıyordu. 2-3 kat .
    kesinlikle ve kesinlikle TİMER kullanmayın. Thread ve sleep kullanın. gerçek zamanlı oyun dongusü kullanın :http://www.informit.com/articles/article.aspx?p=2167437&seqNum=2
    javadan bir örneği
    public class ana { 

    /**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    long beginTime = System.currentTimeMillis();
    long endTime = System.currentTimeMillis();
    long difference = endTime - beginTime;
    long oyunfps;
    final int vsync = 30;
    // ### VSYNC ###
    // DÖNGÜNÜN ÇOK HIZLI DÖNÜP
    // İŞLEMCIYI ZORLAMASINI ENGELLER
    int i=0,a=544;
    boolean don=true;

    while(don){ // oyun döngüsü

    beginTime = System.currentTimeMillis();

    if (difference<(vsync+3)){ // fps yavaşlatma = Vsync
    try {
    Thread.sleep(vsync);
    } catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
    }

    }

    // Oyun Döngüsü Buraya
    // işlemler dfasfasf



    // ZAMAN FARKINI HESAPLAMA
    endTime = System.currentTimeMillis();
    difference = endTime - beginTime;
    oyunfps=1000/(difference+1);
    System.out.println(oyunfps+"fps");
    }// Döngü sonu



    }

    }


    Çok teşekkürler hocam final int noluya yani final java ile hiç uğraşmadım da :D

    şuan zaman kaybı olmasın diye timer ile yapakoyacağım sonra projeyi bitirmeye yakın thread vs iyice öğrenip daha hızlı ve sağlıklı birşey yapacağım şöyle bir şey düşündüm(şimdilik):

    mesela adamın 10 tarlası var timer bunların her 1'ini gezip geri dönme süresi 1 saniye olacak ya şimdi 1000/10 = 100 ms yani timerin süresini 100 ms yaptıracağım mesela 20 tarlası var 1000/20 = 50 ms yapacağım 1000 tarlası var diyelim 1000/1000 = 1ms 1000'den sonra tohum ekmeye izin vermeyecğim :D yani şöule bir şey

    int index = 0;
    timer-tick()
    {
    ekiliTarlaDizisi[index].Sure--;
    index++;
    }

    yukarda ekiliTarla 10 tane diyelim timer'in süresi 100 ms olacak ve 10 tane tarlada işini bitirdikten sonra hepsi 1 sn azalıyormuş gibi olcak şimdilik bu şekilde yapacağım :)

    final int, sabit tamsayı, yanı değişmeyen değer.
    sizi bir konuda uyarıyım. şimdi timer 100ms de bir bir işi çağırıyor, bu işide yavaş bilgisayarda 1msde yapıyor diyelim. oldu 101 ms. bu 1ms dakikalık oyunlarda bir sorun oluşturmayabilir, ama 1 saattten sonra işler karışabilir. bir gerçek zamanlı oyundaki hesaplamamda 27 nanosn bile 5saat içinde 5-10 sn oynama yapabiliryor. bu online/multi oyunlarda fena bir senkranizasyon hatası oluyor.
    onun için bunları hesaba katmanızı tavsiye ederim, tabi şuan - öğrenme - giriş projelerinde o kadar kasmanıza gerek yok ama aklınızda bulunsun

    Hocam kusura bakmayın mesajınızın üzerinden 18 gün geçmiş daha yeni gördüm bildirim gelmemiş.

    Çok teşekkürler ben artık dediğim formul ile hallettim yani mesela kullanıcı bir tohum ekti o tohum ekildiği an:

    timer1.Interval = (1000 / ekiliList.Count) - ekiliList.Count;

    şeklinde ayarlatıyorum şuan sorun yok gibi düzgün ve kesintisiz çalışıyor(gibi gözüküyor) ama 950 ekili ürün ve üstünde performansı nasıl olur bilemem ama onuda ilerde timer'sız en standart kullanılan elemanlarla yaparım InşAllah teşekkürler :)

    < Bu ileti mini sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: elektro_gadget

    Nasıl yani? Timer ın her periyotunda bütün tarlaları birden güncelleyeceksin, sadece birini değil.

    void TimerEvent()
    {
    for(int i = 0; i < tarla.Count; ++i)

    tarla[ i].guncelle();
    // Süreyi azalt vs...
    }

    Bu biraz c++ gibi oldu ama idare et artık. Burada tarlaların güncelleme işleminin ne kadar sürdüğü önemsiz. Timer kendi thread'inde verileri güncellerken sende bu verileri okur, ekranda gösterirsin.

    Birde ben yerinde olsam veritabanı olarak serileştirme kullanırım. Mesela List'i olduğu gibi binary halde diske yazabilirsin. Özellikle oyunlar için biçilmiş kaftan.

    Hocam kusura bakmayın mesajınızın üzerinden 18 gün geçmiş daha yeni gördüm bildirim gelmemiş.

    Aynen o şekilde timer bütün ekili tarlaları tek bir seferde 1 sn olacak şekilde gezecek bunu dediğim formul ile hallettim mesela kullanıcı bir tohum ekti:

    timer1.Interval = (1000 / ekiliList.Count) - ekiliList.Count;

    şeklinde ayarlatıyorum şuan bir sorun yok ama 950 ve üzerinde sıkıntılar yaşatabilr diye düşünüyorum çok teşekkürler

    < Bu ileti mini sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: muratsal

    Oyun motorlarının genel mantığında şöyle yapılıyor

    jenerik gameobject (grafiik ve transform bilgilerini tutuyor)

    World bütün game objectlerin eklendiği obje ve world update bütün game objectlerinin update fonksiyonlarını çağırır.

    mesela

    world.add(araba)
    world.add(ev)
    world.add(ağaç)
    world.add(taş)

    world update()
    {
    for(bütün game objectler)
    []->update
    }

    world kendi içinde bir sonsuz döngü oluşturabilirsin ve belli bir zaman aralığında update metodu çağırırsın

    anlık işlemlerde thread kullanmanı tavsiye etmem.
    Ancak kaynak kullanımlarını(dosya,veritabanı,network) asenkron yaparsan gecikmelerin frameratini etkilemesini önlemiş olursun.

    Soruna gelirsek bu tarz bir oyunda yapman gereken bir işlem yaparken datetime veya timestamptini veri tabanına yazmak ve ne kadar sürecekse onu belirlemek
    ve oyun döngüsü içinde datetime değerini kontrol etmek ,süre bittiğinde veritabanından kontrol etmek gerekir. Yani diyelim bir bina kurdun 5 dakika sürecek.
    veritabanına yapılma başlangıç süresini yazdın. Sonra oyun döngüsü içinde datetime farkına bakarak süreyi bitirdin. Sonra veritabanındanda kontrol ettin ve bina kurulmuş oldu.
    Veritabanından tekraar kontrol etmenin temel amacı browser oyunlarında clientdaki veriler üzerinde oynama yapılabileceği içindir.




    teşekkürler hocam veritabanına şuanlık çıkışta kaydediyorum.

    Program başladığında veritabındaki gerekli bilgileri koleksiyonlara ve arraylare atıyorum ve program içinde oynamaları onlar üzerinden yaptırıyorum çıkışta tüm verileri veritabanında güncelletiyorum.

    Şu Farm Ville, Hay Day vb. Çiftilk oyunlarındaki o süre mantığını anlasam her şey tıkırında olcakta bir türlü anlayamıyororum(ingilizce bimememin zararları) yani kullanıcı okadar tarla, ağaç, hayvan vs ekliyor ve bunların kalan sürelerini vs anlık kesintisiz kullanıcıya gösterebilyor ve anlık veritabına kaydediyor(herhalde) bir türlü anlayamadım nasıl yapıyorlar :D

    < Bu ileti mini sürüm kullanılarak atıldı >




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.