Ычан: [d | au / b / bro / hr / l / m / mu / o / s / tran / tu / tv / vg / x | a / aa / c / fi / jp / rm / tan / to / vn]
[Назад] [Вся нить] [Первые 100 сообщений] [Последние 50 сообщений]
Ответ в нить [Последние 50 сообщений]
Имя
Animapcha image [@] [?]
Тема   ( ответ в 9999)
Сообщение flower
Файл 
Пароль  (для удаления файлов и сообщений)
Параметры   
  • Прежде чем постить, ознакомьтесь с правилами.
  • Поддерживаются файлы типов 7Z, BZ, BZ2, GIF, GZ, JPG, MO, MP3, MP4, OGG, OGV, PDF, PNG, PSD, RAR, SVG, SWF, TXT, WEBM, WEBP, XCF, ZIP размером до 5120 кБ.
  • Ныне 3638 unique user posts. Посмотреть каталог
  • Предельное количество бампов нити: 500
No. 9999  
http://sourceforge.net/projects/rr-rr/
Предыдущий тред: >>4274
104 сообщений пропущено. Показаны 50 последних сообщений
No. 15149  
ReadDirectoryChanges.gif - (6.69MB, 640×376)
15149
Когда прочитал про ReadDirectoryChanges.
No. 15181  
1342459081764.jpg - (160.35KB, 664×768)
15181
Анон, я уже довольно долго наблюдаю за твоим проектом, с периодичностью в 3-4 месяца забывая про него, и вспоминая снова.

