Nội dung bài viết
La Kiến Vinh Cách thức kiểm tra bộ nhớ (RAM) đã cấp phát cho ứng dụng, games của bạn trên WP8. Bộ nhớ có giới hạn, do đó, việc kiểm soát bộ nhớ đang sử dụng rất quan trọng, việc làm này sẽ giúp chúng ta dự báo trước được tình huống xấu nhất có thể xảy ra cho bộ nhớ và tối ưu.

Giới thiệu

Bộ nhớ có giới hạn, do đó, việc kiểm soát bộ nhớ đang sử dụng rất quan trọng, việc làm này sẽ giúp chúng ta dự báo trước được tình huống xấu nhất có thể xảy ra cho bộ nhớ như (hết bộ nhớ hoặc bộ nhớ dùng nhiều nhất vào thời điểm nào) để có phương án khắc phục và tối ưu.

Khi đang phát triển game Sins, tôi đã cần đến công cụ này để kiểm tra xem bộ nhớ đang sử dụng của game Sins là bao nhiêu, từ đó xem xét có cần thiết phải tối ưu hay không hay tập trung thời gian và sức lực vào các vấn đề khác sẽ hiệu quả hơn.

Tiền đề bài viết

Tôi chia sẻ điều này để giúp bạn có được phương pháp theo dõi bộ nhớ đang sử dụng của ứng dụng trên Windows Phone 8 - XAML.

Đối tượng hướng đến

Các nhà phát triển ứng dụng trên nền tảng Windows Phone 8, cụ thể hơn là các nhà phát triển có liên quan nhiều đến xử lý đồ họa, âm thanh cần nhiều bộ nhớ.

Hướng dẫn

Mặc định, khi bạn tạo 1 project Windows Phone 8 với XAML, bạn sẽ có được 1 VIEW mặc định là MainPage.xaml (nếu như bạn không thay đổi gì về cấu trúc của project). Chúng ta cần hiển thị bộ nhớ đang sử dụng tại thời điểm XAML nào đang được kích hoạt, trong trường hợp này, MainPage.xaml đang kích hoạt nên ta sẽ thao tác với XAML này.

Cài đặt 1 control để thể hiện thông số bộ nhớ

Cần 1 "nơi" để thể hiện giá trị bộ nhớ, giả sử ban đầu MainPage.xaml có dạng sau

<phone:PhoneApplicationPage 
    x:Class="PhoneDirect3DXamlAppInterop.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"
    xmlns:GoogleAds="clr-namespace:GoogleAds;assembly=GoogleAds"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="PortraitUp"
    shell:SystemTray.IsVisible="False">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">

        <DrawingSurface x:Name="DrawingSurface" Loaded="DrawingSurface_Loaded" />
       
    </Grid>

</phone:PhoneApplicationPage>

Ta cần thêm 1 control vào, đây là control cần thiết để thể hiện thông số, tôi chọn TextBlock, bạn có thể chọn bất kỳ loại "control" nào phù hợp để thể hiện thông số, thêm TextBlock vào ta có thông số sau.

<phone:PhoneApplicationPage 
    x:Class="PhoneDirect3DXamlAppInterop.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"
    xmlns:GoogleAds="clr-namespace:GoogleAds;assembly=GoogleAds"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="PortraitUp"
    shell:SystemTray.IsVisible="False">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">

        <DrawingSurface x:Name="DrawingSurface" Loaded="DrawingSurface_Loaded" />
       
        <TextBlock x:Name="STDIO_MemoryTextBlock" Foreground="White"
			VerticalAlignment="Bottom" Height="50" Margin="277,0,10,675"/>
    </Grid>

</phone:PhoneApplicationPage>

LƯU Ý: nếu như TextBlock không hiện, bạn có thể thêm thông số Width vào TextBlock ví dụ:

<TextBlock x:Name="STDIO_MemoryTextBlock" Foreground="White" VerticalAlignment="Bottom" Width="200" Height="50" Margin="277,0,10,675"/>

