forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Вопросы по XNA. (http://forum.boolean.name/showthread.php?t=16854)

radiobutton 01.06.2012 22:14

Ответ: Вопросы по XNA.
 
Мб в блицмаксе не рисуются объекты когда выходят за экран? Тоесть в функции рендера такая проверка. А в XNA нужно самому проверять.

moka 01.06.2012 22:17

Ответ: Вопросы по XNA.
 
facepalm

Nikich 01.06.2012 22:25

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

radiobutton 01.06.2012 22:26

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от MoKa (Сообщение 229202)
facepalm

ы? .

radiobutton 01.06.2012 22:27

Ответ: Вопросы по XNA.
 
Цитата:

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

попробуй написать свой шейдер для вывода картинок на 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);
                }
            }


pax 01.06.2012 22:27

Ответ: Вопросы по XNA.
 
Во втором тесте у картинок есть прозрачность? Спрайт батч имеет еще параметры сортировки спрайтов, что используется по умолчанию?

Nikich 01.06.2012 22:33

Ответ: Вопросы по XNA.
 
Нет, прозрачности нигде нету. Про сортировку ничего не знаю, сейчас посмотрю.
Тут появилось две идеи. Может это связано с форматом картинки? Также, возможно, я неправильно убрал ограничение фпс в XNA?
З.Ы. Исходники двумя моими постами выше, в оффтопе.

radiobutton 01.06.2012 22:34

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от pax (Сообщение 229206)
Во втором тесте у картинок есть прозрачность? Спрайт батч имеет еще параметры сортировки спрайтов, что используется по умолчанию?

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

Nikich 01.06.2012 22:46

Ответ: Вопросы по XNA.
 
Сейчас нет доступа к ПК. А сильно ли это у тебя повлияло?

radiobutton 01.06.2012 22:53

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от Nikich (Сообщение 229209)
Сейчас нет доступа к ПК. А сильно ли это у тебя повлияло?

м кстати я наврал походу. 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);

Nikich 01.06.2012 23:11

Ответ: Вопросы по XNA.
 
Ну-с, будем ждать ответа знающих, что они думают по этому поводу.

pax 01.06.2012 23:42

Ответ: Вопросы по XNA.
 
Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.

radiobutton 01.06.2012 23:47

Ответ: Вопросы по XNA.
 
Цитата:

Сообщение от pax (Сообщение 229214)
Сделайте задержку на пару секунд перед тестом в XNA, вероятно влияет начальная подгрузка библиотек Net Framework и т.д.

первые секунды фпс меньше. но потом стабилизируется. и всегда по разному.:)

Nikich 02.06.2012 12:19

Ответ: Вопросы по XNA.
 
ППерепробывал все варианты в спрайтбатче, и задержку делал. Как ни крути Макс быстрее.
В общем, решился я на отчаянный шаг. На чем, говорите, велосипед изобретают? C++ + OpenGL/DirectX ?
Попробую сделать тоже самое, банальный вывод картинок, только на DirectX SDK, и посмотреть, будет ли отличаться результат. Кстати, сложно ли это будет, если я раньше не работал с плюсами?

radiobutton 02.06.2012 13:06

Ответ: Вопросы по 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.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot