"el resultadio no sera mejor ya que las librerias ahn sido desarrololadas de la forma mas optimizada posible lo cual seguramente es mejor de lo que cualquirea de nosotros lograria"
Hmmm... Considerando que hablamos de microsoft...
En realidad es relativo, si hablas de funciones de propósito general o específicas para cubrir un problema puntual:
Ej. "Cambiar el tamaño a una superficie", sólo perderíamos tiempo haciendo una nueva función que haga esto, ya que existe una buena de propósito general que hace lo mismo. Pero si lo que SIEMPRE haremos es "Cambiar el tamaño de una superficie al DOBLE de ancho y de alto" entoces podremos crear una función de propósito específico y por esto mismo podrá ser mucho más rápida.
Lo mismo sucede con los efectos alpha: el método genérico es útil para multitud de casos, pero si sólo necesitamos un alpha del 50% podremos crear una función específica que será mucho más rápida, claro que esto puede ser muy relativo si la tarjeta aceleradora es TAN buena que incluso su función genérica de alpha es más rápida que una función simplificada e implementada para que la ejecute el procesador, aunque seguramente la transmisión entre memoria de video, RAM y otra vez memoria de video sea el peso fundamental que termine por hacer más lento cualquier edición hecha por el procesador.
Personalmente pude comprobar el peso de tener memorias lentas: mover memoria (bitblt) toma prácticamente el mismo tiempo que aplicar un efecto de transparencia al 50%. La respuesta es que mientras el procesador espera a la lenta RAM, puede darse el lujo de hacer algunas operaciones con sus registros.
¿Alguien sabe en que quedo el "cg" de NVIDIA?
PD.
Lo mejor del direct draw es esto:
if SuperficieRender.lock (@Rectangulo_Origen,lpDDSurfaceDesc,DDLOCK_WAIT,0)=DD_OK then
begin
.....
membase:=lpDDSurfaceDesc.lpSurface;
...
SuperficieRender.unlock(@Rectangulo_Origen);
end
Te da una referencia al sector de memoria donde está la "superficie" gráfica, además de otras variables para navegar por ese bloque contiguo de memoria (ancho, alto, ancho con alineación a n bytes, etc).
"membase" y "posicionActual" son referencias a memoria,
luego tu
" backbuffer[x+y*anchuraPantalla] = color "
sería:
posicionActual:=pointer (integer(membase)+x+y*anchuraPantalla);
si anchuraPantalla es potencia de 2 mejor por velocidad:
(log2anchuraPantalla es una constante)
posicionActual:=pointer (integer(membase)+x+y shl log2anchuraPantalla);
luego para escribir o leer:
miword:=word(posicionActual^ );
milongint:=longint(posicionActual^ );
mibyte:=byte(posicionActual^ );
word(posicionActual^ ):=$09FF;
longint(posicionActual^ ):=$00FFFFFF;
byte(posicionActual^ ):=$09;
PD2. Los primeros 4 "type casting" sólo son para el programador, por respeto a los tipos de datos y para evitar bugs por interpretaciones ambiguas, en realidad no generan código máquina y no se usan en C. Los 6 restantes "type casting" indican tamaños de memoria.