elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


  Mostrar Temas
Páginas: [1] 2
1  Programación / Programación C/C++ / Mi programa WINAPI se come el 100% de la CPU. ¿Como lo reduzco? en: 12 Octubre 2020, 15:57 pm
Buenas.

He estado programando un visualizador de imagenes muy simple usando WINAPI, stb_image.h y (en la ultima version) OpenGL.

Mi codigo parte de este que encontre aqui: https://nehe.gamedev.net/tutorial/creating_an_opengl_window_(win32)/13001/

El caso es que usando unicamente WINAPI el programa sufre unos FPS terribles. Con OpenGL los FPS aumentan ligeramente, pero sigue ser fluido.

He notado que otros programas no usan ni el 5% de CPU. Tal vez el 5% de un unico nucleo. Pero mi programa se come el 25% de la CPU (Core i5 9400f). El 100% de un nucleo.

Y cuando me ha dado por mirar el rendimiento del programa en el que me basaba para hacer el mio (el del link de arriba), la CPU hace exactamente lo mismo. Y lo mejor, la grafica (ASUS RX570 ROG Strix 8GB OC) se pone al 100% para dibujar unicamente un punto en pantalla.  :xD

Por lo que veo hasta mi antiguo motor de juegos basado en OpenGL (estoy en proceso de actualizarlo para usar GLSL y mas adelante Vulkan) me dispara el consumo de CPU.

Pues eso. Que no sé por donde tirar. ¿Como reduzco el consumo de CPU de mi programa?

Toda ayuda es bienvenida.

PD: No sé manejar multihilos (aun), así que si podemos descartarlo como parte de la solucion, mejor.
2  Programación / Programación C/C++ / Punteros en estructuras en: 31 Octubre 2019, 18:27 pm
Estoy desarrollando alguna cosilla y utilizo una estructura similar a la siguiente para almacenar y manejar datos en binario.

Código
  1. struct datos {
  2. void *data;
  3. unsigned int length;
  4.  
  5. datos();
  6. void operator=(datos rDatos);
  7. ~datos();
  8. }
  9.  
  10. datos::datos() {
  11. data = NULL;
  12. length = 0;
  13. }
  14.  
  15. void datos::operator=(datos rDatos) {
  16. if (rDatos.length > 0 && rDatos.data != NULL) {
  17. length = rDatos.length;
  18. data = new unsigned char[length];
  19. if (data != NULL) {
  20. for (unsigned int a=0; a<length; a++) {
  21. ((unsigned char *)data)[a] = ((unsigned char *)rDatos.data)[a];
  22. }
  23. }
  24. }
  25. }
  26.  
  27. datos::~datos() {
  28. if (data != NULL) {
  29. delete[] (unsigned char *)data;
  30. }
  31. }
  32.  

Si hago algo como lo siguiente, se me cierra el programa con un error.

Código
  1. datos miVariable;
  2.  
  3. // Despues de ponerle datos a la variable....
  4.  
  5. miFuncion(miVariable);
  6.  

El caso es que he visto que el problema desaparece cuando el destructor de la estructura no elimina el buffer de datos. Y eso me va a llevar inevitablemente a llenar la memoria. O sino, me lleva a estar pendiente de liberar la memoria en cada programa que haga uso de mi pequeña libreria.

¿Porque ocurre esto? ¿Como puedo hacer correctamente el operador de copia y el destructor de la estructura para manejarlo como una variable mas? (O al menos como un string, por ejemplo)

Muchas gracias por adelantado.
3  Programación / Programación C/C++ / OpenAL no me abre el dispositivo elegido en: 8 Marzo 2019, 05:23 am
Muy buenas a todos.

Estoy teniendo un problemilla tecnico con un programa (mas bien libreria) que estoy haciendo. Intento poder elegir los altavoces (o auriculares) por los que emito los sonidos.

OpenAL puede abrir el dispositivo de salida por defecto cuando se lo pido a él usando "alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER)". Sin embargo, cuando obtengo el nombre del dispositivo con WinAPI y se lo paso a OpenAL para que abra ese, no lo hace.