Расскажи, пожалуйста, вот что. Откуда ты черпаешь информацию по правильному применению OpenGL? Я сам разработчик, немного пытающийся в игродев. Вот только с гл, по всей видимости, без бутылки не разберешься. То-есть, я знаю всю базовую функциональность: шейдеры/вершинные массивы/индексы/состояния, но нету абсолютно представления, как рендерить сложные сцены, а все попытки попробовать кончаются как гроб, кладбище, лаги, ноль кадров в секунду. Мне кажется я упускаю что-то. Может, посоветуешь что-то почитать из книг, или подскажешь правильный вектор гуглинга?
No. 15188  
>>15181
Оно не «правильное», я до сих пор не могу UBO и окклюжн запилить :(

Очень сильно не должно тормозить, если только ты какую-нибудь глупость не делаешь, типа пересоздания/перезаливки ресурсов каждый кадр, или Get*/Finish. Посмотри в профилировщике, откуда именно лаги. Если действительно OGL, отсечения должны помочь. По фрустуму легко отсекается под 3/4 (в предположении, что вид от первого лица, угол обзора 90°, а сверху-снизу ничего нет), окклюжн в закрытых пространствах должен отсекать вообще почти всё, но он сложнее.
No. 15189  
>>9999
А с чего ты вообще начинал, Стив?
No. 15190  
>>9999
То есть, ты студент? Чем по жизни занимаешься? Как у тебя вообще ЧТО-ТО выходит? Если не затруднят вопросы, ответь, пожалуйста.
No. 15191  
>>15190
Я крутой хикки! (Поэтому делать нечего.)
И у меня не выходит...

И я бы к этому ТАК не относился. Я с ужасом осознаю, что отношусь к некой немногочисленной, но прослеживающейся категории людей (специально не искал: раз http://freepascal.ru/forum/viewtopic.php?t=10058, два http://spaceway.1gb.ru/, три http://www.gamedev.ru/projects/forum/?id=140784), которые, значит, решают запилить некий «сложный» (нет) проект на Паскале, но при этом:

а) не имеют представления о базовых вещах. Первый в конце треда на полном серьёзе говорит о формировании финальной картинки из нескольких не как о чём-то самом собой разумеющемся, у третьего вообще какая-то непортируемая жесть, которая сегфолтится при любых сценариях использования, отличных от тривиальных, и куда «Lua-ссылки» добавлены автор сам не понимает зачем (в доке так и сказал... «я не так часто пользуюсь Lua», ну просто лол, оно и видно). Да достаточно на исходники взглянуть. Второй их закрыл, но там было хуже первого и третьего вместе взятых, что-то уровня глБегин с шейдерами. (Некрасиво с моей стороны, да, пацаны в лицо говорят. Пофиг.)

б) ввиду (а), а также сломанности самого языка (отчасти — RTL), у них получается многословная и неповоротливая система, нет, груда плоти, которая кровоточит и кричит «убей меня» (aka «перепиши на C#», как Game Maker). Иногда её тянут и иногда она всё же выезжает, чисто экстенсивно, как Castle Engine. Но, как по мне, в проектах на других языках относительная доля треша всё же поменьше 100%.

Вооот. Не то чтобы я собирался свой проект переписывать, но как-то это всё неправильно. :(
No. 15207  
>>15191
>Я крутой хикки! (Поэтому делать нечего.)
Но образование есть какое-нибудь?
No. 15211  
>>15188
А чем можно профилировать эффективно? Вот есть стрейтфорвард вей, установить swap-интервал в 0 и засечь количество кадров в секунду, например. Но это измерение в попугаях. Прочитав твое сообщение, погуглил и наткнулся на apitrace. Весьма неплохо, показывает состояния, полный трейс вызовов gl*, но это все равно не дает понятия о том, где происходит потеря производительности. Такое ощущение, что где-то провал в софтварный режим. У меня Intel HD4000, но что меня смущает, это то, что даже ААА-игры более-менее сносно работают, не проваливаясь никуда.

Что имею конкретно: пытался прикрутить к контексту рендеринг текста. Был взял FT2, и для каждого требуемого символа загружена текстура и создан дисплейный лист (glNewList) с прямоугольником. Далее происходит биндинг требуемой текстуры, вызов нужного листа, перенос матрицы отображения, всё. На мой взгляд, простейшие операции, но стоит выйти за сотню рендеримых прямоугольников, так количество попугаев падает до нуля. Я даже выкинул другие изменения состояний из цикла вывода, но это не изменило ничего. Неужели это так и должно происходить? Что тогда делают в топовых игорях, чтобы держать частоту кадров на уровне, не понимаю?
No. 15214  
trebuc.gif - (80.10KB, 384×256)
15214
>>15211
Склей все буквы в один текстурный атлас (у меня прям весь из себя динамический ←>>10485, но если не выделываться, то проще и надёжнее единожды сгенерировать и забыть) и рисуй текст моделью из N квадратиков, вырезающих нужные буквы текстурными координатами. Оптом дешевле, это очень общий принцип. Не используй glNewList, он мог бы быть полезной штукой (коль скоро что-то похожее, буферы команд, есть на низком уровне), но на деле давно убран из спецификации. Листы < ничего (glDraw*) < VBO (glDraw* под glBindBuffer).

>>15207
https://vk.cc/5WSQTW

Раз уж такое дело, я хотел за начало декабря запилить
1) нескучные MIDI-с-изменяемыми-параметрами (т. е. каждый раз у конкретной песенки подкручивается скорость или октава, что как бы превращает её в несколько) — в принципе, это должно свестись к (BASS_MIDI_)StreamGetEvents + <шаманство над MIDI-дорожкой> + StreamSetEvents

2) сделать нормальный парсер шейдеров (очень бы пригодился для человеческого синтаксиса всего, что я там нагородил, и вытаскивания метаинформации вроде используемых юниформов, например, чтобы автоматически подставить вместо них layout(shared) UBO) — можно слизать у https://github.com/graphitemaster/glsl-parser

3) переделать пространственные деревья (а они просто глючат) — этих ребят хочу заставить самих переразбивать себя, когда посчитают нужными

