Das muy poca o casi nada de información de contexto (compilador, s.o., máquina en la que estas realizando tus pruebas, recursos de la tarjeta de video que estás usando, etc)...
Parece que lo estás haciendo para DOS en un compilador de 16 bits. (Por lo lento) Si es así es mejor que trabajes todo en memoria y cuando tengas la escena terminada recien la copias EN BLOQUE a la tarjeta de video, a una "página de memoria" la tarjeta de video que no esté activa. Luego haces el "flip" activando la "página de memoria" donde está tu escena y desactivando la anterior para colocar alli la siguiente escena. (Si es que te permite más de una página
)
Si utilizas directX y tu juego no utiliza aceleración direct3D y quieres que corra a buena velocida en cualquier máquina por muy pobres que sean los recursos de su tarjeta de video: Lo mismo, todo en memoria y al final copias a la superficie de renderizado, luego el flip: en modo cooperativo copiando a la superficie principal y en modo exclusivo realizando el flip. Todas tus superficies, menos la principal, en memoria de sistema. Si dependes de las bondades de la tarjeta gráfica, pues todas las superficies más usadas en memoria de la tarjeta de video (típico cuando utilizas direct3d=> más memoria en video => menos tráfico de y hacia la memoria RAM => mejor rendimiento).
P.D.
La función "putpixel":
A menos que la utilices MUY pocas veces no es buena idea. De todos modos implementando un putpixel primero en ram y luego copiando EN BLOQUE el resultado completo a tarjeta de video es mucho más rápido que poner el pixel directamente en tarjeta de video.