April, 2013 | Engin Polat'ın Windows, Web, Mobile ve Game içerikli programcılık sitesi

Arşiv

2013 April ayı için arşiv

Sakarya Üniversitesi Etkinliği Nisan 2013

30 April 2013 Yorum yapılmamış

29 Nisan 2013 tarihinde, Bilgisayar Topluluğunun düzenlediği etkinlikte Daron Yöndem, İlkay İlknur, Sema Kudu ve sevgili MVP Liderimiz Eylem Arslan ile birlikte Sakarya Üniversitesindeydik.

Windows Phone 8 konulu oturumuma katılan herkese teşekkür ederim

Windows Phone uygulamalarında EnableFrameRateCounter özelliği

26 April 2013 Yorum yapılmamış

Windows Phone uygulamaları geliştirirken elimizin altında basit ama önemli performans ipuçlarının olması işimize yarar.

EnableFrameRateCounter özelliğini açmak

  • Render Thread FPS
  • User Interface Thread FPS
  • Texture Memory Usage
  • Surface Counter
  • Intermediate Texture Counter
  • Screen Fill Rate

değerlerinin ekranda gözükmesini sağlar;

Bu değerler şu anlamlara gelir;

Render Thread FPS
Ekran’ın güncellenme sıklığı. 60 fps civarı güncelleme hızı son kullanıcıya iyi bir deneyim sunacaktır, 30 fps ve üzeri ise kabul edilebilir bir deneyim sunacaktır. Ekran güncelleme hızı 30 fps altınaa düştüğünde bu değer kırmızı olacaktır, dikkat etmek lazım!

User Interface Thread FPS
O esnada çalışan UI thread’in güncellenme sıklığı. Data Binding, animasyonlar ve property change notifications bu thread’de işletilirler. Eğer 15 fps altına düşerse bu değer kırmızı olacaktır, dikkat etmek lazım!

Texture Memory Usage
Çalışan uygulamada kullanılan Texture’ların kullandığı grafik hafıza miktarı

Surface Counter
Graphical Processing Unit (GPU) tarafından işlenecek yüzey miktarı

Intermediate Surface Counter
Önbelleklenmiş bellekler dahil işlenecek yüzey miktarı

Screen Fill Rate
Ekranda güncellenecek piksel miktarı. 1 değeri ekran çözünürlüğü kadar anlamına geliyor, örneğin 480×800. Eğer 1’in altına düşerse veya 2’nin üzerine çıkarsa kırmızı olur, dikkat etmek lazım!

App.xaml.cs dosyasında yeralan

Application.Current.Host.Settings.EnableFrameRateCounter = true;

satırı ile performans ipuçlarını ekranda göstermeye başlayabiliriz.

Uygulamanın son halini MarketPlace‘e göndermeden önce performans ipuçlarının ekranda gözükmediğinden emin olmamız gerekiyor.

Yukarıda ekranın bir parçasının gözüktüğü örnek uygulama için MainPage.xaml dosyasını aşağıdaki şekilde güncellemek gerekiyor;

<phone:PhoneApplicationPage
	x:Class="EnableFrameRateCounterTest.MainPage"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
	xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	mc:Ignorable="d"
	FontFamily="{StaticResource PhoneFontFamilyNormal}"
	FontSize="{StaticResource PhoneFontSizeNormal}"
	Foreground="{StaticResource PhoneForegroundBrush}"
	SupportedOrientations="Portrait" Orientation="Portrait"
	shell:SystemTray.IsVisible="True">

	<phone:LongListSelector Name="lstMessages" />

</phone:PhoneApplicationPage>

MainPage.xaml.cs dosyasında aşağıdaki değişiklikler yapılmalı;

public MainPage()
{
	InitializeComponent();

	var messageList = new List<string>();

	for (int iLoop = 0; iLoop < 150; iLoop++)
	{
		messageList.Add("Long message line #" + iLoop);
	}

	lstMessages.ItemsSource = messageList;
}

Bahçeşehir Üniversitesi Mobilist Etkinliği Nisan 2013

22 April 2013 Yorum yapılmamış

21 Nisan 2013 tarihinde Bahçeşehir Üniversitesinde, üniversitenin Bilgisayar Mühendisleri Kulübü tarafından düzenlenen Mobilist etkinliği gerçekleştirildi.