но сделал только, э, подзадачу (1) остальное как-нибудь в январе, ладно?)): теперь, короче, музыка (и звуки) работают в отдельном потоке, вернее, на таймерах, подсел на это дерьмо (ранее я и освобождение ресурсов по таймауту на них переписал). Зачем: чтобы не требовать дёргать BGM.Process(DeltaTime) в «основном цикле», которого может вообще не быть. Что именно происходит: во-первых, с началом воспроизведения песенки плеер взводит на оставшееся время таймер поставить новую, во-вторых, можно начать воспроизводить звук (или сказать ему фейдаутнуться) и забыть о нём, освободив все ссылки — на время воспроизведения звук доверит одну таймеру и тот освободит её, когда звук довоспроизводится/дофейдаутится (избегая немедленной остановки в деструкторе).
No. 15215  
>>15214
Это получается, что на каждый текстовый объект проще сгенерировать массив вершин? Что делать, если текст динамический? При изменении перезагружать вершины? Звучит сомнительно, но я попробую.
Что до текстурного атласа - получается, что набор символов должен быть известен заранее. А если это нет возможности узнать, то как быть?
Ну и возвращаясь к идее более сложных сцен. Допустим, что текст можно попытаться уложить в один-два объекта. Но если, не дай боже, нужно будет рендерить различные модельки с различными текстурами? Их же не склеишь в одну большую модель и текстуру.
No. 15216  
24577265.jpg - (81.07KB, 480×640)
15216
>>15215
В варианте с матрицами ты, заливая по 16 чисел на символ, косвенно делаешь то же самое, а ведь они на такое даже не рассчитаны! (против потока вершин, даже usage-подсказки в glBufferData завезли).
Чисто ради самоуспокоения спроси у своего шрифта количество символов и нарисуй их все =3.

Один дип на модельку — нормально, их ведь так и делают, с развёртками, вот этим всем. Одномоментно видимых вблизи много не будет. Невидимые рисовать не нужно. Вдали можно рисовать спустя рукава (импостером etc.).
No. 15347  
>>9999
Уважаемый, ты там с голоду умер?
No. 15388  
QUALITY_7.jpg - (137.49KB, 1188×791)
15388
>>9999
Ответь же!
No. 15465  
Где предыдущий тред? Совус, заяем удалил?
Объясните же уже, что это такое-то, блдажд, о чём тред!
No. 15493  
ship.gif - (32.35KB, 330×194)
15493
>>15347
Нормалфаги под кроватью пытаются отбирать еду, но они тупые, легко обхитрить. Сделал двухминутное кинцо, зацени: https://github.com/runewalsh/rox-loh/releases/download/v1.0/rox.rar. Это было в меру бесполезно, но по крайней мере понял, как нужно было работать с окном и GL-контекстом — потом как-нибудь перенесу реализацию в основной движок.
No. 15574  
>>15493
Целый месяц еду отбивал?
No. 15616  
26152978_p0.jpg - (293.10KB, 744×908)
15616
Ой дебил, навелосипедил тогда слежение за звуками, которые закончили воспроизведение, закончили фейдаутиться, etc., а мог бы просто дочитать документацию до возможности установить коллбэки на эти события. То же касается и MIDI: можно, конечно, патчить треки при загрузке, но официально одобренный способ >«подкрутить скорость или высоту» — хукнуть и перекрывать на лету соответствующие MIDI-события (TEMPO/PITCH/etc.). Завтра переделаю (от велосипеда останется одна блокировка).
No. 16218  
qwe.gif - (816.89KB, 700×500)
16218
Попробовал переписать пространственные деревья: моя реализация от 2k11 слегка глючила и требовала вызывать перестроение явно, а теперь решил для каждого узла вести учёт ИСКАЖЕНИЙ (красные прогрессбары толщиной в пиксель), и по превышении порога искажённости перестраивать автоматически. По части глюков получилось ещё хуже прежних, вплоть до неработоспособности. На гифке-то всё в порядке, но вот на реальной сцене... Нужно ковырять. Например, записать последовательности операций с деревом, приводящие к «невозможным» результатам, и плясать от них. Эх, вот я криворучка.

С этим условный фейл, а вот MIDI доделал.
No. 16286  
>>16218
Красивая гифка.
No. 16349  
>>16218
Я не понял, математические деревья ты имеешь в виду или реальные, потому что на гифке как будто программа для моделирования сада. Сам хотел такую написать.
No. 17390  
Бамп, хотелось бы апдейтов. Продолжай пилить, ну.
No. 19389  
Что-то застряла разработка. А сф теперь при скачке говорит: malware detected, download at your own risk. Это что же получается?
No. 19390  
>>19389
ОП взял твои деньги и свалил в Мексику.
No. 19393  
67132246_p0.png - (475.92KB, 800×1067)
19393
>>19389
Всё не могу себя заставить ту Сырну дорисовать. Ничего, уже вот-вот, сейчас всё будет, ещё немного, ух. шёл 2018

