Então nós desenvolvemos as teoriasnós temos maquetestemos o necessário arquitetura… certamente é hora de começar a construir o novo format de UI, certo? Não tão rápido!
É verdade que poderíamos começar agora, mas no horizonte eu já conseguia ver a utilidade crescente de outro recurso de suporte e decidi que period uma boa oportunidade para finalmente automatizar o dimensionamento de fontes do Cogmind.
A Cogmind sempre incluiu muitas fontes disponíveis em muitos tamanhos diferentes, todas elas armazenadas como bitmaps para nitidez perfeita em pixels. Cada uma requer seu próprio arquivo de imagem e, no passado, eu sempre as aumentei manualmente para garantir a disponibilidade nas resoluções mais altas apropriadas, o que significa ainda mais arquivos.
Bem, com o advento de zoom do mapaque por si só precisa de versões 2x mais altas de todas as fontes em cada conjunto, e todo esse projeto de melhoria da interface do usuário, que desbloqueia um aumento médio de 33% no tamanho da fonte para todos, vamos precisar de mais alguns arquivos de fonte bitmap com aumento de escala e, daqui para frente, não faz muito sentido continuar fazendo isso manualmente.
REX, outra vez outra vez
Okay, se alguém estiver contando, esta será a quarto hora de revisitar o motor para uma atualização importante desde que comecei o trabalho de zoom do mapa e dimensionamento da IU xD
Olá, REX.
Achei que seria um projeto rápido, mas na verdade levei vários dias para finalmente terminar esse artigo porque acabei reescrevendo bastante do código de manipulação de fontes do mecanismo, encontrando alguns bugs desafiadores (de arrancar os cabelos) ao longo do caminho. O sistema unique tinha feito muitas suposições que não seriam mais verdadeiras, e eu queria mais recursos além do dimensionamento automático também, como gerar fontes ampliadas somente quando elas forem realmente necessárias (viva a inicialização mais rápida) e ter todos os conjuntos de fontes reutilizando o mesmo arquivo de origem compartilhando uma única imagem de referência na memória em vez de ter várias cópias do mesmo bitmap. Individualmente, nada muito complexo, apenas muitas mudanças necessárias na arquitetura unique para tornar esses recursos possíveis.
Mais uma vez, de volta ao bom e velho ambiente de testes do REX, comecei a testar duas novas opções de sintaxe para o arquivo de configuração do conjunto de fontes:
- “NewFontName (SourceFontName*2)” criaria um novo conjunto de fontes aumentando a escala de um existente, neste caso por um fator de 2. (Um “conjunto” de fontes significa uma coleção de texto, blocos, texto ampliado e assim por diante, todos categorizados sob um único nome e selecionados como uma opção pelo usuário.)
- “
” é um exemplo de sintaxe utilizável em qualquer campo único para uma imagem de origem de fonte de bitmap, em vez de pegar outra imagem e ampliá-la pelo fator especificado.
Este mesmo formato é usado por qualquer outra coisa construída no mecanismo, então tanto o Cogmind quanto o REXPaint podem se beneficiar disso, e espero lançar uma nova versão em breve!
Aplicações Cogmind
O último lançamento público da Cogmind, Beta 12, inclui um complete de 118 imagens de fontes de bitmaps, e isso foi antes todo o zoom do mapa e o trabalho do Beta 13, então sem esse recurso de dimensionamento automático esse número aumentaria significativamente.
No momento em que este artigo foi escrito, o Beta 13 reduziu a contagem de arquivos para 80, apesar do zoom, dos nove novos tipos de fonte e do suporte a ainda mais opções grandes derivadas de opções menores.
Eu tive que passar um tempo revisando todos aqueles arquivos para confirmar quais eram arquivos originais e quais eram ampliados — na maioria dos casos, havia discos, mas eu tinha que ter certeza, e encontrei alguns outliers nos quais fiz mais modificações manuais em suas versões ampliadas, ou obtive de vários conjuntos diferentes. Eles exigiram tratamento especial, mas, de outra forma, foi muito bom reduzir a desordem.
A partir do atual pré-lançamento do Beta 13, o tamanho máximo de fonte incluído no Cogmind é 48, necessário para telas de 5K, mas com a nova IU ampliada, o máximo necessário para essa resolução será 64! Definitivamente, está na hora de obter dimensionamento automatizado…
Deixando de lado os novos tamanhos de fonte, isso também economiza tempo quando novos tiles são adicionados e precisam ser inseridos em todas as imagens, já que os tiles em si também fazem parte dos bitmaps de fonte. Tiles não são adicionados com muita frequência, mas um novo lote está sendo lançado gradualmente nas próximas versões.
Já que eu estava trabalhando com fontes de qualquer forma, também aproveitei essa oportunidade para adicionar opções totalmente novas! No estilo clássico roguelike de terminal, algumas pessoas gostam de trocar sua fonte de exibição depois de um tempo para refrescar toda a experiência, então, além de outras que simplesmente querem mais opções para selecionar sua favorita para legibilidade ou preferências estilísticas, essa é outra boa razão para garantir que haja uma boa variedade de estilos disponíveis.
As duas principais novas fontes são Tamsyn e Cerejadisponível em vários tamanhos.
Enquanto eu estava nisso, também fiz outras melhorias relacionadas a fontes, como ter o menu de opções do Cogmind listando fontes da maior para a menor para poder ajustar o estilo mais facilmente pelo menu sem alterar o tamanho do mapa. A abordagem unique baseada puramente em como elas são listadas no arquivo de configuração não fazia sentido, e não tenho certeza do por que deixei assim por tanto tempo.
Corrupção de Pixels
Emblem após liberar uma construct com fontes autoescaladas para os patronos, um bug selvagem apareceu! Aparentemente, algumas pessoas estavam vendo artefatos no show…
No começo não tínhamos certeza do que period, já que estava afetando apenas algumas pessoas, e otimizações recentes de SDL DLL visando melhorar a velocidade de renderização também tinham sido introduzidas. Mas bugs não são tão elusivos se eles afetam apenas algumas pessoas e um padrão discernível e repetível surge, o que acontece de ser o caso aqui. O fato de esses artefatos aparecerem apenas para jogadores usando resoluções muito altas sugeriu que poderia ser um problema com o dimensionamento da fonte, já que todas as fontes de alta resolução são upscales.
Então, fiz uma série de testes para confirmar e, finalmente, descobri que alguns fontes grandes acabaram com esses artefatos quando dimensionadas e, em todos os casos, tiveram um multiplicador de escala de pelo menos 3. Que estranho!
De qualquer forma, agora está ainda mais claro que isso deve ser algo com o processo de dimensionamento, certo, para o qual eu tinha acabado de conectar SDL_gfxuma biblioteca complementar comum para fazer esse tipo de coisa. Cue percorrendo sua função zoomSurface(), especificamente zoomSurfaceRGBA(), e enquanto comparava como ela lidava com uma operação de escala 2x vs 3x, notei que parece haver… um bug na biblioteca?
Estou um pouco surpreso, pois esta biblioteca tem sido amplamente utilizada por mais de duas décadas e continua sendo usado junto com versões SDL subsequentesmas esse código continua o mesmo. Talvez a maioria das pessoas tenda a usá-lo com suavização/antialiasing ativados (eu o desativei porque quero nitidez), ou estejam usando tilesets menos compactados (ou até mesmo arquivos separados para suas imagens), tudo isso pode ajudar a esconder tal problema da descoberta? Ou talvez haja algo mais em jogo.
Substituí todo esse método otimizado pela minha própria solução de escala de força bruta e *poof* o problema realmente desapareceu. De qualquer forma, ele raramente é chamado — como mencionado antes, as fontes são escaladas somente quando são necessárias pela primeira vez, não antes ou depois, então não precisamos nos preocupar com desempenho. (E qualquer um que realmente exact se preocupar com desempenho provavelmente deveria evitar fazer isso no modo de software program em primeiro lugar 😛 — é provavelmente para lá que todos os outros potenciais localizadores de bugs foram…)
Esta é a quarta parte de uma série de várias partes sobre a construção do format de interface semimodal totalmente ampliado do Cogmind: