In Microsofts example für die Verwendung des PixelShader verwenden sie ein Singleton. Ich habe das gleiche Muster in other places gesehen, und hier sagen, dass sieSollte ein Singleton PixelShader eine Best Practice sein?
Die Pixel-Shader in einem privaten statischen Feld _pixelShader gespeichert ist. Dieses Feld ist statisch, da eine Instanz des kompilierten Shader-Codes für die gesamte Klasse ausreicht.
Bei Verwendung dieses Musters sind mehrere Speicherprobleme aufgetreten. Der PixelShader ist involviert ist Ereignisbehandlung, die nicht immer korrekt gelöscht wird. Wir mussten freeze sie, und sah eine Verbesserung. Wir mussten von Hand einiger Abteilungen tun
// 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;
};
Und auch jetzt unter Stress gibt es nach wie vor Speicherlecks in diesem Bereich. Weiß jemand, ob der PixelShader schwere Ressourcen nutzt, die den Einsatz eines Singletons wert sind?