Codes C# lấy bộ nhớ của ứng dụng và đưa vào TextBlock để hiển thị thông tin

Đi cùng với 1 file XAML thì ta có 1 file XAML.CS, trong trường hợp này ta có file MainPage.xaml.cs, đây có thể gọi là phần code chính (còn XAML có thể xem là dữ liệu được codes này đọc vào, ta sẽ không đi sâu vào vấn đề này).

Thêm vào đầu file MainPage.xaml.cs 2 namespace với codes

using System.Windows.Threading;
using Microsoft.Phone.Info;
  • System.Windows.Threading nhằm tạo ra 1 timer sẽ gọi hàm cập nhật trạng thái bộ nhớ theo thời gian.
  • Microsoft.Phone.Info chứa lớp DeviceStatus là lớp hỗ trợ lấy nhiều thông tin thiết bị, trong đó có bộ nhớ đang sử dụng.

Trong class MainPage thêm vào đoạn codes sau

private DispatcherTimer m_memoryTimer;

private void STDIO_memoryTimerInit()
{
	m_memoryTimer = new DispatcherTimer();
	m_memoryTimer.Interval = new TimeSpan(0, 0, 1);
	m_memoryTimer.Tick += new EventHandler(STDIO_memoryTimer_Tick);
	m_memoryTimer.Start();
}

private void STDIO_memoryTimer_Tick(object sender, EventArgs e)
{
	try
	{
		STDIO_MemoryTextBlock.Text = 
		(DeviceStatus.ApplicationCurrentMemoryUsage/1024).ToString() + "K/" +
		(DeviceStatus.ApplicationPeakMemoryUsage/1024).ToString() + "K";
	}
	catch (Exception ex)
	{
		STDIO_MemoryTextBlock.Text = ex.Message;
	}
}

GIẢI THÍCH

  • 2 thuộc tính này trả về giá trị với đơn vị là Byte, tôi chia cho 1024 nhằm để xem ở mức độ KB, tùy ý các bạn muốn xem ở đơn vị nào có thể chia cho 1024x1024 (MB) hoặc để nguyên.m_memoryTimer là một timer, ta cần nó để tạo ra một đối tượng nhằm gọi 1 hàm cần thiết trong 1 khoảng thời gian, có như vậy ta mới có thể cập nhật được trạng thái bộ nhớ theo thời gian.
  • Hàm STDIO_memoryTimerInit() được viết nhằm để khởi tạo các thuộc tính cần thiết cho timer m_memoryTimer như sau mỗi giây sẽ gọi hàm STDIO_memoryTimer_Tick 1 lần.
  • Hàm STDIO_memoryTimer_Tick(object sender, EventArgs e) là hàm được gọi tự động mỗi 1 giây 1 lần, nhiệm vụ của hàm này là sẽ lấy bộ nhớ hiện tại và thể hiện vào TextBlock. Ta cần để ý 2 thuộc tính có trong class DeviceStatus (namespace Microsoft.Phone.Info) là ApplicationCurrentMemoryUsage và ApplicationPeakMemoryUsageApplicationCurrentMemoryUsage cho ta biết trạng thái bộ nhớ đang sử dụng tại thời điểm ta lấy thông tin, còn ApplicationPeakMemoryUsage cho ta biết được bộ nhớ trong quá trình ứng dụng đang chạy thì đạt trạng thái "trần" (tối đa) là bao nhiêu.

Trong hàm tạo (constructor) của class MainPage là hàm MainPage() ta thêm vào đoạn code sau

STDIO_memoryTimerInit();

Sau khi thêm vào hàm tạo đoạn code trên ta sẽ được hàm tạo hoàn chỉnh có dạng sau

public MainPage()
{
	InitializeComponent();

	STDIO_memoryTimerInit();
}

GIẢI THÍCH

Codes trên đơn thuần để gọi m_memoryTimer khởi tạo và tiến hành vận hành.

Kết quả

ss_1 ss_2

THẢO LUẬN
ĐÓNG