Мальварь, по-видимому, детектится из-за того, что скомпилированный FPC бинарник зачем-то импортирует ReadProcessMemory. Возможно, стоило бы посмотреть, зачем именно, и репортнуть на багтрекер, но вот, скажем, у меня похожая проблема с PyInstaller, и их позиция — не подстраиваться под антивирусы (https://github.com/pyinstaller/pyinstaller/issues/680), что в идеологическом смысле правильно:
>The only correct way to deal with antivirus is to report them that they are wrong. If we are working around them, we simply start a cat-and-mouse game that never ends.
Если убрать из таблицы импорта ReadProcessMemory (в качестве незаконного решения, не требующего перелопачивания структуры EXE, а только HEX-редактора, можно затереть названием какой-нибудь другой 17-буквенной функции kernel32, например, GetCurrentProcess), бинарник продолжает работать, но уже не даёт ни одного срабатывания на VirusTotal. Подозреваю, что там в каком-нибудь недостижимом пути исполнения какая-нибудь ерунда уровня ReadProcessMemory(GetCurrentProcess(), ...), т. к. если такое нужно сделать один раз, это может быть проще SEH или VirtualQuery.

Кстати, упоминавшийся в >>16218 баг был из-за того, что объекты сцены сдвигались, соответственно, и дерево апдейтилось в Newton-коллбэке http://newtondynamics.com/wiki/index.php5?title=NewtonSetTransform, который вызывается в ходе NewtonUpdate в потоках физики, а не потоке, дёрнувшем саму NewtonUpdate. Когда я делал физику, я ввиду своей наивности проигнорировал параметр с недвусмысленным названием threadIndex, а старое дерево не меняло топологию на лету (требуя явно вызывать Rebuild) и поэтому слабо портилось при гонке.

>>16349
Зелёным цветом показаны объекты, серо-синим вокруг них — узлы пространственного дерева (BVH), жёлтым — запрашиваемый объём, объекты внутри которого нужно вернуть. Обойдённые для этого узлы подсвечиваются красным. Если узел оказался полностью вне объёма, значит, все объекты внутри него можно сразу отбросить, не проверяя дальше (в этом весь смысл такой структуры). Если узел подсвечен сиреневым, то с точностью до наоборот: он полностью попал внутрь объёма и объекты внутри него можно сразу вернуть, не проверяя по отдельности. Выигрыш демонстрируется тем, что число проверок < числа объектов. Красная полоска над узлом эмпирически учитывает внесённые в него изменения, узел автоматически перестраивается, когда она переполнилась. По бенчмаркам всё плохо (но я пока не сделал нормальный бенчмарк, учитывающий разные сценарии, и не откалибровал логику автоперестроений), зато использовать проще, чем прежнюю реализацию, т. к. не нужно перестраивать руками.
No. 19685  
_resetstkoflw.png - (19.33KB, 689×824)
19685
Всегда хотел это проверить =3.
No. 20299  
Жив еще, значит. Я спокоен.
No. 21263  
Неужели этот уютный проект мертв? Не могу в это поверить. Я думал, вернее надеялся, что ты, подобно разработчику Dwarf Fortress, будешь пилить вечно.
No. 21321  
Там всякую древность пробампили. А предыдущий тред по этому движку настолько стар, что он уже утонул. Утонул здесь.
Старость - это когда твой тред утонул на чиочане.
No. 21335  
71879815_p0.png - (368.87KB, 600×500)
21335
Я написал пост с планами, нытьём и одой одной транковой фиче Free Pascal, но там нужна Сырна для чуть большей убедительности. Мне очень стыдно, но подождите ещё немного, я больше не буду раскрашивать рисунки 4 года ><". Настолько не хотел этим заниматься, что N5→N1 выучил.
No. 21341  
>>21335
Не стыдись, няша, это же твой проект. Ты делаешь его так, как хочешь. Я буду ждать апдейтов. На мой взгляд, у тебя интересный, самобытный проект.
No. 21361  
>>21335
>N5→N1 выучил
Посоветуешь литературы?
No. 21444  
>>21361
...
No. 21738  
Не утонуть
No. 24723  
Untitled-2.png - (125.11KB, 1165×1322)
24723
Совершенно случайно обнаружил во Free Pascal’е SSE-интринсики! «А что, так можно было?»

Похоже, фича в разработке (гуглятся анонсы и обсуждения в fpc-devel за начало этого года): соответствующий инклюд должен был бы попадать в модуль System, но на данный момент всегда закомментирован. Если проигнорировать это и без задней мысли скопипастить internproc-объявления из compiler/rtl/i386/cpummprocs.inc себе — на скриншоте переобъявлены интринсики для movups(регистр ← память), movups(память ← регистр) и maxps(регистр ← регистр, регистр), то вроде как всё работает и компилятор берёт на себя распределение и спиллинг регистров, как и должно быть. Очешуеть просто, ускорение векторных расчётов — а это обработка картиночек и моделечек — в 10 раз, ценой специальных, условно компилируемых реализаций примитивных операций, таких как operator +(vec4, vec4) или function max(vec4, vec4), притом эти варианты даже проще оригинала: max(A, B) → R реализуется, как видно, как
movups(R, maxps(movups(A), movups(B)));

против
R.x := max(A.x, B.x);

R.y := max(A.y, B.y);
R.z := max(A.z, B.z);
R.w := max(A.w, B.w);

Ща дорисую, ща-ща, сек.

>>21361
Вряд ли смогу что-то конкретное посоветовать, т. к. по сути я, прочитав Нечаеву («Ты теперь свободен от текстов про Путятина?»), пошёл ковырять с блокнотиком неадаптированный контент (книги и ВН, невыносимо сложно только первую тысячу часов[/unironically]; кстати, если есть 2 часа, глянь десантниц https://vk.cc/8sWwSL) — где Нечаеву можно заменить произвольным учебником по БАЗЕ, а уж контент сугубо дело вкуса (https://vk.com/topic-57363092_29501407?post=7). Единственное что, для начала просто необходимо взять что-то с существующим переводом, т. к. есть тысячи способов ничего не понять или понять неправильно, которые нейтрализуются только опытом.
No. 24724  
max.png - (2.90KB, 469×88)
24724
>>24723
>в 10 раз
У тебя там четыре непредсказуемых перехода в одной функции - конечно оно тормозить будет. Не знаю, может ли паскаль записать флоат в инт не перекодируя битики, но если может, то попробуй высчитать маску по условию и записать в результат без условия. Будет всё ещё медленно, но не настолько.

А вообще, я бы на твоём месте давно бы написал компилятор паскаля в сишку, и там бы сишный компилятор полуавтоматически это всё делал.
No. 24733  
max [mask].png - (33.83KB, 802×356)
24733
>>24724
Да, не подумал, у меня исходные данные триггерят худший случай с полностью непредсказуемыми ветками. Для сравнения проверил на полностью предсказуемых (pred) и сделал безбранчевый вариант (mask).
Относительно друг друга они работают за время, относящееся как
(vector) 1 : (scalar-pred) 2,1 : (scalar-unpred) 10 : (mask-pred) 3 : (mask-unpred) 3 (неудивительно).

Ранее я считал, что переносы между флоатовыми и целочисленными регистрами жутко дорогие: так, в Java при домножении 8-битного цвета на альфу у меня получался выигрыш в 7–13 раз (https://ideone.com/vj13We), если делать это не прямым
float alpha;

for (each pixel) pixel8 = round(pixel8 * alpha);
а, скажем,
int alpha10 = round(alpha * 1024); // 10 бит точности — эмпирическая цифра

for (each pixel) pixel8 = (pixel8 * alpha10 + 512) >> 10;
— в целых числах.

У @oldnewthing были статьи про SSE-трюки, где он прожужжал все уши domain crossing penalty:
>There are a few ways to load constants into SSE registers.
> • Load them from memory.
> • Load them from general purpose registers via movd.
> • Insert selected bits from general purpose registers via pinsr[b|w|d|q].
> • Try to calculate them in clever ways.
>Loading constants from memory incurs memory access penalties. Loading or inserting them from general purpose registers incurs cross-domain penalties. So let’s see what we can do with clever calculations.

Я даже думаю (так, примерно почувствовал), что в случае с альфой это связано не столько с domain crossing, сколько с латентностями флоатовых вычислений, которые вылезают при попытке сделать с результатом что-то интересное, вроде пересылки в целочисленный регистр. С бранчами вместо арифметики это не проявилось, но в целом касты, в т. ч. реинтерпрет_касты, между интами и флоатами без явной необходимости мне видятся такой себе идеей.

Кроме того.

Хотя для замера я расписал максимумы упрощённо, моя настоящая реализация соответствует определённой в IEEE 754 функции maxNum: если один из аргументов — NaN, она возвращает другой. Не так страшно, как звучит: если наивный максимум — это
if a > b then result := a else result := b;
то IEEE-комплиантный — его небольшая модификация:
if (a > b) or (b <> b) then result := a else result := b;
SSE этого, может быть, ради экономии транзисторов в 2000 году, не предусматривает (или же она детерминированно, если один из аргументов — NaN, возвращает не другой, а строго b), и я не уверен, можно ли полагаться на это в шейдерах, но это очень удобное свойство, и вот почему.

Мы постоянно работаем с величинами, которые можно рассматривать как веса эффектов. Тот же вклад диффузного освещения выражается косинусом угла между нормалью и направлением на источник света, иными словами, их скалярным произведением. Но в неосвещённом полупространстве косинус становится отрицательным, а вклад должен быть нулевым, поэтому окончательная формула принимает вид
diffuse = max(0.0, dot(normal, vec_to_light));
В более сложных случаях, той же модели Кука-Торренса, у нас появляется целая пачка таких промежуточных коэффициентов, отрицательность которых нам в этот раз даже и не страшна сама по себе, но они возводятся в степени, и принципиальное отличие между нулевым и отрицательным флоатами в том, что ряд функций, в первую очередь собственно pow(x, p), определены как возвращающие NaN для отрицательного x. По этой причине автор статьи https://habr.com/ru/post/424453/ (оригинал: https://learnopengl.com/PBR/Lighting) постоянно параноит отрицательность через max(0.0, value), тогда как с IEEE-комплиантным max() этого не нужно делать (по крайней мере в данном случае) — достаточно оставить финальный max(0.0, specular), который сделает из пропагейтнувшегося NaN’а тот же 0. В другой раз у нас может быть перемножение отрицательных чисел, которое вернёт не NaN, а неверный положительный результат, но в целом ряде случаев этого нет и можно спокойно убрать кучу паранойи.

Так вот, скалярный IEEE-комплиантный вариант, дописанный в ряд выше, показывает себя следующим образом:
(scalar-precise-pred) 2,2 : (scalar-precise-unpred) 11
то есть почти идентично наивным 2,1 : 10.

Таким же приёмом (добавлением b <> b) этого можно добиться и на SSE (https://stackoverflow.com/a/32332219). На FPC-интринсиках это выглядит как
function max(const a, b: Vec4f32): Vec4f32;

var
    ma, mb: __m128;
begin
    ma := _movups(@a);
    mb := _movups(@b);
    _movups(@result, _blendvps(_maxps(ma, mb), ma, _cmpps(mb, mb, {UNORD} 3)));
end;
и даёт практически идентичную чистому maxps, взятому за 1, скорость
(vector-precise) 1,05.

Аналогично — uint32((a.x > b.x) or (b.x <> b.x)) и т. д. — можно добавить поддержку NaN и маскам, но они начинают совсем явно проигрывать UPD: а нет, гениальный компилятор вычисляет это выражение через джампы, так что я переделал на форсированно побитовое uint32(a.x > b.x) or uint32(b.x <> b.x) и получился как бы не такой уж плохой результат:
(mask-precise) 6,
но меня всё ещё настораживает двукратная разница относительно этого же способа без NaN.
No. 24736  
70468793_p0.png - (198.33KB, 3190×3366)
24736
>>24734
UPD2: возможно, компилятор даже прав, вычисляя (a.x > b.x) or (b.x <> b.x) через джампы. Форсированно безджамповый вариант не взаимодействует с предсказателем и выдаёт 6 в любую погоду, а джампы выдают
(mask-precise-pred) 3,5 : (mask-precise-unpred) 11.
В предположении, что предсказатель работает (иначе зачем он нужен), реальные результаты будут гораздо ближе к 3,5, чем к 11, то есть лучше 6, и, надо заметить, однозначно (и ожидаемо) хуже исходных (scalar-precise). В частности, если мы вычисляем значение чего-то пикселеподобного и у нас вылезает конкретный результат a≷b или NaN, то у соседей, которых мы вскоре будем считать, с высокой вероятностью вылезет то же самое, поэтому предсказатель сработает лучше, чем его отсутствие.
No. 24739  
Clipboard01.png - (71.07KB, 1280×800)
24739
Почему исчезла собранная версия?Несколько лет назад была, с радостью играл.А что делать вот с этим безобразием, ума не приложу.
No. 24768  
https://web.archive.org/web/20151021190423/http://410chan.org/dev/res/4274.html

просто чтобы проще было не терять
No. 25030  
10 лет прошло с начала разработки. Технологии рендера изменились до неузнаваемости. Уже делают рилтайм рейтрейсинг с постобработкой нейроночками, и все это с аппаратной поддержкой.
...
А ты копаешь ассемблерный код сравнения чисел.
No. 25117  
>>25030
Я конечно понимаю, что бесконечное копание ассемблерного кода это самоцель проекта, но почему бы по-быстрому не набросать то же самое на юнити. Мне кажется концепт сам по себе вполне играбелен, и достоин того, чтобы принять более-менее оконченный вид.
No. 25121  
>>24739
Я удалил старые билды, а из исходников скомпилировать нельзя (на самом деле можно, но, пожалуйста, просто не пытайся). Всё будет, главное сейчас сидеть тихо и не бухтеть.

>>25117
Я не буквально «бесконечно копаюсь в ассемблерном коде» (хотя и занимаюсь чем-то близким по осмысленности), я и ассемблер-то почти не знаю. Просто написал под впечатлением, что вот, смотрите, интринсики завезли. BTW:
>>25030
>10 лет прошло ... Технологии рендера изменились до неузнаваемости.
Всё ясно, автору 10 лет.
Да нет, почти всё придумано в прошлом веке. ЭВМ Наири-3 поддерживала разделение времени и эмуляцию других ЭВМ. Рейтрейсинг и нейросети использовали ещё раньше.

>занимаюсь чем-то близким по осмысленности
Например, я буквально пару дней назад догадался сделать хранение базиса касательного пространства в вершине не обычными 2 векторами (нормаль + касательная, 3-й восстанавливается в шейдере через их cross), а кватернионом, т. к. этот базис, в предположении, что не может быть разортонормализован или отражён, представляет собой поворот некоторого исходного базиса — скажем, X = (1, 0, 0), Y = (0, 1, 0), Z = (0, 0, 1).

Ну, это старая идея и я давно читал про неё, но мне не хватало точности при хранении кватерниона как непосредственных X, Y, Z в 10-10-10 битах с восстановлением в шейдере W через √(1−x²−y²−z²), а хранить с лучшей точностью смысла нет (не будет выигрыша относительно 2 векторов). Теперь же я прочитал про идею (вот здесь в конце: https://archive.org/stream/GDC2015McAuley/GDC2015-McAuley_djvu.txt) отбрасывать не W, а максимальный по модулю компонент, и в 2-битовом W сохранить индекс отброшенного компонента. То есть кватернион (X, Y, Z, W) пакуется в один из вариантов:
(Y, Z, W, 0/3)

(X, Z, W, 1/3)
(X, Y, W, 2/3)
(X, Y, Z, 3/3)
Это выглядит страшно (распаковка предполагает 4 if'а), но, как я думал, даёт дополнительные полбита точности: поскольку мы отбросили максимальный компонент, ни один из оставшихся не превышает 1/√2, иначе он был бы максимальным сам. Поэтому мы можем домножить их на √2, выиграв log₂√2 = 0,5 бита точности при сохранении в нормализованный (U)INT_10_10_10_2.

На самом деле, во-первых, это работает более чем пристойно (более сложная распаковка компенсируется вдвое меньшим размером исходных данных), во-вторых, даёт точность, близкую к точности float32: во всяком случае, у меня кватернион, упакованный в 10-10-10-2 описанным методом и распакованный назад, в худшем случае составляет с исходным угол чуть больше 1/1000 радиана — и это всего на 20% хуже результата распаковки упакованного кватерниона сразу из 4×float32, без преобразования в 10-10-10-2. Для сравнения, кватернион, сохранённый в 10-10-10 просто как XYZ, в худшем случае отклоняется от оригинала на 1/10 радиана — это очень заметно в сингулярностях вроде верхушки сферы. То есть мы получили как бы не полбита точности, а все 6 ≈ log₂ ((1/10) / (1/1000)).

Целый мир (базис касательного пространства) умещается в 4 байтах, удивительно...
No. 26014  
Тред умер?
No. 26015  
>>26014
А ты думал, аффтору потребовалось если ответить 4 месяца на вопрос о пропаже билдов, и так их и не залить.
Но вроде что-то пилит.
No. 26016  
>>26014 >>26015
Сказал же буквально на днях, всё будет, хорош шуметь.
>Третий тролль сказал: «Прощайте! Ненавижу болтунов».

За прошлый год я, хотя ничего не делал, стал парадоксальным образом в промышленных масштабах натыкаться на баги Free Pascal, отчего потерял терпение и повадился громко плакать о них на багтрекере в противоположность тому, как ранее натыкался на них раз в год и обходил переформулированием кода. Последние две недели плотно занимался https://gitlab.com/freepascal.org/fpc/source/-/merge_requests/179, а вообще из всего, в чём засветился, мне больше всего нравится https://gitlab.com/freepascal.org/fpc/source/-/issues/39360 («копание в ассемблерном коде», да). Не подумайте, мне были жесть как нужны, соответственно, карманная база Юникода и ускорение генерации шума Перлина до уровня, когда текстуру с ним можно генерировать на месте, а не таскать с собой, здесь нет никаких проблем с приоритетами. Ну или, может, и есть самая малость, но кто сказал, что я прямо сейчас не возьму и не пойду дорисовывать Сырну?!
No. 26018  
>>26016
>Сказал же буквально на днях
Где??
Но вообще, контрибы в язык - это ты малаца, завидно даже.
No. 27280  
Гиде билды?
No. 27282  
e2d39d729650d44e2f68be3d6fafde8b.jpg - (190.68KB, 1684×2048)
27282
Хорош бампать, я сам бампну, когда придёт время.

Недавно гулял с сестрой в лесу. Она при всём уважении к моим хикки-привилегиям выразила заинтересованность в доступном объяснении, чем я занимаюсь целыми днями. Я сказал, что если честно, то делаю скорее не непосредственно свои проекты, а разные штуки для Паскаля (до этого сам похвастался, как сделал по просьбе человека с жёлтой аватаркой https://gitlab.com/freepascal.org/fpc/source/-/merge_requests/446 за 1 день и €250; у человека свои причины улучшать совместимость с Delphi: https://www.mail-archive.com/fpc-devel@lists.freepascal.org/msg41878.html, но конкретно эти классы — очевидный бред и полная чушь и совершенная мерзость, решающая несуществующую проблему и не имеющая отношения к маршалингу, и мне стыдно за это; ковыряние с ассемблерным кодом в миллион раз лучше, одно моё творчество над стандартной функцией CompareByte ускоряет абьюзящие её программы на 10~20% в целом). Она спросила, зачем мне Паскаль, я сказал, что для той игры, которую показывал 10 лет назад. Она сделала сочувственное лицо и спросила, неужели я её до сих пор не доделал. Кажется, мой ответ заключался в том, что я ничего не делал всё это время, потому что мне было грустно, что у меня нет друзей. Этот ответ вроде как верен, и если не уточнять, что причина что-то делать у меня была точно такая же, даже удовлетворителен. *вздох*

Потом я рассказал, как один человек (вот он же это прочитает и поймёт, насколько скучно я живу...) принёс на свидание со мной планшет и заставил зарисовать некоторые идеи под дулом пистолета, и она сказала, что со мной только так и надо. *вздох*
No. 27283  
>>27282
>Хорош бампать
Раз в полтора года слишком часто, нужно было хотя бы до круглой даты дотянуть? xP

Гиде можно добавиться к тебе во френды? Спрашиваю исключительно из личного интереса, может хочу поиграть в это поделие, а еще втереться к тебе в доверие и украсть всю интеллектуальную собственность, ха-ха-ха. В любом случае, добавление меня ни к чему не обязывает, мне комфортно сидеть и ничего не писать и ничего не получать. Но может мы что-то напишем, возможно даже по этой игре. Да!
Удалить сообщение []
Пароль  
[Mod]