¿Porque? No lo sé. Solo sé que el dispositivo por defecto OpenAL dice llamarlo como "Generic Hardware".

Os pongo un codigo de ejemplo para que veais el proceso que sigo y me digais como hacer que OpenAL me saque el sonido por el dispositivo de salida que elija yo.

Código:

#include <windows.h>
#include <AL/al.h>
#include <AL/alc.h>
#include <iostream>
using namespace std;

int main() {
int speakerID = 0;

WAVEOUTCAPSA outCaps;
waveOutGetDevCaps(speakerID, &outCaps, sizeof(WAVEOUTCAPSA));

ALCdevice speaker = alcOpenDevice(outCaps.szPname);

if (speaker == NULL) {
cout << "No se ha podido abrir el dispositivo de salida indicado." << endl;
}

return 0;
}


Sé que la funcion "waveOutGetDevCaps()" me devuelve un nombre supuestamente valido porque es el mismo que me da un programa de karaoke.

Ademas, ya tengo desarrollada la parte del uso del microfono y funciona correctamente usando el mismo procedimiento pero con sus respectivas funciones.

¿Que hago mal? ¿Tengo que incluir alguna DLL para que el programa funcione correctamente? (Por ahora solo uso "OpenAL.dll" y "wrap_oal.dll".) ¿Estar usando un ordenador portatil puede ser un problema? (Lo digo por el uso de altavoces u auriculares.)

Un saludo y gracias de antemano.
4  Programación / Programación C/C++ / Lidiar con archivos largos en C++ en: 2 Noviembre 2018, 14:07 pm
He terminado un programa y me he topado con un par de bugs.

Uno de ellos tiene que ver con obtener el tamaño de un archivo. Utilizo el siguiente codigo para obtener el tamaño del archivo:

Código
  1.  
  2. #define __USE_FILE_OFFSET64
  3. #define __USE_LARGEFILE64
  4. #define __USE_LARGEFILE
  5.  
  6. // Mucho codigo despues...
  7.  
  8. unsigned int getFileSize(string fileName) {
  9.    unsigned int tempReturn = 0;
  10.  
  11.    FILE *temp = fopen64(fileName.c_str(), "rb");
  12.  
  13.    if (temp != NULL) {
  14.        feeko64(temp, 0, SEEK_END);
  15.        tempReturn = ftello64(temp);
  16.        fclose(temp);
  17.    }
  18.  
  19.    return tempReturn;
  20. }
  21.  
  22.  

El caso es que pese a usar "fopen64()" e incluir los "#define" para usar archivos largos, no supera los 2GB. Estoy haciendo pruebas con un archivo de 2,7GB y me dice que el tamaño es de 2GB.

¿Alguna idea de como puedo solucionarlo?

Lo incluyo todo correctamente y el compilador no me da ningun error. ¿Tendría que añadir algun parametro mas a la orden de compilado?

Uso ubuntu y codeblocks. Supongo que esto es portable a Windows y para mi proximo proyecto necesito dejarlo zanjado porque lo desarrollaré para ambos sistemas operativos.
5  Sistemas Operativos / GNU/Linux / Problemas con mi hercules ecafe slim hd en: 25 Octubre 2018, 13:00 pm
Despues de haberlo abandonado al olvido cuando adquirí un portatil mas potente hace ya años, me acordé hace tan solo unos dias de que tenía por casa una maquina de consumo electrico relativamente bajo.

Hace unas semanas terminé escribiendo un programa que no requiere potencia, sino tiempo para llevar a cabo sus tareas. Fue entonces, cuando buscando la forma de dejar funcionando el programa durante horas con el menor consumo electrico posible, recordé tener a mano algo similar a una raspberry pi.

Esta maquina se le parece bastante en especificaciones si no contamos con pantalla, teclado, touchpad, bateria....

El caso es que despues de mas de 5 años el fabricante ya no parece darle soporte. Cuando ejecuto un "sudo apt-get update" me aparecen un porron de alertas diciendo que no puede descargar los paquetes desde una web que tiene pinta de ser del fabricante. Eso claramente es un problemon.

