起因はこれ。
それにしてもESP32やSAMD51等のマイコン向けのコンパイル時にはそれほどメモリ消費しないのに、MSVCでPC向けビルドでは数ギガ単位でメモリ持っていかれるのは何でなのかしら…。 pic.twitter.com/xECr5v6YoM
— らびやん (@lovyan03) 2021年9月15日
(ファイルサイズは増えるが)リテラル文字列を使わなければ効率良いのかも?と妄想しています。
— matsujirushi (@matsujirushi12) 2021年9月15日
(試してはいないです)
この巨大なリテラル文字列をMSVCでコンパイルしようとすると、コンパイル時にヒープ不足が発生(32bitコンパイラ)したり、コンパイル時間がちょー長かったり(64bitコンパイラ)するというもの。
MSVCをイジる、、、という選択肢は無いので、、、 リテラル文字列を数値配列にすれば多少は改善されるのかも?と思い、フォントファイルからCコードを生成するbdfconvを改造して試そうとしました。
ですが、そもそもフォントのあたりよく知らないので、LovyanGFXコードを徘徊することに。
LovyanGFXに同封されているフォントは、lgfx_fonts.hppに列挙されていました。
形式がいろいろとあるみたい。
図にしたのがこちら。
Wio Terminalで、指定フォントで表示を見るコードは、こんな感じでOKでした。 (3_fonts.inoから抜粋。)
#include <LovyanGFX.hpp> static LGFX lcd; void setup() { lcd.init(); lcd.setTextWrap(true, true); lcd.setFont(&fonts::efontJA_10); } void loop() { lcd.setTextColor(random(0x10000), random(0x10000)); lcd.print("Hello"); lcd.print("こんにちは"); lcd.print("你好"); lcd.print("안녕하세요"); lcd.print("Доброе утро"); lcd.print("Päivää"); lcd.print("Здравствуйте"); lcd.println(); delay(3000); }