Основная нагрузка идет за счет шейдеров. То что ты напишеш на ДиректИкс будит все равно все отсылать данные на видео карту. А та в свою очередь применять шейдеры.
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.