Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Создание компонента для отображения FPS

Схема работы такая -

1. в методе Draw(..) - увеличиваем счетчик кадров на еденицу, затем отображаем полученное значение.

2. в методе Update(..) - проверяем прошла ли секунда с момента обновления таймера, если прошла - сбрасываем таймер, если нет добавляем к таймеру прошедшее время.

 

 

FrameRateCounter class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  public class FrameRateCounter : DrawableGameComponent
{
ContentManager content;
SpriteBatch spriteBatch;
SpriteFont spriteFont;
 
int frameRate = 0;
int frameCounter = 0;
TimeSpan elapsedTime = TimeSpan.Zero;
 
 
public FrameRateCounter(Game game)
: base(game)
{
content = new ContentManager(game.Services);
}
 
 
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
spriteFont = content.Load<SpriteFont>("Font");
}
 
public override void Update(GameTime gameTime)
{
elapsedTime += gameTime.ElapsedGameTime;
 
if (elapsedTime > TimeSpan.FromSeconds(1))
{
elapsedTime -= TimeSpan.FromSeconds(1);
frameRate = frameCounter;
frameCounter = 0;
}
}
 
 
public override void Draw(GameTime gameTime)
{
frameCounter++;
 
string fps = string.Format("fps: {0}", frameRate);
 
spriteBatch.Begin();
 
spriteBatch.DrawString(spriteFont, fps, new Vector2(33, 33), Color.Black);
spriteBatch.DrawString(spriteFont, fps, new Vector2(32, 32), Color.White);
 
spriteBatch.End();
}
}

 

 

Для использования компонента - регистрируем его:

 

1
Components.Add(new FrameRateCounter(this));

 

Для работы компонент использует свой шрифт - Font.spritefont

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   <?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
<Asset Type="Graphics:FontDescription">
<FontName>Arial</FontName>
<Size>14</Size>
<Spacing>2</Spacing>
<Style>Regular</Style>
<CharacterRegions>
<CharacterRegion><Start>f</Start><End>f</End></CharacterRegion>
<CharacterRegion><Start>p</Start><End>p</End></CharacterRegion>
<CharacterRegion><Start>s</Start><End>s</End></CharacterRegion>
<CharacterRegion><Start>:</Start><End>:</End></CharacterRegion>
<CharacterRegion><Start> </Start><End> </End></CharacterRegion>
<CharacterRegion><Start>0</Start><End>9</End></CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>

 

по материалам Shawn Hargreaves Blog

 


Комментарии
#1 | Ameno 10.04.2009 21:25:16
если сильно ругается на загрузку шрифта то после
content = new ContentManager(game.Services);
надо добавить
content.RootDirectory = "Content";
#2 | pax 20.06.2009 21:40:04
А вот на моей машине какой-то глюк и последнее время постоянно вываливается одна и таже ошибка, что шрифт "Arial" не поддерживает стиль "Regular"... наверное надо уже систему сносить и ставить заново...
#3 | VakarimaZ 16.08.2009 21:00:47
хм. а кто мешает фпс получить в одну строку? почти =)
GeSHi: C#
  1. try
  2. {
  3. SpriteBatch.DrawString(
  4. _courier12,
  5. (1000 / gameTime.ElapsedRealTime.Milliseconds).ToString(),
  6. new Vector2(10, 10),
  7. Color.DeepSkyBlue);
  8. }
  9. catch (DivideByZeroException) {}
  10.  
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2
#4 | mike 16.08.2009 21:16:19
мешает неудовлетворительная точность результата, когда секунда проходит, нужно от счетчика секунд отнимать не целую единицу а прошедшее время за период отсчета.
а предложенный вариант кроме этого будет еще давать рывки в показаниях в момент DivideByZeroException...
#5 | VakarimaZ 16.08.2009 23:37:42
DivideByZero вылетает очень редко во время дебага, поэтому рывков нет, а точность получается даже слишком хорошая, ибо если фпс не постоянный, а так чаще всего бывает, число мерцает сильно, т.к. меняется при отрисовке каждого кадра =)
ElapsedRealTime возвращмет время, прошедшее с момента отрисовки предыдущего кадра, так что всё честно получается.

P.S. мне фпс нужен только во время тестирования, поэтому писать класс вместо одной строчки в моей ситуации излишне
#6 | Chill 13.10.2009 14:46:02
а можно ли сделать очистку поля отображения каунтера? просто у меня получается так, что отабражённые ранее числа "висят"
#7 | mike 13.10.2009 14:54:48
такое возможно только если бэк буфер не чистить.
#8 | Chill 13.10.2009 18:05:22
спасибо, разобрался ошибка была в другом месте
#9 | mike 21.01.2010 08:17:08
По поводу точности замеров. Fraps показывает идентичные значения -
xnadev.ru/images/fpscounter.jpg
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,09 секунд 8,711,081 уникальных посетителей