Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 01.06.2012, 22:14   #16
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Мб в блицмаксе не рисуются объекты когда выходят за экран? Тоесть в функции рендера такая проверка. А в XNA нужно самому проверять.
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:17   #17
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Вопросы по XNA.

facepalm
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:25   #18
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопросы по XNA.

Тогда бы случай с одной картинкой должен был давать одинаковый результат.
Дело в чем-то другом.
Тут у меня вопрос возник. А есть ли что-нибудь шустрее Макса, в плане вывода картинок?
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:26   #19
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Сообщение от MoKa Посмотреть сообщение
facepalm
ы? .
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:27   #20
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Сообщение от Nikich Посмотреть сообщение
Тогда бы случай с одной картинкой должен был давать одинаковый результат.
Дело в чем-то другом.
Тут у меня вопрос возник. А есть ли что-нибудь шустрее Макса, в плане вывода картинок?
попробуй написать свой шейдер для вывода картинок на XNA и проверь Мб там вычислений куда больше чем в максе производится в том что по умолчанию предлогается.

и попробуй вот так потестить

            for (int i = 0; i < 1100; i++)
            {
                for (int i1 = 0; i1 < 11; i1++)
                {
                    sprites.Draw(backgroundTexture, new Vector2(player_position.X , player_position.Y  ), Color.White);
                }
            }
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:27   #21
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы по XNA.

Во втором тесте у картинок есть прозрачность? Спрайт батч имеет еще параметры сортировки спрайтов, что используется по умолчанию?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:33   #22
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопросы по XNA.

Нет, прозрачности нигде нету. Про сортировку ничего не знаю, сейчас посмотрю.
Тут появилось две идеи. Может это связано с форматом картинки? Также, возможно, я неправильно убрал ограничение фпс в XNA?
З.Ы. Исходники двумя моими постами выше, в оффтопе.
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:34   #23
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Сообщение от pax Посмотреть сообщение
Во втором тесте у картинок есть прозрачность? Спрайт батч имеет еще параметры сортировки спрайтов, что используется по умолчанию?
Deferred: спрайты не отображаются до вызова SpriteBatch.End. Затем все вызовы направляются на графическое устройство в том порядке, в каком они были сделаны. В этом режиме многочисленные объекты SpriteBatch могут проводить вызовы Draw без конфликтов друг с другом. (Это режим по умолчанию.)

Immediate: метод Begin сразу же после вызова устанавливает настройки для графического устройства, а новые вызовы Draw сразу же выводят спрайты на экран. Но только один объект SpriteBatch может быть активен в данное время. Это самый быстрый режим
Лол. в Этом режиме в 2 раза меньше фпс чем в других. а то и еще меньше. Хз в каком месте он самый быстрый.)) На счет прозрачности, разные режимы вроде не сильно влияют на результат.

Но самый быстрый это:
sprites.Begin(SpriteSortMode.Deferred, BlendState.Additive);
Additive: прозрачное смешивание; добавляет цвета спрайта к цвету фона без использования прозрачности.
Попробуй с такой строчкой.
и так попробуй: BlendState.Opaque
Но этот медлеенее у меня чем Additive
Opaque: непрозрачное смешивание; цвет фона заменяется цветом спрайта.
зы: Пользуясь случаем. Где можно почитать подробно про шейдеры разных версий. Чем 2.0 отличаются от 3.0 и 4.0 итд. И по HLSL какой нить учебник, чтобы все подробно, а не вкратце.=0
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:46   #24
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопросы по XNA.

Сейчас нет доступа к ПК. А сильно ли это у тебя повлияло?
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 22:53   #25
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Сообщение от Nikich Посмотреть сообщение
Сейчас нет доступа к ПК. А сильно ли это у тебя повлияло?
м кстати я наврал походу. sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque); самый быстрый.

Вообщем
sprites.Begin();
8700
sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque);
8840

не знаю от чего зависит. при каждом запуске разные цифры.
щас вообще 8650 было с
sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque);

а до этого , как я говорил
sprites.Begin(SpriteSortMode.Deferred, BlendState.Additive);
выдавал больше чем
sprites.Begin(SpriteSortMode.Deferred, BlendState.Opaque);
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 23:11   #26
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопросы по XNA.