Aparte de intentar instalar el compilador g++ y no conseguirlo, he conseguido compilar en otra maquina el programa para este portatil y que "funcione". El tema es que ahora me aparece como que no tengo instalado el paquete "libstdc++6". Lo he intentado instalar y nada. Me dice que no hay nada que descargar ni instalar.

Hasta ahora he manejado varias opciones que no consigo saber como llevarlas a cabo y cada cual me gusta menos pero tiene pinta de que voy a tener que hacerlas para solucionar los problemas que se me presentan. ¿Que hago?
- Instalarle otro sistema operativo linux no tan capado como el que incluyó el fabricante.
- Cambiar las direcciones de busqueda de paquetes con "sudo apt-get install" para instalar desde las fuentes originales de linux.
- Solucionar solo los problemas que me presenta por ahora el sistema operativo capado y solucionar mas adelante los que se me vayan presentando.

Como comprendereis, prefiero instalar un sistema operativo linux sin limitaciones del fabricante para poder usar la maquina sin muchos mas problemas en el futuro.

¿Me podeis ayudar? ¿Que debería hacer? ¿Por donde debería empezar?

Ya intenté instalar una version de Ubuntu para ARM desde una tarjeta SD booteable. No conseguí nada. La maquina se apagaba automaticamente al no encontrar ningun sistema operativo para cargar.
6  Programación / Programación C/C++ / ¿Como compilo ejecutables en ubuntu? en: 23 Octubre 2018, 16:21 pm
Estoy familiarizado con el comilador g++ que trae Ubuntu. Sé que puedo ejecutar un programa compilado con la terminal desde la propia terminal.

El caso es que lo quiero tener tan facil como hacer doble click. Por el programa que por fin he terminado, por el programa que estoy haciendo ahora y los programas que vaya a hacer en el futuro.

Sé que puedo hacerlo con g++. Compilar en la terminal y obtener un programa que se vé como un rombo morado es algo que hice a modo de pruebas y a dia de hoy no recuerdo cual fue la orden que utilice. Ni siquiera recuerdo donde encontré las instrucciones al respecto. Solo sé que no he vuelto a encontrarlo ni a compilarlo obteniendo un ejecutable con el icono del rombo morado.

¿Cual es el parametro que tengo que poner a g++ para que compile mi codigo C++ creandome un ejecutable que aparece como un rombo morado en el explorador de archivos? ¿Es indispensable hacer la compilacion en dos ordenes haciendo primero el archivo ".o"?

Por ahora solo son programas de consola. No sé si esto es un problema. ¿Puede que una actualizacion haya cambiado algo de g++ impidiendo hacer ejecutables tan facil como antes?
7  Programación / Programación General / Limites de instrucciones en los metodos de java para Android en: 10 Octubre 2018, 18:27 pm
Hace ya bastante tiempo desarrollé una version de pruebas de mi motor de juegos para Android. La idea era comprobar la viabilidad de desarrollar un motor de juegos en Android Studio cuyo funcionamiento fuese muy similar al que ya logré en C++ o en javascript.

Por supuesto encontré algunos obstaculos y algunas capacidades extra que por ejemplo javascript no me podía ofrecer (al menos en entorno web).

Una de las partes que me chocó fue hacer una funcion (o metodo) tan larga que me saltó el siguiente mensaje al compilarlo: "I/art: Method exceeds compiler instruction limit: 17940 in boolean miFuncion(int)". Al parecer no salta siempre. Solo cuando la funcion supera cierto punto en la ejecucion de sus instrucciones.

Al final el juego se ejecuta, pero hay ciertas instrucciones de la funcion que jamas llegarán a cumplir su objetivo. ¿Alguna sugerencia? ¿Alguna que no implique hacer un conjunto de funciones mas pequeñas y complicar mas aún el codigo fuente?

Supongo que se puede configurar el compilador para no tener ese limite ya que si se tratase de un error propiamente dicho ni siquiera me daría el juego compilado.

