Pergunta

Eu perguntei antes sobre pixel empurrando, e já conseguiu chegar longe o suficiente para obter o ruído de aparecer na tela. Aqui está como eu INIT:

CGDataProviderRef provider;
bitmap = malloc(320*480*4);
provider = CGDataProviderCreateWithData(NULL, bitmap, 320*480*4, NULL);
CGColorSpaceRef colorSpaceRef;
colorSpaceRef = CGColorSpaceCreateDeviceRGB();
ir = CGImageCreate(
320,
480,
8,
32,
4 * 320,
colorSpaceRef,
kCGImageAlphaNoneSkipLast,
provider,
NULL,
NO,
kCGRenderingIntentDefault
);

Aqui está como eu renderizar cada quadro:

for (int i=0; i<320*480*4; i++) {
bitmap[i] = rand()%256;
}
CGRect rect = CGRectMake(0, 0, 320, 480);
CGContextDrawImage(context, rect, ir); 

O problema é que este é terrivelmente terrivelmente lenta, em torno de 5 fps. Eu acho que o meu caminho para publicar o tampão deve estar errado. Será que é mesmo possível fazer full-screen com base em gráficos de pixel que eu poderia atualizar a 30fps, sem usar o chip 3D?

Foi útil?

Solução

A lentidão é quase certamente na geração de ruído. Se você executar este em Instruments você provavelmente verá que uma tonelada de tempo é gasto sentado em seu loop.

Outra questão menor é o espaço de cores. Se você usar o espaço de cores da tela, você vai evitar uma conversão de cores que é potencialmente caro.

Se você pode usar CoreGraphics rotinas para o seu desenho, você estaria melhor servido através da criação de um CGLayer para o contexto de desenho em vez de criar um novo objeto de cada vez.

O componente bytesPerRow também é importante para o desempenho. Ele deve ser um fator de 32 IIRC. Há algum código disponível link de texto que mostra como calculá-lo .

E sim, para o desempenho bruto, OpenGL.

Outras dicas

Eu suspeito fazendo 614400 (320*480*4) escreve memória, geração de números aleatórios e fazer um novo objeto de cada frame é retardando para baixo.

Você tentou apenas escrever um bitmap estático para a tela e ver o quão rápido que é? Você talvez tentou perfilar o código? Você também precisa fazer uma nova CGRect cada vez?

Se você quiser apenas para dar o efeito de aleatoriedade, provavelmente não há necessidade de regenerar todo o bitmap de cada vez.

Para meu conhecimento, OpenGL é suposto ser a maneira mais rápida de fazer gráficos no iPhone. Isto inclui 2D e 3D. Um UIView é apoiada por uma camada de animação do núcleo, o que acaba por desenhar com OpenGL de qualquer maneira. Então por que não pular o meio-homem.

Você pode evitar a viagem através CGContextDrawImage atribuindo o seu CGImageRef para -[CALayer setContents:], apenas não se esqueça de bitmap livre, enquanto você ainda está usando-o.

[[view layer] setContents:(id)ir];

Sim, eu sei que isso é velho, me deparei com ele do Google

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top