Ну-с, будем ждать ответа знающих, что они думают по этому поводу.
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 23:42   #27
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вопросы по XNA.

Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 01.06.2012, 23:47   #28
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Сообщение от pax Посмотреть сообщение
Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.
первые секунды фпс меньше. но потом стабилизируется. и всегда по разному.
(Offline)
 
Ответить с цитированием
Старый 02.06.2012, 12:19   #29
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопросы по XNA.

ППерепробывал все варианты в спрайтбатче, и задержку делал. Как ни крути Макс быстрее.
В общем, решился я на отчаянный шаг. На чем, говорите, велосипед изобретают? C++ + OpenGL/DirectX ?
Попробую сделать тоже самое, банальный вывод картинок, только на DirectX SDK, и посмотреть, будет ли отличаться результат. Кстати, сложно ли это будет, если я раньше не работал с плюсами?
(Offline)
 
Ответить с цитированием
Старый 02.06.2012, 13:06   #30
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Основная нагрузка идет за счет шейдеров. То что ты напишеш на ДиректИкс будит все равно все отсылать данные на видео карту. А та в свою очередь применять шейдеры.

effect.CurrentTechnique = effect.Techniques["Textured"];
Matrix world = Matrix.Identity;// worldRotation* worldTranslation;
effect.Parameters["xWorldViewProjection"].SetValue(
world * camera.view * camera.projection);
effect.Parameters["xColoredTexture"].SetValue(texture);

foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.DrawUserPrimitives<VertexPositionTe xture>
(PrimitiveType.TriangleStrip, verts, 0, 2);
}
Тоесть ты по сути перепишешь этот код только на С++ используя функции DirectX. Но этот код выполняется очень быстро и никакого прироста ты не получишь. А вот шейдеры:


float4x4 xWorldViewProjection;
Texture xColoredTexture;

sampler ColoredTextureSampler = sampler_state
{ 
	texture = <xColoredTexture> ;
	magfilter = LINEAR;
	minfilter = LINEAR; 
	mipfilter = LINEAR;
	AddressU = mirror; 
	AddressV = mirror;
};

struct VertexIn
{
    float4 position : POSITION;
};

struct VertexOut
{
    float4 Position : POSITION;
    float2 textureCoordinates : TEXCOORD0;
};

VertexOut VertexShaderFunction(VertexIn input)
{
    VertexOut Output = (VertexOut)0;
    Output.Position = mul(input.position,xWorldViewProjection);
    Output.textureCoordinates = normalize(input.position.xy);
    return Output;
}

float4 PixelShaderFunction(float2 texCoord: TEXCOORD0) : COLOR0
{
   float ang = atan2 (texCoord.x, texCoord.y);
   float rad = dot (texCoord, texCoord);

   return float4(0.5*(1 + sin (ang *20.0f )),0.5*cos(50.0f * ang),0.5*cos(60.0f),1);
};

technique Textured
{
    pass Pass0
    {
        VertexShader = compile vs_2_0 VertexShaderFunction(  );
        PixelShader = compile ps_2_0 PixelShaderFunction(  );
    }
}


Вот этот код (точнее некоторые функции внутри него, одна для вертексного, другая для пиксельного шейдера) выполняется, как минимум 4 раза для вертексного (ну у обычной картинки 4 вершины же) и 100*100 раз для пиксельного для картинки размером 100 на 100. Тоесть для каждого пикселя.

И если ты хочеш добиться лучшей проиводительности, то тебе нужно помаксимуму упростить код пиксельного шейдера. Тоесть вот эту хрень:
float4 PixelShaderFunction(float2 texCoord: TEXCOORD0) : COLOR0
{
   float ang = atan2 (texCoord.x, texCoord.y);
   float rad = dot (texCoord, texCoord);

   return float4(0.5*(1 + sin (ang *20.0f )),0.5*cos(50.0f * ang),0.5*cos(60.0f),1);
};
Ведь неизвестно, что прописано в том, что используется по умолчанию в XNA для вывода 2D картинок.

Поэтому лучше учи HLSL.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 13:44.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com