Como manipular uma variável de membro que consome memória

5

Suponha que vários objetos da mesma classe devam fazer algo que consuma um recurso que consome memória. Qual das seguintes abordagens é recomendada para definir e usar o recurso pelos objetos?

  • Cada objeto cria o recurso em seu próprio
  • Declare uma instância de recurso e passe-a para cada objeto
  • Usando um objeto estático para o recurso

Deixe-me dar um exemplo

class Section 
{
     public Bitmap Page {/* set and get the page...*/}
     Bitmap page = new Bitmap(600,800);
     Draw(SomeThing s) 
     {
        // Draw something on the page
     }
}

// in somewhere else
foreach (Section sect in Sections)
{
     sect.Draw(something);
     Video.AddFrame(sect.Page);
}

Versus.

class Section 
{
     public Bitmap Page {/* set and get the page ...*/}
     Bitmap page; // it isn't instantiated in the class
     Draw(SomeThing s) 
     {
        // Clear the page
        // Draw something on it
     }
}

// in somewhere else
Bitmap screen = new Bitmap(600,800); // the common resource
foreach (Section sect in Sections)
{
     sect.Page = screen;
     sect.Draw(something); // it clears it before drawing something on it
     Video.AddFrame(screen);
}

Versus.

class Section 
{
     public Bitmap Page {/* set and get the page ...*/}
     static Bitmap page = new Bitmap(600,800);
     Draw(SomeThing s) 
     {
        // First Clear the page
        // Draw something on the page
     }
}

// and in somewhere else
foreach (Section sect in Sections)
{
     sect.Draw(something);
     Video.AddFrame(sect.Page);
}

Primeiro, usei a primeira abordagem, mas ela consumiu muita memória, já que cada objeto no array Sections tinha um bitmap. Então fui forçado a tentar a segunda abordagem. Esta nova abordagem é melhor do que a primeira em todos os aspectos? Qual é a diretriz para tais situações?

    
por Ahmad 04.12.2014 / 11:57
fonte

3 respostas

1

Isso realmente depende do modelo de segmentação usado pelo seu aplicativo.

  • Em um cenário sequencial de encadeamento único, eu passaria o bitmap (se a construção é uma operação dispendiosa) ou a criava / destruía a cada vez. Mas você tem que criar tais objetos intensivos de memória imediatamente antes que eles sejam usados e destruí-los assim que você não precisar mais deles, se possível. Não os crie no construtor e saia por aí.
  • Se estivermos prestes a inserir multithreading, você poderá criar um pool seguro de thread deles (se a construção de um bitmap for custosa em seu cenário) ou apenas criar / destruir cada vez que precisar. Mas, novamente, não crie objetos apenas por diversão. Crie-os quando precisar deles.
por 31.01.2015 / 21:29
fonte
2

Se não houver um bitmap individual para cada seção, provavelmente não vale a pena ter um membro na Seção apontando para o bitmap. Você poderia passar o bitmap como um parâmetro para o método Draw:

class Section 
{
     Draw(Bitmap page, SomeThing s) 
     {
        // Draw something on the page
     }
}


// somewhere else

Bitmap screen = new Bitmap(600,800); // the common resource

foreach (Section sect in Sections)
{
     sect.Draw(screen, something);
     Video.AddFrame(screen);
}

Dessa forma, é mais flexível e você pode decidir criar um novo recurso sempre que estiver usando o (s) método (s) da seção.

    
por 07.01.2015 / 22:02
fonte
0

Você pode querer usar um BitmapLoader que carrega os Bitmaps de forma lenta quando necessário. Desta forma, você não precisa manter nenhum membro interno. Se necessário, você pode implementar algum tipo de cache LRU no BitmapLoader para otimizar o carregamento dos Bitmaps com mais frequência.

    
por 04.03.2015 / 14:34
fonte