В Microsoft example для использования PixelShader они используют одноэлементный. Я видел ту же картину в other places, и здесь они говорятСледует ли использовать одноэлементный PixelShader?
Пиксельный шейдер хранится в частном статическом поле _pixelShader. Это поле является статическим, потому что одного экземпляра скомпилированного шейдерного кода достаточно для всего класса.
Мы видели несколько проблем с утечкой памяти при использовании этого шаблона. В PixelShader задействована обработка событий, которая не всегда корректно очищается. Нам пришлось freeze их, и мы увидели некоторое улучшение. Нам пришлось вручную сделать некоторые отряды.
// 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;
};
И даже сейчас в условиях стресса в этой области по-прежнему сохраняются утечки памяти. Кто-нибудь знает, использует ли PixelShader тяжелые ресурсы, стоит ли использовать один сингл?