Ben de Windows Phone 8 ve XNA ile Oyun Programlama konulu bir oturum gerçekleştirdim.

Beni etkinliğe davet eden Bilgisayar Mühendisleri Kulübü‘ne ve Pazar sabahı’nın ilk saatlerindeki oturumuma katılan tüm dinleyicilere teşekkür ederim

Generic Priority Queue Yazalım

06 April 2013 Yorum yapılmamış

Queue yapıları, ilk gelen ilk çıkar (first in-first out, FIFO) mantığı ile çalışan listelerdir. C# dilinde yeralan Queue<T> sınıfı bu mantık ile çalışan bir yapıdadır.

Queue sınıfına Dequeue methodu ile de eklenmiş elemanları sırası ile okuyabiliriz.

Projelerimizde sıklıkla Queue sınıfına ihtiyaç duyarız. Örneğin, üye kaydı oluşturan kullanıcılara mail ile erişim bilgileri iletileceği durumda, her yeni oluşturulan üye kaydını bir queue‘ya ekleriz, arka planda çalışan bir servis, queue‘da eleman oldukça alır, veritabanında gerekli kayıtları oluşturduktan, yetkileri tanımladıktan, vs. sonra email gönderme işlemini yapar.

Bazı durumlarda bu senaryo yetersiz kalabilir. Özellikle queue‘ya eklenen elemanlar arasında önceliklendirme yapamadığımız için, yeni kullanıcıya gönderilecek mail ile şifresini unutan kullanıcıya gönderilecek şifre hatırlatma maili aynı önceliğe sahip oluyor.

Queue sınıfına öncelikler eklemeye karar verdik, peki nasıl yapacağız? Başlangıç olarak PriorityQueue sınıfı oluşturalım;

public class PriorityQueue<TPriority, TItem>
{
}

PriorityQueue sınıfına her öncelik tipi için Queue barındıracak aşağıdaki değişken tanımlamasını ekleyelim;

public class PriorityQueue<TPriority, TItem>
{
	private SortedDictionary<TPriority, Queue<TItem>> _subqueues;
}

PriorityQueue sınıfının constructor‘ında _subqueues değişkenine değer ataması yapalım;

public PriorityQueue()
{
	_subqueues = new SortedDictionary<TPriority, Queue<TItem>>();
}

Sırada bekleyen eleman var mı, varsa kaç eleman var sorularını cevaplayacak iki property ekleyelim;

public bool HasItems
{
	get { return _subqueues.Any(); }
}
public int Count
{
	get { return _subqueues.Sum(q => q.Value.Count); }
}

İlgili öncelik tipine eleman ekleme işini yapacak Enqueue method’unu yazalım;

public void Enqueue(TPriority priority, TItem item)
{
	if (!_subqueues.ContainsKey(priority))
	{
		_subqueues.Add(priority, new Queue<TItem>());
	}
 
	_subqueues[priority].Enqueue(item);
}

Eğer ilgili öncelik tipi öncelikler listesinde yoksa, ilk olarak öncelik tipine ait yeni queue oluşturuluyor, sonra eleman öncelik tipinin listesine ekleniyor.

Öncelik tipinin listesinden eleman okumak için gerekli Dequeue method’unu da yazalım;

public TItem Dequeue()
{
	if (_subqueues.Any())
	{
		KeyValuePair<TPriority, Queue<TItem>> first = _subqueues.First();

		TItem nextItem = first.Value.Dequeue();

		if (!first.Value.Any())
		{
			_subqueues.Remove(first.Key);
		}

		return nextItem;
	}
	else
	{
		throw new InvalidOperationException("Queue'da hiç eleman yok!");
	}
}

Örnek kullanım;

var queue = new PriorityQueue<int, string>();
 
queue.Enqueue(1, "A-1");
queue.Enqueue(2, "A-2");
queue.Enqueue(3, "A-3");
queue.Enqueue(1, "B-1");
queue.Enqueue(2, "B-2");
queue.Enqueue(3, "B-3");
queue.Enqueue(1, "C-1");
queue.Enqueue(2, "C-2");
queue.Enqueue(3, "C-3");

while (queue.HasItems)
{
	Console.WriteLine(queue.Dequeue());
}

// ÇIKTI
// A-1
// B-1
// C-1
// A-2
// B-2
// C-2
// A-3
// B-3
// C-3

Kaynak : http://www.blackwasp.co.uk/PriorityQueue.aspx