Ir ao conteúdo

Delphi Game usando muito o processador


Fazzioni

Posts recomendados

Postado

Boa tarde a todos, estou desenvolvendo um game estilo bomberman, o meu objetivo é criar um game e poder jogar online com meus amigos ate ai tudo bem, eu criei a animação do personagem principal, ao plantar a bomba a utilização do processador sobe lá em cima, meu processador não é estão ruim assim

é um core 2 duo 2,8 ghz

estou com uma GTS 250

o projeto pode ser conferido ak:

W,A,S,D se movimenta e barra d spaço solta bomba

link = https://mega.co.nz/#!MsEDwbLS!ZrqyMBogENp9oC4G79JdpEJx_nwA16dmNJ5vkeTnUt4


https://mega.co.nz/#!MsEDwbLS!ZrqyMBogENp9oC4G79JdpEJx_nwA16dmNJ5vkeTnUt4

estou usando um TTimer com uma velocidade d 33 milisegundos, tudo o q esta no timer esta sendo desenhado ate a parte das bomba e personagens

o codigo ao plantar bomba é esse:


Tipos de variaveis:
Type
Tbomba = Record
X :0..1024;
Y :0..768;
Timing : byte;
Stagio : 0..7;
Status : Boolean;
Sinal_M:Boolean;

end;

Type
Tmapa = Record
Bomb : Array [1..3] of TBitmap;
end;


variaveis globais
Mapa : Tmapa;
Bomba : Array [1..30] of Tbomba;



procedure TForm1.DrawBomb;
const
cor : TColor = $00B0E4EF;
var
XD :0..1024;
YD :0..768;
aux : byte;
begin


for aux := 1 to High(bomba) do
If Bomba[aux].Status = true then
begin
Inc(Bomba[aux].Timing);

if Bomba[aux].Timing = 6 then
begin
Bomba[aux].Timing := 0;
if Bomba[aux].Sinal_M = true then
inc(Bomba[aux].Stagio)
else
Bomba[aux].Stagio:= Bomba[aux].Stagio -1;
end;



if Bomba[aux].Stagio = 4 then
begin
Bomba[aux].Sinal_M := false;
Bomba[aux].Stagio := 2;
end;

if Bomba[aux].Stagio = 0 then
begin
Bomba[aux].Sinal_M := true;
Bomba[aux].Stagio := 2;
end;


For YD := 0 to Mapa.bomb[ bomba[aux].Stagio].Height -1 do
For XD := 0 to Mapa.bomb[ bomba[aux].Stagio].Width -1 do
if Mapa.Bomb[bomba[aux].Stagio].Canvas.Pixels[XD,YD] <> cor then
Image1.Canvas.Pixels[Bomba[aux].X+xD,Bomba[aux].Y+YD]:= mapa.bomb[bomba[aux].Stagio].Canvas.Pixels[XD,YD];

end
else
exit;

end;

estou ultilizando 3 stagio da bomba (3 figuras)

1- pequena

2- media

3- grande

as imagens estão armazenadas na variavel mapa.bomb[]

tva esquecendo de mencionar meu fps antes de plantar a bomba fica perto dos 40 e c eu plantar uma bomba desce uns 15 frames

obrigado pela visualização se alguem tiver alguma dica agradeço.

Postado

Creio que o problema está neste trecho:


For YD := 0 to Mapa.bomb[ bomba[aux].Stagio].Height -1 do
For XD := 0 to Mapa.bomb[ bomba[aux].Stagio].Width -1 do
if Mapa.Bomb[bomba[aux].Stagio].Canvas.Pixels[XD,YD] <> cor then
Image1.Canvas.Pixels[Bomba[aux].X+xD,Bomba[aux].Y+YD]:= mapa.bomb[bomba[aux].Stagio].Canvas.Pixels[XD,YD];

A manipulação de pixels é uma tarefa lerda e que exige muito processamento, ainda mais com imagens grandes (1024x768)...

Um modo melhor de analisar e manipular pixels é usar "ScanLine".

Scanline varre uma linha de pixels de uma imagem e seu uso é muito mais eficiente.

Um problema com o uso de "ScanLine" é quanto à compatibilidade no formato de bits das imagens.

Uma vez eu tive problemas ao rotacionar imagens se elas não fossem 32 bits e ainda não entendo isso muito bem...

Por isso peço que, na criação dos bitmaps "Mapa.Bomb" você declare o formato de pixels das imagens como 32 bits, e também defina a imagem "Image1" como neste exemplo:


procedure TForm1.FormCreate(Sender: TObject);
var
ind_map: word; //indice para os bitmaps "Mapa.Bomb"
begin
Image1.Picture.Bitmap.PixelFormat:= pf32bit;
for ind_map:= 1 to 3 do
begin
Mapa.Bomb[ind_map]:= TBitmap.Create;
Mapa.Bomb[ind_map].PixelFormat:= pf32bit;
Mapa.Bomb[ind_map].Width:= 1024;
Mapa.Bomb[ind_map].Height:= 768;
end;
end;

Agora refazendo sua função, agora para usar "ScanLine":


procedure TForm1.DrawBomb;
{declaração do tipo usado em "ScanLine"}
type
TRGB32 = packed record
B, G, R, A: Byte;
end;
TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
PRGB32Array = ^TRGB32Array;

const
cor : TColor = $00B0E4EF;
var
XD :0..1024;
YD :0..768;
aux : byte;
x,y: integer;
Line1, Line2: PRGB32Array; //variáveis que armazenam pixels das linhas das imagens
begin
for aux := 1 to High(bomba) do
If Bomba[aux].Status = true then
begin
Inc(Bomba[aux].Timing);

if Bomba[aux].Timing = 6 then
begin
Bomba[aux].Timing := 0;
if Bomba[aux].Sinal_M = true then
inc(Bomba[aux].Stagio)
else
Bomba[aux].Stagio:= Bomba[aux].Stagio -1;
end;



if Bomba[aux].Stagio = 4 then
begin
Bomba[aux].Sinal_M := false;
Bomba[aux].Stagio := 2;
end;

if Bomba[aux].Stagio = 0 then
begin
Bomba[aux].Sinal_M := true;
Bomba[aux].Stagio := 2;
end;

Image1.Picture.Bitmap.PixelFormat:= pf32bit;
For YD := 0 to Mapa.bomb[ bomba[aux].Stagio].Height -1 do
begin
Mapa.bomb[ bomba[aux].Stagio].PixelFormat:= pf32bit;
Line1:= Mapa.bomb[ bomba[aux].Stagio].ScanLine[YD]; //linha da imagem analisada
Line2:= Image1.Picture.Bitmap.ScanLine[Y+YD]; //linha da imagem resultante

For XD := 0 to Mapa.bomb[ bomba[aux].Stagio].Width -1 do
begin
//verifica se a cor do pixel analisado é diferente da cor definida
if(Line1[XD].R <> GetRValue(cor))or
(Line1[XD].G <> GetGValue(cor))or
(Line1[XD].B <> GetBValue(cor))then
begin
Line2[X + XD]:= Line1[XD]; //assume cor do pixel Line1[XD]
end;
end;
end;
Image1.Invalidate;
end
else
exit;
end;

Sugiro que você pesquise um pouco a respeito de "ScanLine" para entender melhor como funciona.

E eu não testei o funcionamento da função, então qualquer problema poste aí ^-

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!