Разработка компьютерных игр для Windows Phone 7 с использованием технологий Silverlight и XNA

Пробные версии, реклама в приложении, анализ производительности

Показывать лекцию целиком

Цель работы: Научиться создавать пробные версии приложений, добавлять в приложения рекламные блоки, анализировать производительность приложений

36.1. О способах заработка на приложениях

Windows Phone Markerplace – это единая среда для распространения мобильных приложений среди пользователей. Разработчик может размещать как платные приложения, так и бесплатные. В случае с платными приложениями способ заработка на них очевиден.

В случае же с бесплатными, заработок может выражаться в различных формах. В частности, одним из популярных способов заработка на WM-приложениях (и играх, естественно), является размещение в таких приложениях рекламных блоков с помощью соответствующих программных механизмов и сервиса Microsoft Advertising.

Обычная практика для приложений, размещаемых в Marketplace – это наличие пробных версий. Пользователи сначала оценивают возможности приложения, а потом уже принимают решение о покупке или об отказе от приложения.

Пробные версии программы могут иметь различные ограничения. То, как именно будет ограничена пробная версия программы, всецело зависит от разработчика. Если говорить об играх, то здесь обычная практика – ограничение пробных версий несколькими игровыми уровнями, ограничение по времени игры, ограничения по дополнительным возможностям (таким, как возможность сохранения), ограничения по каким-либо игровым достижениям.

Рассмотрим механизм создания пробной версии программы.

36.2. Пробная версия Silverlight-приложения

Пространство имен Windows.Phone.Marketplace даёт доступ к классу LicenseInformation, который позволяет приложению определить, является ли его лицензия временной. Ссылка на сборку Microsoft.Phone, которая нужна для использования этого механизма, по умолчанию присутствует в проекте.

У класса LicenseInformation есть метод IsTrial, который возвращает True, если мы имеем дело с пробной версией программы, и False в противном случае. В реальном приложении, загруженном из Marketplace, он будет возвращать True, когда загружена пробная версия приложения, и False – когда пользователь приобрел полную версию программы.

Пробная и полная версии программы, в сущности, различаются лишь поведением программы, определяемым значением, которое возвращает метод IsTrial. Если он возвращает True – применяются ограничения, которые выбрал разработчик для своей программы. Если False – ограничения не применяются. Не рекомендуется вызывать IsTrial() в программе слишком часто (скажем, в игровом цикле). Достаточно вызывать функцию один раз, и, например, сохранить возвращённое значение в переменной, на состояние которой можно ориентироваться в программе.

Когда, следуя логике применения ограничений пробной версии, эти ограничения сработают можно напомнить пользователю о том, что он работает с пробной версией и предложить приобрести полную версию программы или выполнить какие-либо другие действия.

Рассмотрим использование данной функциональности на примере. Создадим новый Silverlight-проект проект P29_1. Добавим на MainPage.xaml кнопку и пару элементов TextBox. Один из них будем использовать в качестве счётчика количества нажатий кнопки. Когда кнопка будет нажата более 3-х раз, будем считать, что пробный режим закончился (в том случае, если программа сейчас в пробном режиме) и предлагать пользователю купить программу. На рис. 36.1 вы можете видеть экран программы.

(рис 36.1) Экран программы

В листинге 36.1 приведен XAML-код страницы.

<phone:PhoneApplicationPage 
    x:Class="P29_1.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" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel содержит имя приложения и заголовок страницы-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="МОЕ ПРИЛОЖЕНИЕ" 
            Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="trial mode" Margin="9,-7,0,0" 
            Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel — поместите здесь дополнительное содержимое-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Button Content="Нажми меня!" Height="71" HorizontalAlignment="Left" Margin="92,451,0,0" 
            Name="button1" VerticalAlignment="Top" Width="261" Click="button1_Click" />
            <TextBlock Height="46" HorizontalAlignment="Left" Margin="106,399,0,0" Name="textBlock1"
             Text=" 0" VerticalAlignment="Top" Width="60" />
            <TextBlock Height="46" HorizontalAlignment="Left" Margin="106,359,0,0" Name="textBlock2" 
            Text="Количество нажатий:" VerticalAlignment="Top" Width="195" />
        </Grid>
    </Grid>
 
