In Microsoft's example per come usare PixelShader usano un singleton. Ho visto lo stesso modello in other places, e qui dico ShaderÈ consigliabile utilizzare un PixelShader singleton come best practice?
Il pixel è memorizzato in un campo _pixelShader private static. Questo campo è statico, perché un'istanza del codice shader compilato è sufficiente per l'intera classe.
Abbiamo riscontrato diversi problemi di perdita di memoria quando si utilizza questo modello. PixelShader è coinvolto nella gestione degli eventi che non vengono sempre cancellati correttamente. Abbiamo dovuto freeze loro, e ho visto qualche miglioramento. Abbiamo dovuto fare manualmente alcuni distacchi
// Attach/detach effect as UI element is loaded/unloaded. This avoids
// a memory leak in the shader code as described here:
element.Loaded += (obj, args) =>
{
effect.PixelShader = ms_shader;
element.Effect = effect;
};
element.Unloaded += (obj, args) =>
{
effect.PixelShader = null;
element.Effect = null;
};
E anche ora sotto stress ci sono ancora perdite di memoria in quella zona. Qualcuno sa se PixelShader utilizza risorse pesanti che valgono la pena di utilizzare un singleton?