Test de mi gameEngine en C++

Todo aquello que no está relacionado con Gemix Studio ni con la programación DIV en general.

Re: Test de mi gameEngine en C++

Postby CicTec » Fri Dec 14, 2018 3:04 pm

Tambien me olvide que falta el sistema de jerarquea, fundamental para la gestion de senales multiples y otras cosas.
User avatar
CicTec
 
Posts: 16554
Joined: Thu Jul 31, 2008 10:18 pm

Re: Test de mi gameEngine en C++

Postby erkosone » Fri Dec 14, 2018 3:10 pm

Ya lo se CicTec, pero si te digo la verdad los priority nunca tuvieron mucho sentido para mi, siempre programé sin ellos y nunca me hicieron falta, muchas veces si que los necesitaba al principio por que no sabia como ordenar de otra manera las ejecuciones del codigo, pero al final entendí como hacerlo y no los necesito.

Sobre el error que tengo ahora mismo.. es por que no se eliminar correctamente objetos de un vector desde el interior de un bucle for que recorre al vector, esto me provoca fallos y tengo que averiguar como hacerlo bien..

osea.. lo que estoy haciendo es basicamente esto:
Source Code (C++) [ Download ] [ Hide ]
  • int iterator = 0;
  • for(auto s : sprites){      // execute batch game sprites..
  •     s->render();
  •     s->frame();
  •                
  •     if(!s->live) {          // check if sprite needs dead..
  •         if(s->body_created){
  •             cpShapeDestroy(s->shape);
  •             cpBodyDestroy(s->body);
  •         }
  •         //sprites.erase( begin(sprites)+iterator );
  •         iterator++;
  •     }
  • }


La linea que tengo comentada es la que me da el crash.. entiendo que cuando elimino un sprite del vector sprites, el tamaño del vector cambia y no solo eso.. los objetos se reordenan.. y esto me provoca casi seguro un acceso fuera de rango o algo peor..

En java este tipo de cosas es automatico pero en C++ hay que ser cuidadoso por lo que me parece..
Estoy buscando la forma de recorrer el vector de procesos y eliminar los que estan marcados con live=false;

Se te ocurre como hacerlo bien y eficientemente? puedo hacer una chapuza.. pero no quiero.. tiene que haber una forma normal de hacerlo.
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Test de mi gameEngine en C++

Postby erkosone » Fri Dec 14, 2018 3:24 pm

Parece que acabo de encontrar la forma de hacerlo.. la verdad es que C++ es un mundo a parte jajajajaa... pero al final no estoy tan pez como pensaba..

Source Code (C++) [ Download ] [ Hide ]
  • int itr=0;
  •             for(auto s : sprites){
  •                 if(!s->live){
  •                     sprites.erase(sprites.begin()+itr);
  •                 }
  •                 ++itr;
  •             }


Ale, creo que lo tengo solucionado!!!
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Test de mi gameEngine en C++

Postby CicTec » Fri Dec 14, 2018 3:28 pm

erkosone wrote:Ya lo se CicTec, pero si te digo la verdad los priority nunca tuvieron mucho sentido para mi, siempre programé sin ellos y nunca me hicieron falta, muchas veces si que los necesitaba al principio por que no sabia como ordenar de otra manera las ejecuciones del codigo, pero al final entendí como hacerlo y no los necesito.

La priority es fundamental, sin esa no podras hacer unas cosas y otras no funcionaran correctamente, si quieres implementar un sistema de procesos hay que implementarlo, sino olvidate del sistema de procesos.

erkosone wrote:Sobre el error que tengo ahora mismo.. es por que no se eliminar correctamente objetos de un vector desde el interior de un bucle for que recorre al vector, esto me provoca fallos y tengo que averiguar como hacerlo bien..

osea.. lo que estoy haciendo es basicamente esto:
Source Code (C++) [ Download ] [ Hide ]
  • int iterator = 0;
  • for(auto s : sprites){      // execute batch game sprites..
  •     s->render();
  •     s->frame();
  •                
  •     if(!s->live) {          // check if sprite needs dead..
  •         if(s->body_created){
  •             cpShapeDestroy(s->shape);
  •             cpBodyDestroy(s->body);
  •         }
  •         //sprites.erase( begin(sprites)+iterator );
  •         iterator++;
  •     }
  • }


La linea que tengo comentada es la que me da el crash.. entiendo que cuando elimino un sprite del vector sprites, el tamaño del vector cambia y no solo eso.. los objetos se reordenan.. y esto me provoca casi seguro un acceso fuera de rango o algo peor..

En java este tipo de cosas es automatico pero en C++ hay que ser cuidadoso por lo que me parece..
Estoy buscando la forma de recorrer el vector de procesos y eliminar los que estan marcados con live=false;

Se te ocurre como hacerlo bien y eficientemente? puedo hacer una chapuza.. pero no quiero.. tiene que haber una forma normal de hacerlo.

Porque como te dije anteriormente no puedes hacer todo en un bucle, hay que dividir, sino las cosas no funcionaran correctamente...

