google'da "windows service timer .net" diye aratırsan örnek kodlar ve nasıl yapılacağı ile ilgili bilgi bulabilirsin.
misal
www.aspfree.comwww.codeguru.comservisin mantığı şu olacak.
Her x saniyede bir çalışmak üzere bir timer setup edecek başlatıldığında.
Bu timer her tick olduğunda servis içinde tanımlamış olduğun kod şunları yapacak.
1. Bitmiş işlerin listesini çeken sp'yi çağıracak. bitiş zamanı>=şu anki zaman.
2. Bu işlerle ilgili yapılması gereken update'leri yapacak yine yazmış olduğun sp'leri çağırarak.
Maden artışı ile ilgili Fredi'nin dedikleri kısmen doğru,
performansı sağlayabilmek için hiç update yapmadan geçen zamanı kullanarak ve oyun ile ilgili diğer parametrelere de bakarak oyuncunun mevcut maden miktarlarını hesaplaman en doğrusu ama bunun yanında oyuncunun yaptığı harcamaları, ek kazançları (savaş ganimeti vesaire) tutabileceğin detay tablolarını da işin içine katıyor olman gerekir. belki de günde bir defa veya belirlediğin X saatlik periyotlarda bunları da bir toplamda tutup artık o detaylara bakmıyor olman gerekebilir. hesap ekstresi gibi düşün, banka ay boyunca kredi kartı harcamalarını detaylı olarak değerlendirirken ay sonunda sana toplam ödemen gereken tutarı çıkarıyor böylece ilerleyen aylarda yine sadece bir aylık veri ile uğraşmış oluyor.
işi daha karmaşıklaştırırsak mesela şu olabilir,
demir madenin var ve demir madenin normalde 1 sn.'de 100 birim demir üretiyor. kademesi yükseldikçe de belli bir kritere göre üretim artıyor (misal ogame'de bu sanırım logaritmikti, kademe'nin başlarda artması çok etkiliyken ilerleyen kademe artışları daha az etkili oluyordu)
misal oyuncu şöyle bir aksiyon dizisi izledi (dışarıdan bir etki olmadığını varsayıyorum)
Zaman : Olay : Hesaplamada kullanacağın formül
T1 : Demir madeni çalışmaya başladı : Stoktaki demir + geçen zaman * birim zamanda 1. kademede üretilebilen demir miktarı
T2 : Demir madeni 2. kademeye yükseltildi. : Stoktaki demir + geçen zaman * birim zamanda 2. kademede üretilebilen demir miktarı (Stoktaki demir'i ve hesaplama zamanını başta update etmen gerekiyor)
T3 : Gemilerinden biri stoğuna demir getirdi : Stoktaki demir + son upgrade'den beri geçen zaman * birim zamanda 2. kademede üretilebilen demir miktarı (Geminin dönüşünde stoktaki demir'i update etmen gerekiyor)
Şimdi üstte bahsettiğimiz servisin filo dönüşlerini, gönderilişlerini, upgrade'leri hallettiğini düşünelim, senin ön yüzde üstte yaptığımız hesaplamaları yapabiliyor olman lazım. Ki yapabilirsin de, 5-6 tablo da olsa kullanıcı bir aksiyon almadıkça veya zamansal bir süreç dolmadıkça database'de bir update yapmıyorsun. Oyunda çok sık yapılan ve hammaddelerin toplamlarını değiştiren aksiyonları da optimize etmek için üstte söylediğim ekstre mantığını kullanabilirsin. Sonuçta okul projesi olduğuna göre bunu bir optimizasyon olarak düşünüp yapmayabilirsin.
Ben üstte her seferinde formülü değiştirdim ama senin bunu tek bir formül olarak yazman daha mantıklı olacaktır. Oyuncunun demir madeni hangi kademede olursa olsun misal GetCurrentIron(Datetime lastUpgrade, double ironInStock) şeklinde bir metodun bunu hesaplayabiliyor olması gerekir.
Ekstre mantığında hareket edersen metodun tanımı şuna benzer olacak GetCurrentIron(Datetime lastUpgrade, double ironInStock, List ironTransactions)
burda ironTransactions içinde - ve + olarak senin database'de toplama yansıtmadığın yani henüz update etmediğin sadece bir detay tabloya insert ettiğin kayıtlar bulunacak.
Okul projesinin ötesinde bunu ileri götürürüm ben falan diyorsan unutma sistemin çok kullanıcıyı handle edebilmesi için database'de mümkün olduğu kadar az update yapman ve mümkün olduğunca yaptırabildiğin kadar kısmını (oyunun güvenliğini de düşünerek) önyüze devretmen gerekir.