Можно ненамного дороже купить китайскую плату на Zynq 7010 — за $47.4
QMTECH Xilinx Zynq7000 Zynq XC7Z010 SoC FPGA Starter Kit Development Board
Получаем два ядра ARM Cortex-A9 667MHz, 64MB SDRAM (правда, с 16-bit интерфейсом).
FPGA часть гораздо жирнее — 28K LE
Куча сигналов выведено на два разъема: 40+50 pins
По возможностям похоже на Digilent Cora Z7-10, но в два раза дешевле.
Один минус — не разведена поддержка встроенного ADC, как в Cora. Но с таки количеством свободных ножек можно и внешний ADC повесить.
Похожий принцип используется в аналоговых терменвоксах для управления громкостью (выходное напряжение — управляет VCA).
Но даже там вместо RC генератора используется используется LC для большей чувствительности.
Потестировал D (vibe.d) по сравнению с Go.
На Windows 7 x64 — vibe.d собранный DMD под x86 чуть быстрее Go только если выбрана конфигурация vibe.d libevent. Иначе в два раза медленней.
На Linux x86_64 — vibe.d собранный DMD и в default конфигурации и в libevent показывает 45K запросов в секунду, a Go — 50K запросов. Но зато D использует 90% CPU, a Go — 120%.
Теоретически сборка Vibe.d с помощью компилятора LDC вместо DMD должна показать лучшие результаты. Проверить пока не получилось.
Если сигнал объявлен как
Signal!OnClickHandler — то можно вешать несколько обработчиков, с помощью connect и отключать из с помощью disconnect. Присваивание отсоединяет все подключенные слоты и заменяет их одним новым. С помощью ~= новый слот добавляется к имеющимся (аналог connect), -= отключает (то же, что disconnect).
Если объявлен как
Listener!OnClickHandler — то возможено подключение только одного слота
Listener используется вместо Signal там, где хочется сэкономить память ценой урезания функциональности (Listener в два раза меньше занимает памяти, чем Signal).
import dlangui.core.signals;
interface SomeInterface {
bool someMethod(string s, int n);
}
class Foo : SomeInterface {
override bool someMethod(string s, int n) {
writeln("someMethod called ", s, ", ", n);
return n > 10; // can return value
}
}
// Listener! can hold arbitrary number of connected slots
// declare using list of return value and parameter types
Listener!(bool, string, n) signal1;
Foo f = new Foo();
// when signal is defined as type list, you can use delegate
signal1 = bool delegate(string s, int n) { writeln("inside delegate - ", s, n); return false; }
// or method reference
signal1 = &f.someMethod;
// declare using interface with single method
Listener!SomeInterface signal2;
// you still can use any delegate
signal2 = bool delegate(string s, int n) { writeln("inside delegate - ", s, n); return false; }
// but for class method which overrides interface method, you can use simple syntax
signal2 = f; // it will automatically take &f.someMethod
// call listener(s) either by opcall or explicit emit
signal1("text", 1);
signal1.emit("text", 2);
signal2.emit("text", 3);
// check if any slit is connected
if (signal1.assigned)
writeln("has listeners");
// Signal! can hold arbitrary number of connected slots
// declare using list of return value and parameter types
Signal!(bool, string, n) signal3;
// add listeners via connect call
signal3.connect(bool delegate(string, int) { return false; });
// or via ~= operator
signal3 ~= bool delegate(string, int) { return false; };
// declare using interface with single method
Signal!SomeInterface signal4;
// you can connect several slots to signal
signal4 ~= f;
signal4 ~= bool delegate(string, int) { return true; }
// calling of listeners of Signal! is similar to Listener!
// using opCall
bool res = signal4("blah", 5);
// call listeners using emit
bool res = signal4.emit("blah", 5);
// you can disconnect individual slots
// using disconnect()
signal4.disconnect(f);
// or -= operator
signal4 -= f;
чтобы необязательна DLL от SDL2 была.
и можно было более легковесное приложение сделать, вообще без внешних зависимостей.
около 900К
а так, под win32 dlangui тоже можно собрать с поддержкой SDL — работает нормально
Стили есть в теме.
Можно назначить Id стиля виджету. По умолчанию у стандартных виджетов уже выставлен id родного стиля.
Можно переопределить часть свойств стиля у конкретного виджета — остальные будут браться из стиля темы.
Если не переопределять никаких свойств стиля у виджета — будет напрямую использоваться стиль из темы.
При изменении таких свойств создается новый экземпляр стиля (copy-on-write) с указанием базового стиля — из темы.
Есть слой абстракции от платформы.
Для конкретной платформы надо определить backend — наследников классов Platform и Window.
Для win32 это занимает 72Kb, для sdl — 54K.
Если есть возможность (и dlangui построен с USE_OPENGL), отрисовка идет через OpenGL.
Иначе платформа должна определить способ отрисовки ARGB битмапа в окно.
Отрисовка графики идет с использованием интерфейса DrawBuf — в котором реализованы примитивы рисования прямоугольника, битмапа, символа текста, и т.д.
Также backend должен обеспечить трансляцию событий от мыши и клавиатуры в события dlangui.
Написано однажды, работает неважно.
Кстати, чип на DigiKey стоит дороже этой платы — $57.75
QMTECH Xilinx Zynq7000 Zynq XC7Z010 SoC FPGA Starter Kit Development Board
Получаем два ядра ARM Cortex-A9 667MHz, 64MB SDRAM (правда, с 16-bit интерфейсом).
FPGA часть гораздо жирнее — 28K LE
Куча сигналов выведено на два разъема: 40+50 pins
По возможностям похоже на Digilent Cora Z7-10, но в два раза дешевле.
Один минус — не разведена поддержка встроенного ADC, как в Cora. Но с таки количеством свободных ножек можно и внешний ADC повесить.
Но даже там вместо RC генератора используется используется LC для большей чувствительности.
D получился даже медленней node-js.
Потестировал D (vibe.d) по сравнению с Go.
На Windows 7 x64 — vibe.d собранный DMD под x86 чуть быстрее Go только если выбрана конфигурация vibe.d libevent. Иначе в два раза медленней.
На Linux x86_64 — vibe.d собранный DMD и в default конфигурации и в libevent показывает 45K запросов в секунду, a Go — 50K запросов. Но зато D использует 90% CPU, a Go — 120%.
Теоретически сборка Vibe.d с помощью компилятора LDC вместо DMD должна показать лучшие результаты. Проверить пока не получилось.
Киллер фича go — goroutines есть и в D — fibers.
Плюс многое другое, чего в Go нет.
Для запуска нужны компилятор D (DMD или LDC) и DUB.
Компилировал DMD. LDC должен давать более быстрый код.
Форк.
<img src="" alt=«image»/>
Рожица отрисована SFML, а виджеты — DlangUI.
Исходники файла, добавленного в dlangui для поддержки новой платформы.
Для SFML пока сделал только рисование, надо еще добавить трансляцию событий мыши и клавиатуры.
GitHub репозиторий с примером
Пока еще не поздно поменять.
Signal!OnClickHandler — то можно вешать несколько обработчиков, с помощью connect и отключать из с помощью disconnect. Присваивание отсоединяет все подключенные слоты и заменяет их одним новым. С помощью ~= новый слот добавляется к имеющимся (аналог connect), -= отключает (то же, что disconnect).
Если объявлен как
Listener!OnClickHandler — то возможено подключение только одного слота
Listener используется вместо Signal там, где хочется сэкономить память ценой урезания функциональности (Listener в два раза меньше занимает памяти, чем Signal).
и можно было более легковесное приложение сделать, вообще без внешних зависимостей.
около 900К
а так, под win32 dlangui тоже можно собрать с поддержкой SDL — работает нормально
sld2 backend — адаптер между sdl2 и dlangui
Можно назначить Id стиля виджету. По умолчанию у стандартных виджетов уже выставлен id родного стиля.
Можно переопределить часть свойств стиля у конкретного виджета — остальные будут браться из стиля темы.
Если не переопределять никаких свойств стиля у виджета — будет напрямую использоваться стиль из темы.
При изменении таких свойств создается новый экземпляр стиля (copy-on-write) с указанием базового стиля — из темы.
Для конкретной платформы надо определить backend — наследников классов Platform и Window.
Для win32 это занимает 72Kb, для sdl — 54K.
Если есть возможность (и dlangui построен с USE_OPENGL), отрисовка идет через OpenGL.
Иначе платформа должна определить способ отрисовки ARGB битмапа в окно.
Отрисовка графики идет с использованием интерфейса DrawBuf — в котором реализованы примитивы рисования прямоугольника, битмапа, символа текста, и т.д.
Также backend должен обеспечить трансляцию событий от мыши и клавиатуры в события dlangui.