Arduino Can!
There is library for software color VGA (640x480x60) output on Arduino - github smaffer/vgax
But, by frequency of 16Mhz Arduino can produce not faster then 1:5 px so software resolution was only 128px width.
You can flash alternate core Конструктор Bootloader`а для Arduino and clock arduino to ATMega standart 20Mhz mode, it produce not much bigger - 1:4 zoom 160px width.
- and this can take not so universal compatible with timing critical libraries (this core fixes basic PWM, Serial, etc functions but not third software)
But i found another way to radical clock the signal. Without clock the arduino. You can add simple but fast BJT comparator by this schematic: https://www.falstad.com/circuit/circuitjs.html?cct=$+1+0.000005+14.235633750745258+54+5+43
t+240+160+240+192+0+1+-9.148915590723593+-4.999999996545533+100
t+240+288+240+256+0+-1+-0.23550799392262536+-0.6538718449901015+100
r+256+192+304+192+0+470
r+256+256+304+256+0+470
r+240+160+240+112+0+30000
r+192+112+192+160+0+50000
w+240+288+192+288+0
w+192+160+192+288+0
w+224+192+128+192+0
R+304+256+320+256+0+1+7+2.5+2.5+0+0.5
R+240+112+320+112+1+2+200+5+0+0+0.5
R+304+192+320+192+0+1+13+2.5+2.5+0+0.5
g+128+192+96+192+0
w+224+192+224+256+0
w+192+112+240+112+0
o+12+32+0+4099+0.0000762939453125+0.0125+0+2+12+3
(it was tested)
then you can clock this by PWM 8Mhz signal so (google stackexchange "Arduino constant clock output")
(schematic use complementary BJT so it freq was doubled and get 16Mhz at real. By the way 16Mhz arduino can produce only 8Mhz bitbanging by it self. Because of instruction timings of copy the data from RAM was 2 tick, But if calculate bit speed it was 8bit per 8Mhz or 1bit/64Mhz theoretical maximum. Very difficult to sync timing from external clocks but you can easy clock by Arduino it self by use 8Mhz PWM or by get 16Mhz reference frequency by switch fuse bits to become it to reset pin - with 20Mhz Arduino you can produce 2bitPer40Mhz bit bang by cascade of BJT comparators and in produce exact 640px width with CGA like 4colors ) But...
Much actual was 4bitPer16Mhz bitbang on classic Arduino with 1-4 BJT comparators (for 2-16 colors respectively) Because of you still have the problem with memory of 2Kbytes, and it cant to store frame buffer even for monochrome, however you can easy store tile-based information, and it make unimportant 2 or 16 colors you will use. But you need much time for tile engine.
So how found this time, if you need to bitbanging realtime? - Exactly not continuous!
The first fact is that VGA signal breaks on ray back porch by 10% of line time
(in 640x480x60 signal it happens 480x60= 28800 times, so it can used for another synthesis 28.8Khz Audio and/or PS/2 peripheral read and/or slow UART serial)
2nd fact - That your soft resolution width 1:2 zoom aspects to height same 1:2 (or you can use ever 1:3)
so tiles line need to render once per 2 - 3 times writing to the port.
3rd - you can interlace soft rendered lines tice to 30Hz frame and it still insensibly (this was tested to)
It down tile renderer limitations to once compute per 4-6 real lines (copy byte from ROM on Arduino need 3 tick. With SO much time you can done ever sprites, if you need)
(in fact you can interlace ever trice to 20Hz and it stil ok, but a little blinky and fade)
4th fact is that VGA signal has vertical back porch 20% pause of all time - these guarantee that you have 20% of all CPU time for logic
5th fact after that render will work is that you can store 10x more graphics in ROM
(you can ever allow sort animations like 3-frame old "Kings Bounty")
6th is that if you load in you ROM it 8x6 symbols you can render 25x40 byte charters with 1Kb memory frame bufer - witch is standart CGA terminal! - and that was really practical case!
So if somebody tells me that Arduino is week microcontroller, i sad that week the newbies geeks.
Somebody Olds who know AVR, write for them game engine already. It was "arduino Unity3d" exact all thay whant.
By the way 3d... Arduino Can raycast Doom-like 3d, if you rotate the monitor 90deg for the VGA lines turn to down-to-up columns
Arduino Can!