Ver la versión completa : Problemas con memcpy
Salustian
21/06/2005, 18:56
Hola a todos, estoy trasteando un poco con la GP32 y en vistas a un futuro proyecto que tengo en mente, estoy haciendo algunas pruebas y recordando viejas lecciones de programación en c.
El problema que tengo es el siguiente:
EL siguiente código sirve para pintar la pantalla entera de negro (funciona correctamente):
GpRectFill16(NULL,&(GFX_Data->gtSurface[GFX_Data->giSurface]),
0,0,GPC_LCD_WIDTH,GPC_LCD_HEIGHT,RGB(0,0,0));
y lo quiero sustituir por este otro que usa memcpy:
int cx;
unsigned short PNegra[GPC_LCD_WIDTH*GPC_LCD_HEIGHT];
for(cx=0;cx<GPC_LCD_WIDTH*GPC_LCD_HEIGHT;cx++) PNegra[cx] = 0x00;
(...)
memcpy(&(GFX_Data->gtSurface[GFX_Data->giSurface]),PNegra,
GPC_LCD_WIDTH*GPC_LCD_HEIGHT*sizeof(unsigned short));
El resultado es un parpadeo espantoso y no alcanzo a entender que pasa :shock:
la función memcpy que uso es la que está en ensamblador en la página de PEA: http://www.gp32.co.nz/snippet_view.php?snippet_id=5
tambien he probado a usar gm_memcpy, pero con idéntico resultado.
Alguien puede arrojar algo de luz?
Un saludo al grupo.
Puedes probar esta (http://www.gp32spain.com/foros/showthread.php?t=19916) implementación de la función memcpy() de theNestruo escrita completamente en C.
Si estas usando doble buffer mira de escribir en el buffer contrario, probablemente el sdk de Gamepark dibuja durante el retrazado vertical, por eso no parpadea.
Y si la funcion va bien para que usar memcpy? ¿se obtiene mas velocidad? ¿simple capricho?
Tiene pinta de ser lo que dice Wave, mira a ver si pintas en el buffer contrario al que se esta visualizando. Eso si usas doble buffer, sino, prueba a usarlo :P
De todas formas a mi memcpy no me funcionaba, tenia que usar gm_memcpy.
Es mas rapido usar memcpy que el blitter del SDK oficial, pero solo podras usarlo para pintar backgrounds.
¿Y porqué no utilizas gm_memset()? Te ahorarías el tener que declarar la matriz PNegra.
Para hacer lo que quieres hacer, es lo que hago yo.
Salustian
22/06/2005, 12:51
Lo primero, gracias a todos por responder.
He hecho pruebas con el siguiente código, descomentando una instrucción en cada prueba:
/* Borra la pantalla */
/*
GpRectFill16(NULL,&(GFX_Data->gtSurface[GFX_Data->giSurface]),
0,0,GPC_LCD_WIDTH,GPC_LCD_HEIGHT,RGB(0,0,0));
asm_memcpy(&(GFX_Data->gtSurface[GFX_Data->giSurface]),PNegra,
GPC_LCD_WIDTH*GPC_LCD_HEIGHT*sizeof(unsigned short));
FastMemoryCopy((unsigned char *)PNegra,
(unsigned char *)(&(GFX_Data->gtSurface[GFX_Data->giSurface])),
GPC_LCD_WIDTH*GPC_LCD_HEIGHT*sizeof(unsigned short));
*/
gm_memcpy(&(GFX_Data->gtSurface[GFX_Data->giSurface]),PNegra,
GPC_LCD_WIDTH*GPC_LCD_HEIGHT*sizeof(unsigned short));
con GpRectFill16 funciona. Con los otros memcpy (el del SDK oficial, el de PEA en ensamblador y el de TheNestruo) obtengo el mismo resultado, un parpadeo horroroso. Sí que uso doble buffer y estoy seguro de escribir en el buffer que le corresponde (si no fallaría también con GpRectFill16).
Os incluyo dos ejecutables (.fxe) en el zip que adjunto. El primero (Bien.fxe) usa GpRectFill16 y es como debería funcionar. El segundo (Mal.fxe) usa gm_memcpy y se ve el flicker.
La verdad es q estoy un poco perdido y no sé por donde tirar :shock:
Oankali, gracias por el apunte :)
Un saludo a todos.
PD: Gallifante pal que adivine de que juego estoy pensando realizar un port.
Si me envías un poco más de código, te puedo testar el gm_memcpy con el VC++.
Y no conozco el juego, no soy muy jugón pero por lo visto eres un sniper.
Salustian
24/06/2005, 13:59
Ya está pillado el fallo, me falta el .ptbuffer en la instrucción GFX_Data->gtSurface[GFX_Data->giSurface]
Esto es consecuencia de no tener aire acondicionado en el curro ARGGGGHHHH :shock:
Gracias Oankali por tu ofrecimiento.
Aprovechando las pruebas de código que he hecho, voy a hacer un benchmark de las diferentes funciones para copiar bloques de memoria, el lunes os cuento.
Un saludo.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.