</phone:PhoneApplicationPage>

В листинге 29.2 приведен программный код страницы.

using System;
using System.Windows;
using Microsoft.Phone.Controls;
//Для IsTrial
using Microsoft.Phone.Marketplace;
//Для показа страницы в Marketplace
using Microsoft.Phone.Tasks;
namespace P29_1
{
    public partial class MainPage : PhoneApplicationPage
    {
        //Для хранения результатов запроса о пробном режиме
        bool isInTrialMode;
        LicenseInformation licInf = new LicenseInformation();
        //Для того, чтобы открыть Marketplace со страницей информации о программе
        MarketplaceDetailTask mpDetail = new MarketplaceDetailTask();

        // Конструктор
        public MainPage()
        {
            InitializeComponent();
            //Узнаем, запущено ли приложение с пробной лицензией
            //В эмуляторе это будет всегда False
            isInTrialMode = licInf.IsTrial();
            //Для отладочных целей можем переключить isInTrialMode в значение true
            if (MessageBox.Show("Переключить в отладочных целях на пробный режим?", "Отладка",
             MessageBoxButton.OKCancel) == MessageBoxResult.OK)
            {
                isInTrialMode = true;
            }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {

            //Если в пробном режиме
            if (isInTrialMode)
            {
                //Если достигли условия прекращения пробного режима
                if (Convert.ToInt32(textBlock1.Text) == 3)
                {
                    //Сообщаем, что пробный период окончен
                    MessageBox.Show("Вы достигли 3-го уровня, для того, чтобы продолжить играть, 
                    вам нужно приобрести полную версию программы");
                    //Показываем страницу Marketplace. При отладке здесь должно появиться сообщение об ошибке  
                       Market Place Error 805a0194
                    mpDetail.Show();
                }
                //Если не достигли
                else
                {
                    CounterChange();
                }

            }
            //Если в обычном режиме
            else
            {
                CounterChange();
            }
        }
        //Реализация игрового процесса
        void CounterChange()
        {
            //Увеличим на 1 счётчик
            textBlock1.Text = Convert.ToString(Convert.ToInt32(textBlock1.Text) + 1);
        }
    }
}

Здесь мы, во-первых, подключаем пространства имён Microsoft.Phone.Marketplace

И Microsoft.Phone.Tasks для доступа к функции IsTrial() и для открытия страницы Marketplace, соответствующей приложению. Мы объявляем переменные для хранения полученного состояния лицензии на приложение, для получения сведений о лицензии и для работы с Marketplace.

В конструкторе мы получаем состояние лицензии. В отладчике оно всегда устанавливается в False. Для отладочных целей мы хотели бы иметь возможность проверить работу программы при различных состояниях IsTrial(). Для этого мы задаём пользователю вопрос о переключении в отладочных целях на пробный режим и, если ответ пользователя положителен, записываем в переменную isInTrialMode значение true. Подобный механизм в реальных приложениях разумно будет реализовать на уровне приложения, в файле App.xaml.cs, сделав переменную, похожую на нашу isInTrialMode доступной другим страницам.

В обработчике нажатия на кнопку мы проверяем, находится ли приложение в пробном режиме. Если не находится – просто вызываем процедуру CounterChange(), то есть – попадаем в обычный игровой процесс. А если находится – проверяем счётчик. Когда счётчик достигает значения 3, мы сообщаем пользователю о том, что он пользуется пробной версией программы и предлагаем её приобрести.

После показа окна сообщения, мы показываем пользователю страницу Marketplace с подробностями о нашей программе. При отладке нормальным является поведение программы, когда данная команда приведет к появлению сообщения об ошибке Market Place Error 805a0194, рис. 36.2.

(рис 36.2) Ошибка Marketplace – правильная реакция системы при отладке

36.3. Реклама в приложениях

В настоящий момент (начало 2012 года) сервис Microsoft Advertising, не имеет Россию в списке рынков, с которыми работает этот сервис (http://community.microsoftadvertising.com/unsorted/publishers/b/pubcenter/archive/2012/02/27/seven-new-markets-in-pubcenter-now-live.aspx). Однако, список стран пополняется.

Для использования рекламы в приложениях существует специальный элемент управления – AdControl, рис. 36.3.

(рис 36.3) Элемент управления AdControl

Если у вас нет данного элемента управления, возможно, у вас не установлен Microsft Advertising SDK (http://www.microsoft.com/en-us/download/details.aspx?id=8729). Присутствует и русская версия пакета.

Элемент управления имеет несколько ключевых свойств, а именно, это AdUnitID, которое по умолчанию содержит значение Image480x80, и ApplicationId, которое содержит test_client. Эти тестовые значения можно использовать при отладке приложения, однако, чтобы показывать в своём приложении реальные рекламные объявления, нужно зарегистрироваться в сервисе (http://advertising.microsoft.com/mobile-apps).

36.4. Об анализе производительности приложений

Вдоль правой части экрана в разрабаываемых Silverlight-приложениях по умолчанию выводится ряд показателей. На рис. 36.4 приведен данный фрагмент экрана для одного из приложений.

(рис 36.4) Показатели производительности Silverlight-приложения

Ниже, в порядке представления слева направо, перечислены показатели и их описание

  • 050 – Composition Thread FPS – скорость, с которой обновляется экран. Чем ближе этот показатель к 60 кадрам в секунду – тем лучше. Если он падает ниже 30 – это означает недостаточную производительность приложения.
  • 050 – User Interface Thread FPS – скорость, с которой обновляется пользовательский интерфейс, этот показатель не должен падать ниже 20 кадров в секунду.
  • 002418 – Texture Memory Usage – использование системной и видеопамяти
  • 001 – Surface Counter – счётчик поверхностей, которые явно передаются графическому ускорителю для обработки
  • 001 – Intermediate Surface Counter – счётчик полного количества поверхностей, сгенерированных в результате кэширования поверхностей.
  • 00.8039 – Screen Fill Rate Counter – количество пикселей, которые выводятся каждый кадр. 1 обозначает полную перерисовку всего экрана в 480х800 пикселей. Рекомендуется, чтобы данный показатель не превышал 2,5.
  • Здесь приведены данные со снимка экрана эмулятора. Анализировать эти показатели имеет смысл на устройстве, используемом для отладки приложений.

    Рекомендации по производительности приложений можно почитать здесь: http://msdn.microsoft.com/en-us/library/ff967560%28v=vs.92%29.aspx

    Для анализа производительности приложений (как на XNA, так и на Silverlight) можно воспользоваться инструментом анализа производительности (Отладка > Начать анализ производительности Windows Phone).

    Подробнее об анализе производительности можно узнать здесь: http://msdn.microsoft.com/en-us/library/hh202934%28v=vs.92%29.aspx.

    36.5. Выводы

    По состоянию на начало 2012 года российский разработчик может заработать на продаже приложений через Marketplace, в список стран, с которыми работает Microsoft Advertising, Россия пока не включена. Данный список расширяется, поэтому не исключено, что когда вы будете читать этот текст, Россия уже будет среди списка Microsoft Advertising. Последние новости об этой программе можно узнать в блоге http://community.microsoftadvertising.com/unsorted/publishers/b/pubcenter/.

    36.6. Задание

    Выясните, поддерживает ли на текущий момент сервис Microsoft Advertising российских разработчиков. Подумайте, как следует изменить дизайн ваших приложений для того, чтобы возможное встраивание в них рекламных блоков не нанесло ущерба их внешнему виду. Реализуйте приложение, пробная версия которого отличается от платной лишь показом рекламы в пробной версии. Изучите вопрос показа рекламных блоков в XNA-приложениях.

    36.7. Дополнительные материалы

    К данной лабораторной работе прилагается видеоурок

    и демонстрационный проект.

    Вернуться к учебному плану