внезапно оказалось... |
[Jun. 23rd, 2018|07:37 am] |
…что я собирал vccrun с -O0. ну, молодец, чо. собраный с -O2 он спокойно рендерит уровень Another Station от DooM2D:Forever — чистыми скриптами на мелком масштабе (весь уровень на экране) — потребляя чуть меньше, чем 20% CPU. а с -O0 жрал 100%, и не укладывался в 72 FPS. это вот весь рендер — грид, перебор панелей, сортировка, анимация текстур — всё на скриптах. нативный код делает только «блитни вот эту текстуру вон туда».
это 2д, уровень состоит из кучи прямоугольников aka панелей, и в «станции» их 7612. из нетестовых карт, пожалуй, самая большая и сложная. и рендерить её в виде «микропуксели на весь экран», конечно, никому не упёрлось: в нормальном масштабе оно потребляет всего около процента CPU. |
|
|
какие же ваши сикресты всё-таки уёбищные |
[Jun. 23rd, 2018|11:18 pm] |
простейшую вещь: генерацию имени функции в комиле-тайме, основываясь на типе её аргументов — и то сделать нельзя. тьфу, блядь. хоть бы static if нормальный по типам дали — так и того нет. какие-то уёбищные обломки, совершенно нерабочие, и выглядящие так, как будто кто-то насрал в модем. ребята, даже обфусцированый перл по сравнению с этим — верх изящества и красоты.
вот так накрылась пиздой идея сделать method overloading в VaVoom C. потому что я ебал руками манглить для нативных методов. а уёбищный «мощный и современный» говноязык до сих пор не позволяет мне сделать удобные compile time introspection and code generation, предлагая вместо этого высрать килотонны какого-то line noise, который иногда будет работать. если повезёт. и фаза луны. и только для некоторых случаев. и strictly write-only. пиздец.
если чо, то я хочу вот такого:
class VObject {
...
VStr something (VName n, VStr s, int i, float f=0);
}
// и потом тупо:
ImplementNative<VObject.something> ();
всё. эта еботень должна сама разобрать аргументы и тип возврата (а также отличать static method от direct и virtual), сгенерировать манглинг по правилам VaVoom C, сгенерировать враппер, который возьмёт со стека VM аргументы и Self, вызовет соответствующий метод, и положит результат на стек. а также немного кода, который при запуске зарегистрирует это в списке нативов и автоматически подвяжет потом к созданым на основе распарзеных скриптов vc-классам. да, для `f` должна корректно сделать `optional`, конечно, с учётом default value.
на дишечке это элементарно: просто цикл по параметрам, со `static if (is(typeof(arg) == очреднойтип)) { ебеним код конверсии }`, и в итоге автоматически получается красивый делегат. то же самое, кстати, можно сделать для удобного вызова функций из скриптов: `MyObject.anyname(42, 66.6)` способно автоматически сгенерировать код для нахождения и кэширования vc-метода, конвертации аргументов и ты пы. и да, `anyname` при этом объявлять не надо, `opDispatch()` ftw.
но говноеды с крестами продолжают кукарекать, что кресты — «мощный и современный язык». угу-ага. |
|
|