un sistema de procesos y rendering DIV hace:
1. recorrer todos los procesos para averiguar si tienen senal S_KILL o no, si tienen senal se eliminan y se quitan de la lista
2. recorrer todos los procesos que quedan despues el punto 1 para ordenarlos por priority.
3. recorrer todos los procesos que quedan despues el punto 2 checkeando si el proceso no es congelado o durmiente (para una correcta gestion de los segnales), en este caso lo ejecuta (codigo y/en frame)
Estos tres puntos terminan la ejecucion de los procesos, despues hay:
4. recorrer todos los objetos graficos (sprites, textos, primitivas, etc...) y ordenarlos por Z.
5. recorrer todos los objetos graficos ordenados en el punto 4 para renderizarlos.
Estos dos puntos se encargan del rendering (procesos y no), luevo se vuelve al punto 1 y se repite hasta no terminar el programa o a eliminar todos los procesos del programa.

Un proceso cuando viene creado y eliminado tiene que setear correctamente su jerarquea para que no haya crash/errores en ejecucion.

Tu actualmente tienes un solo bucle haciendo ejecution y rendering y no es correcto, tienes que implementarlo en 5 puntos como te indique, con cual tipo de implementacion eso lo veras tu.

Considera que una vez tenido eso tu programa bajara tambien sensiblemente de FPS, y mas procesos crearas en el program, mas sera fuerte la baja, pero almenos tendras un sistema correcto que se pueda definir como procesos estilo DIV.
User avatar
CicTec
 
Posts: 16554
Joined: Thu Jul 31, 2008 10:18 pm

Re: Test de mi gameEngine en C++

Postby erkosone » Fri Dec 14, 2018 7:18 pm

Ok CicTec lo tendré en cuenta, pero ya te digo que el priority para mi forma de programar me parece un retraso y perdida de performance, siempre lo he implementado de una forma mas simple y funciona igual de bien.
Lo hice en java/processign y luego en js, y ahora estoy intentandolo en C++, de hecho ya lo he conseguido hace una media hora, ahora solo me queda gestionar la memoria residual de los shapes y los body liberados de la chipmunk.

Ya te digo, que lo que tu comentas es lo ideal, pero es lento y se puede esquivar facilmente jugando solo con las Z y creando un proceso padre que ordena a los procesos que quieres ordenar con priority, así te ahorras todas esas escaneadas de procesos continuamente y el performance es muy superior.

Igualmente gracias por la info, me viene muy bien saber todo esto :)
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: Test de mi gameEngine en C++

Postby CicTec » Fri Dec 14, 2018 7:20 pm

erkosone wrote:Ya te digo, que lo que tu comentas es lo ideal, pero es lento y se puede esquivar facilmente jugando solo con las Z y creando un proceso padre que ordena a los procesos que quieres ordenar con priority, así te ahorras todas esas escaneadas de procesos continuamente y el performance es muy superior.

Igualmente gracias por la info, me viene muy bien saber todo esto :)

No lo puedes esquivar, la priority es para la gestion de los procesos, la Z para la gestion del rendering, son dos cosas diferentes, luego haz como prefieras.
User avatar
CicTec
 
Posts: 16554
Joined: Thu Jul 31, 2008 10:18 pm

Re: gameLibZeroCPP [game engine] open source.

Postby OskarG » Sun Dec 16, 2018 4:45 pm

Pregunta tonta...todavia no he visto los videos ahora los miro,estoy liado con una cosa que voy a colgar...¿?¿?...ya se puede hacer un juego con scrolls?¿?que limitaciones tengo en este momento??
User avatar
OskarG
 
Posts: 612
Joined: Tue Jan 12, 2010 2:12 am

Re: gameLibZeroCPP [game engine] open source.

Postby erkosone » Sun Dec 16, 2018 4:56 pm

Se puede, y con muchisimas features ya que raylib tiene algo llamado camera2D que es bastante potente por que te deja hacer practicamente de todo lo que haces en gemix con destination directamente en el render principal.
Peor gameLibZero ahora mismo no tiene scroll jeje, es el paso que estoy haciendole ahora.

Ahora mismo estoy integrando ya de forma nativa las funciones:

startScroll();
stopScroll();
y todas sus propiedades..

Para los scrolls como los de gemix así sencillos de manejar dame unos dias mas :P
User avatar
erkosone
 
Posts: 10654
Joined: Tue Feb 24, 2009 2:13 pm
Location: Barcelona.

Re: gameLibZeroCPP [game engine] open source.

Postby OskarG » Sun Dec 16, 2018 4:59 pm

Gracias. por la info.....entonces me espero ....
User avatar
OskarG
 
Posts: 612
Joined: Tue Jan 12, 2010 2:12 am

Re: gameLibZeroCPP [game engine] open source.

Postby Hokuto7 » Sun Dec 16, 2018 5:00 pm

Vamos al lio. :)
User avatar
Hokuto7
 
Posts: 1397
Joined: Mon Aug 28, 2017 10:14 am

PreviousNext

Return to Offtopic

Who is online

Users browsing this forum: No registered users and 21 guests