adriano_99 escribió:Jimmyhoo escribió:Las primeras pruebas con DirectX 12 indican un aumento del rendimiento del 400% en tarjetas AMD y 120% en las Nvidia.
es importante aclarar o mejor dicho editar esto para que luego no salga mister xmedia
el aumento no es en el rendimiento grafico sino en la disminucion del overhead de las drawcalls, permitiendo mas drawcalls, el test esta diseñado para utilizar una cantidad altisima de drawcalls en lugar de hacer batches para mostrar todas las naves con unos pocos drawcalls como se haria en un juego comun, en otras palabras DX12 no va mejorar 400% el framerate en juegos, los numeros aplican solamente para el test y es para medir la mejora en el overhead de las drawcalls
Podrías explicarme que es eso si no te es un problema? ( aunque sea por MP por no hacer offtopic)
si mira, cuando un juego esta ejecutandose, este tiene que dibujar en pantalla una serie de cosas, ya sea escenarios en 3d, objetos, personajes, sprites como por ejemplo en juegos 2d o el texto(que son sprites tambien), cuando llega el momento de dibujarlos, se hace una llamada a dibujar(una drawcall), esto es que se hace una serie de llamadas internas para decirle a la gpu que considere dibujar ese objeto en particular, por ejemplo "dibuja este texto en tal posicion con tal color y tamaño", "luego dibuja a mario bros aqui", "luego dibuja cada enemigo", etc y la gpu va armando las cosas, el problema es que librerias como directX/opengl etc tienene una "burocracia" para que finalmente se le de la orden de dibujar a la gpu, esto significa que se pierde un tiempo en cada drawcall, como consecuencia se intenta reducir al minimo el numero de drawcalls, existen muchas tecnicas y pueden variar mucho entre cada juego
el tipico problema es el del texto, en un juego hecho con directx/opengl, cuando vemos texto en pantalla, este en realidad es un pequeño modelo en 3d con una textura que representa un caracter, funciona asi
primero unas definiciones
*textura = un espacio en la memoria de video con informacion, tipicamente en 2 dimensiones, aunque tambien las hay de 1 y 3 dimensiones
*vertice = un punto definido como una coordenada en 3 dimensiones x,y,z, se utiliza principalmente para dibujar triangulos pero se puede usar en otras cosas
*triangulo = comúnmente llamado polígono, es una superficie o cara hecha a base de 3 vertices, este puede se invisible, estar lleno de un color o una tonalidad gradiente, o puede tener una imagen
*UV = un vertice ademas de una coordenada en el espacio en 3d puede tener una coordenada(x,y) dentro de una textura, esto sirve para guiarse sobre que parte de la textura se dibujara en la superficie del triangulo
*modelo en 3d = una serie de vertices y triangulos, generalmente con una coordenada UV, internamente es una lista de vertices, una lista de coordenadas UV y puede tener una lista de indice que que es una lista de triangulos, esto es el triangulo 1 esta hecho con el vertice 1,2 y 3, el triangulo 2 con el vertice 2,3,4
*indice = los indices definen triangulos reutilizando vertices, en un modelo en 3d tipicamente los triangulos estan pegados a otros triangulos por lo que seria redundante repetir vertices, usando indices ahorramos vertices(en modelos grandes) pero gastamos espacio en modelos muy pequeños
digamos que tenemos esta textura
entonces para dibujar un caracter de una palabra necesitamos un "cuadro", este generalmente es un par de triangulos hechos con 4 vertices(si se usa indice) o 6 vertices(si no se usa indice)
cada vertices o esquina de ese cuadro debe tener una coordenada dentro de la textura para traernos el "pedacito" de textura con la imagen del caracter que queremos, una vez definido esto lo podemos mandar a la GPU y entonces podemos hacer una drawcall para dibujar un caracter en pantalla
pero aqui hay un problema, una letra no nos sirve de mucho, generalmente queremos dibujar palabras o incluso un texto entero, si hacemos una drawcall por caracter terminaremos con cientos de drawcalls para mostrar un texto en pantalla y dado que hay una penalizacion por cada drawcall entonces perdemos tiempo y podemos afectar seriamente los frames por segundo, la solucion mas comun es definir varios cuadros(hechos con triangulos) en diferentes posiciones con diferentes UV de cada letra formando una palabra entera o incluso un texto entero y dibujarlo con una sola drawcall o en unas pocas, ya que comunmente se usa una drawcall para usar unas caracteristicas de posicion, rotacion y escala, asi un texto es de un tamaño otro es mas grande pero inclinado, otro color ,traslucido, etc
esto significa que mandamos mucha mas informacion a la GPU que la que haríamos con un par de triángulos, pero el tiempo perdido en la drawcall hace que es mucho mejor mandar mucha informacion de una vez que mandar poca en muchos drawcalls, en general en PC se programa de esa manera
existen otras formas para hacer texto de forma mas rapida mandando poca informacion del texto a la gpu para hacer los calculos en los shaders(que son programas que corren en la gpu) y con una sola drawcall, tambien es posible definir previamente modelos 3d con todo un texto y dejarlos en la memoria de la gpu y solo seleccionarlos para dibujar en lugar de mandarlos, solo que si el texto puede cambiar en cualquier momento es mejor mandar cada vez el texto deseado, esto es un ejemplo de ahorro de drawcalls texto, pero asi como se hace el texto se hacen los juegos en 2D pero usando imagenes de los personajes(sprite sheets)
en el demo de starswarm lo primero que salta a la vista es que no es un juego con graficos demandantes, pero se utiliza deliberadamente una cantidad muy alta de drawcalls(arriba de 100.000) probablemente una por cada nave y por cada efecto, como consecuencia el framerate es muy bajo menos de 10 fps aun en equipos potentes, esto es asi para probar los efectos de mantle y DX12 que aminoran la "burocracia" de las drawcalls y lo reparten en la cpu(para no cargar a un solo core) permitiendo lograr aumentos muy significativos en el framerate como por ejemplo de 8 a 20 frames por segundo, es un porcentage muy alto pero es exclusivo del demo, si se programara como generalmente se hace el framerate seria muy alto aun en equipos poco potentes, pero DX12 y mantle no elevarian el framerate tanto como 400%
ya en los tiempos de la ps2 habia juegos que desplegaban mas de 65.000 objetos repartidos en 2 bandos enfrentados
https://www.youtube.com/watch?v=44KZ0neSz7Esi ese juego se porteara a PC y se hiciera un drawcall por cada enemigo incluso equipos potentes actuales se arrastrarian para mantener 30 fps mientras la PS2 lo corre a 60, pero como no es asi ese juego incluso corre emulado
es importante entender esto por que mucha gente se queda con la idea de que DX12 va a aumentar el rendimiento de forma tan bestial como dice el titular(aunque en la prueba pase de 9 a 30 fps ) para todos los juegos cuando esto no es asi, habra un aumento y bastante significativo pero no asi y en consolas esta prueba no pinta mucho realmente ya que las drawcalls no consumen nada de tiempo, el jefe de desarrollo de metro last light decia que en PS4 en un principio tenian problemas con los benchmarks por que las drawcall no consumian nada de tiempo y no podian encontrarlos en las graficas, en el caso de xbox one si habia un problema con las drawcalls por que decia que habian porteado directx tal cual pero ya debe tener mucho que se resolvio eso, por eso directx12 no pinta realmente nada en consolas, incluso estas tienen un acceso mas rapido de lo que directx12 o mantle permiten, aunqe a las consolas de cierto modo les beneficia ya que los desarrollos pueden cambiar su forma de ver ñas drawcalls y hacer que los ports de PC sean mucho mejores
adriano_99 escribió:Entonces básicamente eso reduciría el popping?
el popping se produce por muchos factores, uno que es que los juegos intentan no mostrar al 100% todo lo que tienen enfrente a fin de ganar recursos, si el objeto no esta dentro del campo de vision directamente no se dibuja, cosas como los objetos 3d y texturas, se intercambian por versiones similares pero mas sencillas, si un objeto se aleja de la camara su modelado se cambia por uno mas basico, las texturas de los escenarios y objetos se les crean(tambien se puede hacer manualmente) texturas de menor calidad reduciendo su tamaño(generalmente a la mitad cada paso) al punto de llegar a un pixel, estos son los mip-maps, si un objeto se aleja de la camara se cambia por uno de menor poligonaje y texturas el sulo cambia los mipmaps, tambien hay un espacio de vision cuando un objeto se aleja demasiado llega el punto en el que desaparece, solo que esto se disfraza por que un objeto lejano nos parece mas pequeño y de esa manera es mas dificil ver el cambio de calidad, tambien se genera popping cuando se hace un streaming(ir sacando datos del disco duro/dvd) a veces segun la situacion esto no se puede hacer muy rapido y aparecen objetos 3d o algunas cosas como texturas de mas calidad van apareciendo(muy comun en juegos con unreal engine)
en general los desarrolladores intentan que esos cambios sean sutiles algunos usan tecnicas muy elaboradas(como cambiar objetos muy lejanos por "billboards" que son como los sprites) a fin de que el campo de vision se aprecie muy amplio sin ser tan notorio el cambio de calidad de los objetos