Debo añadir que en lugar de crear clases y metodos me lié a hacerlo todo con un solo script y como consecuencia tengo un codigo fuente de mas de 5000 lineas que a Android Studio le cuesta un poco procesar con un Core i3 para colorear las fuentes y demas. ¿Eso puede ser un problema? Aunque la programacion podría considerarse que no esta orientada a objetos, el funcionamiento del motor es simple ya que funciona casi como una maquina de estados. Me basé en OpenGL ya que así lo veia mas facil.

En resumen: me alarma mucho que una funcion larga impida el correcto funcionamiento del juego final. ¿Hay alguna forma de evitarlo? ¿Alguna que sea facil, no implique dividir la funcion en funciones mas pequeñas y que tampoco implique crear un proceso en segundo plano?

Un saludo y gracias.
8  Programación / Programación C/C++ / Detectar conexion perdida con los sockets en: 30 Septiembre 2018, 14:07 pm
Buenos dias.

Estoy tratando de hacer un programa para conectarse a internet y recibir los datos de una URL por medio de los sockets. Todo programado a lo "bestia". (Usando los sockets directamente sin librerias que me lo faciliten)

El caso es que haciendo pruebas me he dado cuenta que el programa tarda muchisimo en darse cuenta que la conexion se ha perdido. Supongo que eso es bueno para conexiones lentas. Para que la espera prolongada de una respuesta con una conexion lenta no sea sinonimo de desconexion. Pero yo quiero que no tarde tanto. Sobre todo cuando descargo una pagina web desde una URL cuyo header no indica el tamaño de lo que va a descargar.

¿Como detecto la desconexion del socket o la perdida de la conexion del equipo a internet?

Para las pruebas uso ubuntu, programo en C++, uso el comando "select()" para usar sockets no bloqueantes (este comando es totalmente nuevo para mi) y uso el movil para dar wifi al portatil. Para forzar la perdida de conexion del programa apago la zona wifi del movil. Aún no he logrado que esta forma de forzar la desconexion haga que mi programa deje de intentar seguir recibiendo datos. (Lo he dejado en bucle con "select()" y un contador durante mas de 10 minutos. No se ha bloqueado, pero tampoco ha detectado la perdida de la conexion.)

Un saludo y gracias de antemano.
9  Programación / Java / Duda: ¿Como hago esto en Java? en: 20 Diciembre 2017, 15:06 pm
Muy buenas.

Por la razón que sea he empezado a programar en Java y tengo una duda al respecto. En C++ podía hacer algo como lo siguiente para hacer una programación final mas adaptable:


Código
  1. // Codigo para usar como parte de una libreria
  2.  
  3. void (*funcionLibreria)(int value);
  4.  
  5. void asignarFuncionLibreria(void (*funcionAsignada)(int value)) {
  6. funcionLibreria= funcionasignada;
  7. }
  8.  
  9.  
  10. // Codigo para desarrollar en un proyecto
  11.  
  12. void funcionDefinidaPorMi(int value) {
  13. // Codigo de la funcion en cuestion.
  14. }
  15.  
  16. // Algo de codigo despues...
  17.  
  18. funcionLibreria(5);
  19.  
  20.  

¿Como puedo hacer algo así en Java?

He buscado algo para Java, pero solo encuentro callbacks que me parecen mas difíciles de usar. Sino, lo único que encuentro es para javascript.

Quiero desarrollar una librería que ya sé que va a ser muy larga y rebuscar en el código Java para adaptarlo a cada proyecto me parece una locura.

Me sería de gran ayuda. Gracias de antemano.
10  Programación / Programación C/C++ / Funciones con argumentos OR: ¿Como? en: 1 Junio 2016, 13:10 pm
¿Cual es el codigo necesario para disponer de una funcion que lee varios argumentos? Tengo entendido que se puede llamar a funciones como "glutInitDisplayMode()" y que se pueden pasar varios argumentos separados por "|".

He buscado sobre el tema y he visto que en la definicion de la funcion el argumento es "unsigned int mode", pero no he encontrado nada mas. ¿Como hace la funcion para separar los argumentos que se le pasan? ¿Tiene algo que ver que los valores que recibe sean potencias de 2? (0,1,2,4,8,16,32,64,...)

No me urge, pero me gustaría entenderlo por si en un futuro me ayuda a reducir un codigo extenso.
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines