Render | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar render

Windows Phone uygulaması ile ekran görüntüsü almak

25 May 2014 Yorum yapılmamış

Bazı durumlarda Windows Phone için geliştirdiğimiz uygulamanın o andaki ekran görüntüsünü almamız gerekebilir, örneğin bir hata oluştuğu andaki ekran görüntüsü ilgili alanlara girilmiş verileri görebilmeyi sağlayacağı için çok kullanışlı olacaktır.

Aşağıdaki CaptureScreen() method’u her çağırıldığında ekran görüntüsü alınacak ve ekrangoruntuleri dizinine o anın dosya adı ile kaydedilecek;

private void CaptureScreen()
{
	var tt = new TranslateTransform();
	var rv = Application.Current.RootVisual;
	var wb = new WriteableBitmap(rv, tt);
	wb.Render(rv, tt);

	var stream = new MemoryStream();
	wb.SaveJpeg(stream, wb.PixelWidth, wb.PixelHeight, 0, 100);
	var b = stream.ToArray();
	stream.Close();

	using (var isf = IsolatedStorageFile.GetUserStoreForApplication())
	{
		if (!isf.DirectoryExists("ekrangoruntuleri"))
		{
			isf.CreateDirectory("ekrangoruntuleri");
		}

		using (var st = isf.CreateFile("ekrangoruntuleri\\" + DateTime.Now.Ticks + ".jpg"))
		{
			st.Write(b, 0, b.Length);
		}
	}
}

İlk olarak TranslateTransform sınıfından yeni bir değişken oluşturuyoruz.

Ekran görüntüsü alacağımız nesneyi belirlediğimiz ikinci satırda Application.Current.RootVisual özelliğini kullanarak ekranın tamamının görüntüsünün alınmasını sağlıyoruz.

Öncelikle bir WritableBitmap değişkeni oluşturuyoruz ve RootVisual özelliği sayesinde tüm ekranın bu değişkene Render edilmesini sağlıyoruz.

MemoryStream tipinde yeni bir değişken oluşturarak WriteableBitmap değişkenimizin içeriğini hafızaya taşıyoruz.

IsolatedStorageFile sınıfının GetUserStoreForApplication() methodunu kullanarak uygulamamıza ait olan disk alanına erişiyoruz ve ekrangoruntuleri isminde bir dizin olup/olmadığını DirectoryExists() methodu ile kontrol ediyoruz.

Eğer dizini bulamazsak CreateDirectory() methodunu kullanarak ilgili dizini oluşturuyoruz.

Son olarak CreateFile() methodu ile ekrangoruntuleri dizininde yeni bir dosya oluşturuyoruz ve MemoryStream değişkenindeki görüntüyü kaydediyoruz.

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;
}