|
С# Средство разработки на платформе .Net |
01.06.2012, 22:14
|
#16
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Вопросы по XNA.
Мб в блицмаксе не рисуются объекты когда выходят за экран? Тоесть в функции рендера такая проверка. А в XNA нужно самому проверять.
|
(Offline)
|
|
01.06.2012, 22:17
|
#17
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Вопросы по XNA.
facepalm
|
(Offline)
|
|
01.06.2012, 22:25
|
#18
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопросы по XNA.
Тогда бы случай с одной картинкой должен был давать одинаковый результат.
Дело в чем-то другом.
Тут у меня вопрос возник. А есть ли что-нибудь шустрее Макса, в плане вывода картинок?
|
(Offline)
|
|
01.06.2012, 22:26
|
#19
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Вопросы по XNA.
Сообщение от MoKa
facepalm
|
ы? .
|
(Offline)
|
|
01.06.2012, 22:27
|
#20
|
Бывалый
Регистрация: 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
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы по XNA.
Во втором тесте у картинок есть прозрачность? Спрайт батч имеет еще параметры сортировки спрайтов, что используется по умолчанию?
|
(Offline)
|
|
01.06.2012, 22:33
|
#22
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопросы по XNA.
Нет, прозрачности нигде нету. Про сортировку ничего не знаю, сейчас посмотрю.
Тут появилось две идеи. Может это связано с форматом картинки? Также, возможно, я неправильно убрал ограничение фпс в XNA?
З.Ы. Исходники двумя моими постами выше, в оффтопе.
|
(Offline)
|
|
01.06.2012, 22:34
|
#23
|
Бывалый
Регистрация: 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
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопросы по XNA.
Сейчас нет доступа к ПК. А сильно ли это у тебя повлияло?
|
(Offline)
|
|
01.06.2012, 22:53
|
#25
|
Бывалый
Регистрация: 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
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопросы по XNA.
Ну-с, будем ждать ответа знающих, что они думают по этому поводу.
|
(Offline)
|
|
01.06.2012, 23:42
|
#27
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Вопросы по XNA.
Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.
|
(Offline)
|
|
01.06.2012, 23:47
|
#28
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Вопросы по XNA.
Сообщение от pax
Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.
|
первые секунды фпс меньше. но потом стабилизируется. и всегда по разному.
|
(Offline)
|
|
02.06.2012, 12:19
|
#29
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопросы по XNA.
ППерепробывал все варианты в спрайтбатче, и задержку делал. Как ни крути Макс быстрее.
В общем, решился я на отчаянный шаг. На чем, говорите, велосипед изобретают? C++ + OpenGL/DirectX ?
Попробую сделать тоже самое, банальный вывод картинок, только на DirectX SDK, и посмотреть, будет ли отличаться результат. Кстати, сложно ли это будет, если я раньше не работал с плюсами?
|
(Offline)
|
|
02.06.2012, 13:06
|
#30
|
Бывалый
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:43.
|