Meu laptop tem uma boa GPU com RAM de vídeo dedicada. Mas notei jogando Minecraft que o computador parece não estar usando para nada. Apenas cerca de 100 MB são usados de acordo com o Gerenciador de Tarefas do Windows, enquanto consome cerca de metade da minha RAM normal.
Eu pensei que a VRAM seria usada para armazenar modelos, texturas e outras coisas, o que reduziria a demanda de RAM normal; se for verdade, as texturas e modelos devem ser bem menores do que eu pensava. (observe que esta é uma instalação altamente modificada, com modelos e texturas muito mais complexos do que o Minecraft padrão.)
Se não for verdade, para que serve a VRAM? Existe alguma maneira de fazer com que meu computador faça um melhor uso dele?
A RAM de vídeo foi projetada especificamente para armazenar tudo o que for necessário para renderizar um quadro de vídeo. Ao jogar, isso inclui texturas, modelos e outros dados específicos de gráficos, como informações de sombreamento e mapas de iluminação. Geralmente, nenhum desses dados é armazenado na RAM do sistema principal, como você mencionou, embora a VRAM não seja projetada especificamente para reduzir a demanda da RAM regular.
O Minecraft é um animal um pouco diferente da maioria dos jogos. Presumo que você esteja jogando a versão Java para PC. Java é uma linguagem de programação (relativamente) de alto nível em comparação com outras, como C ou C++, nas quais outros jogos geralmente são escritos. Por causa disso, Java está inerentemente em desvantagem quando se trata de requisitos de uso de memória. É por isso que a memória principal do sistema sofre um impacto tão grande ao executar o Minecraft, um programa com muitos recursos escrito em Java.
Não estou surpreso que o uso de RAM de vídeo seja baixo - e, sinceramente, você também não deveria. Como ele serve apenas para armazenar texturas e modelos, e o Minecraft é, enfim, um jogo baseado em cubos e texturas 16x16, acho que dá para perceber porque o uso de VRAM é tão baixo.
O Java Minecraft é pesado para a CPU, mas a GPU realmente tem muito pouco a fazer, em termos de gráficos é muito simples e os recursos gráficos são muito pequenos em comparação com… Call of Duty. Quando digo pequeno, quero dizer muito pequeno, 100 MB parece certo.
Por causa do design de “bloco” do jogo, você pode preencher a tela com relativamente poucos recursos necessários. É como usar “Duplo Lego” em vez de “Lego Technics”.
Java é uma linguagem “interpretada”, o que significa que não é compilada em instruções nativas. Portanto, quando é executado, ele precisa de uma máquina virtual para obter as instruções (ou bytecode) em algo que o processador entenderá. Sua CPU está fazendo mais trabalho do que a GPU.
A VM Java, como a usada no Minecraft, parecerá estar usando muita RAM devido à maneira como reservará grandes blocos de RAM do sistema antes de usá-la . Isso parece ao sistema operacional como o aplicativo realmente usando tanta RAM. O Java usa seu próprio Heap de memória, que funciona de forma independente do sistema operacional no qual está sendo executado. (ainda usará chamadas para aumentar o Heap)
O carregamento de textura no minecraft é bastante baixo. O que também pode estar acontecendo é a maneira como seu driver OpenGL está alocando texturas. Por exemplo, no OpenGL 3.3, os buffers da GPU podem ser mapeados para a memória, de modo que uma gravação e uma descarga subsequente nessa seção de memória façam com que ela apareça automaticamente dentro da VRAM da GPU. A parte complicada disso é se esse buffer está realmente apenas no lado da GPU ou se está realmente no lado da CPU e da GPU e o driver está simplesmente copiando-o de um buffer para outro. A especificação OpenGL diz que o driver pode fazer a seu critério. O resultado é que o lado da CPU/Java aloca muito espaço de endereço para o buffer e podemos ter duas cópias do buffer: uma no lado da CPU e outra no lado da GPU.
Também é possível que o programa java ainda esteja armazenando as imagens na RAM em seu próprio cache e, em seguida, carregando/descarregando para/da GPU conforme necessário. Isso exigiria que o uso de RAM fosse sempre pelo menos o mesmo, se não maior do que o uso de VRAM.
Drivers de vídeo e iterações mais recentes do OpenGL oferecem suporte à arquitetura HSA , que permite que o VRAM atue como um cache - o programa nem mesmo "carrega" uma textura para a GPU - ele simplesmente passa um endereço de memória para uma textura já carregada ou até mesmo referencia a textura de um arquivo que foi alocado na memória virtual. Isso torna a avaliação do uso de recursos mais difícil porque agora, em vez de simplesmente usar RAM ou VRAM, podemos estar usando apenas faixas de endereço de memória em alguns casos, e algumas dessas faixas podem ser atribuídas à RAM e outras ao disco, e a VRAM pode parecer ilimitada ou zero usado, pois, como cache, ele armazena apenas páginas usadas recentemente que podem ser alteradas arbitrariamente!
Eu gostaria de apontar algo. As placas gráficas modernas podem processar uma grande parte do Minecraft na própria placa. Sistemas como PhysX tentam fazer exatamente isso - CUDA, OpenCL etc. Consequentemente, isso aumentaria o uso de VRAM.
Aqui estão algumas coisas que poderiam facilmente (relativamente falando) ser transferidas para o driver gráfico:
No entanto, o processamento da GPU em uma linguagem shader (GLSL, HLSL, SPIR-V) é muito mais difícil e sujeito a erros do que uma linguagem de alto nível como Java. Assim, todas essas coisas são executadas na CPU.
Embora vários jogos tenham implementado um pouco disso em GPUs antes, o Minecraft não tinha o grande pool de recursos qualificados que os títulos AAA têm.
A matemática
Suponha que o Minecraft use um esquema de cores de 32 bits.
Em resumo, você pode armazenar aproximadamente 24.414 blocos de 16 x 16 em um recurso de imagem descompactado de 32 bits na VRAM.
Este exercício realmente me ajudou a compreender por que Factorio tinha problemas com suas folhas de sprite