Вело-изобретателиФорумSR2D - софтовый 2D движок

SR2D, тестируем x64 версию. (15 стр)

Страницы: 114 15 16 17 18 Следующая »
#210
23:14, 24 сен 2023

Mikle
Я не изучал код, но значит у тебя при скейле формы, все спрайты перескейливаются в новый размер.

В общем попробую переписать 64 битный спрайт под сишарп.
Сейчас вот ковырялся. Выяснил что похоже нет Static в таком виде в котором он был в вб. Т.е видимо только выносить переменную в класс формы. А чтобы в процедуре была переменная которая не обнуляется, такого нет.
Хорошо что есть бинг лол. Я конечно держу в уме, что он может галлюцинировать, но порой прям очень помогает.

#211
22:08, 1 окт 2023

Mikle
Я потихоньку перекатываю спрайт на с# (параллельно привыкаю к синтаксису)

в процедуре Draw на vb в 64 битной версии

нет кейса для - op.blend

в 32битной версии класса на с# в этой-же процедуре он есть и использует Src.BlendFactor в аргументах
в классе для вб от 64 версии, я этого проперти вообще не вижу

так задумано, ты специально его убрал из этой версии?

#212
22:28, 1 окт 2023

SilentPrayerCG
> в 64 битной версии
>
> нет кейса для - op.blend
Зато есть отдельно "Public Sub Blend". Уже не помню сейчас, из каких соображений это было сделано. Могу повспоминать.

#213
11:07, 2 окт 2023

Mikle
Ну я так понял в си шарпе, бленд фактор это проперти спрайта.
И при операции бленд, аргумент бленд фактор берется из этого проперти

а в вб это просто аргумент, и при вызове бленда задается тупо через аргумент процедуры draw

что именно этот бленд делает? смешивает 2 спрайта по коэффициенту?

#214
19:44, 2 окт 2023

SilentPrayerCG
> что именно этот бленд делает? смешивает 2 спрайта по коэффициенту?
Да. Причём коэффициент для A, R, G, B может быть разный.
Вспомнил. Я, когда писал порт на Шарп, начал экспериментировать с мультипоточным рендером. В принципе, SR2D_Sprite к нему готов, я пробовал, реально очень повышается быстродействие. Принцип прост — делим Dest на N частей, создаём N потоков и в каждом потоке запускаем ОДНУ И ТУ ЖЕ процедуру рендера, отличается только Lock Rect. Всё прекрасно работает, но есть проблема при использовании Blend — BlendFactor общий для всех потоков. Чтобы от этого избавиться, можно передавать его параметром в Draw(), но ради одного кейса не хочется добавлять ещё один параметр. Из этих соображений я вынес Blend() в отдельный метод. Если когда-нибудь увидит свет очередная версия SR2D, то там именно так и будет для всех ЯП.

#215
19:59, 2 окт 2023

Mikle
А боттлнека не будет на создании потоков? Или там это на конце ддлки которая на Си и там все быстро?
А то я пилил свою заливку, и распоточивал её на 4 потока (типа рисуется крест, и заливаются четвертинки на отдельных потоках), на больших картинках быстро работает, быстрее чем тот-же алгоритм но на 1ом потоке, но мелочь всякая медленнее получается.

Я тут кстати дошел до TileDraw

+ Показать

Я сначала не понял нафиг этот цикл, я так понимаю. это чтобы в случае чего выйти и перескочить на остальной код. Это вообще принятый способ так делать)?) я не эксперт конечно.
Это тот случай который я бы во времена Спектрума сделал тупо через Go To, но в современном мире Go To только для дебага допускается.

Я попросил гугл бард переделать этот кусок, он даже переделал, но я не доверяю :D А бинг вообще затупил, сказал что не понял нефига.

ps
зачем кстати эта процедура меняет meLeft meTop итд, и потом возвращает их назад?

pps
классно если будет продолжение разработки
всё-таки из простых способов выводить графику, этот самый быстрый и ненапряжный
никаких альтернатив не нашел

ppps
еще вопрос по поводу вот этих строк

            Sx = Sx - Int((Sx + sw) / sw) * sw
            Sy = Sy - Int((Sy + sh) / sh) * sh

в с# у тебя вот так сделано

        Sx -= (int)Math.Floor((double)(Sx + sw) / (double)sw) * sw;
        Sy -= (int)Math.Floor((double)(Sy + sh) / (double)sh) * sh;

вот это нагромождение кастов и потолка вообще играет роль?
я так понимаю, в с# math.floor имеет такой-же эффект как int() в vb.net, только vb.net не требует кастов
но я попытался прогнать этот кусок через разные конвертеры, дак они вообще опускают этот момент с флором, делают тупо каст (int), но IDE пишет что каст не нужен.

#216
20:42, 2 окт 2023

SilentPrayerCG
> я так понимаю. это чтобы в случае чего выйти и перескочить на остальной код.
> Это вообще принятый способ так делать)?
Вполне нормальная замена GoTo.
SilentPrayerCG
> зачем кстати эта процедура меняет meLeft meTop итд, и потом возвращает их назад?
TileDraw() закрашивает текстурой заданный Rect. Если он выходит за пределы LockRect, это нужно ограничить, после вычисления этих поправок Rect закрашивается, используя уже имеющийся механизм LockRect для задания границ, поэтому границы временно меняются на свои.

#217
20:47, 2 окт 2023

Касты нужны для того, например, чтобы этот фрагмент:

(double)(Sx + sw) / (double)sw

не дал целочисленное деление.
(int) в начале можно и убрать, если компиль позволяет. Я помню, что раньше тут были проблемы. В любом случае тут не мы, так компиль подставит каст.
> math.floor имеет такой-же эффект как int() в vb.net
int() возвращает Integer, а что вернёт math.floor()? Численно то результат тот же.

#218
21:41, 2 окт 2023

Mikle
Дак Sx, Sy уже инт. Если сделать каст на даблы, итог будет просто дробь, а если не делать итог будет целое число без дроби, или нет?
Просто если то куда все это записывается и так int, или он округлит в другую сторону?
Потому что, флор он там как-то по особому округляет.

#219
22:13, 2 окт 2023

SilentPrayerCG
> Просто если то куда все это записывается и так int, или он округлит в другую
> сторону?
> Потому что, флор он там как-то по особому округляет.
Floor округляет к нижнему, а каст к ближайшему (на vb, на счёт шарпа не помню). Не могу сейчас проверить, на компе, с которого пишу, нет студии.

#220
6:27, 3 окт 2023

Mikle
Понял, проверю тогда.
Я пытался что-то загуглить, нашел какой-то вопрос, мол а почему прогеры юзают floor вместо round. Но это был вопрос про с++ и ему ответили что, в каких-то старых версиях не было round и все юзали floor.

Сейчас вот вспомнил да, Int в бейсике откидывает вроде дробь тупо (ну возвращает целое получается, как ты написал).
Конвертеры просто почему-то меняют int() на (int) хотя это вообще разное между вб и с#

Собственно вот это меня и интересовало, в данном коде нужно именно дробь отбросить а не округлить до ближайшего, правильно?

ps
в общем проверил, вставил просто как было в 32битной с#
        Sx -= (int)Math.Floor((double)(Sx + sw) / (double)sw) * sw;
        Sy -= (int)Math.Floor((double)(Sy + sh) / (double)sh) * sh;
он оба каста помечает как redundant, если один каст убрать, второй каст больше не redundant

т.е  если сделать так
                Sx -= (int)Math.Floor((Sx + sw) / (double)sw) * sw;
                Sy -= (int)Math.Floor((double)(Sy + sh) / sh) * sh;
то он ничего не выдает.
но я что-то не пойму, если честно. может ему достаточно одного операнда в дабле, чтобы результат получился тоже дабл?
Потому что если убрать оба каста, то тогда потолок ругается, что дай мне дробь.
(проверил, если один операнд, левый или правый кастится в флоат, то результат одинаковый)

#221
8:22, 3 окт 2023

SilentPrayerCG
> может ему достаточно одного операнда в дабле, чтобы результат получился тоже дабл?
Если один операнд дабл, то компилятор второй сам преобразует, это происходит всегда, процессор умеет производить арифметические действия только с операндами одинакового типа. Например, когда складываешь Integer и Byte, сначала Byte преобразуется в Integer.

#222
8:53, 3 окт 2023

Mikle
Аа. Понятно.
Просто это как-то выглядит, не красиво, когда один только операнд кастится.
Хотя я сейчас проверил, можно всё выражение взять в скобки и сделать 1 каст и вроде работает.

#223
9:00, 3 окт 2023

SilentPrayerCG
> можно всё выражение взять в скобки и сделать 1 каст и вроде работает
Может получиться другой результат — сначала произойдёт вычисление в одном типе, а потом каст в другой.

#224
11:54, 3 окт 2023

Mikle
ну
int x,y;
x = 3;
y = 2;

dynamic variant;

variant = (double)(x / y)

и получается. 1.5
вроде правильно
точно так-же как если отдельно кастануть x или y

--
            double result;
            int x, y;
            x = 3; y = 2;

            result = (double)(x / y * 2);
 
            result =(double)x / (double)y * (double)2;

а вот так разный результат получается
в первом случае 2, во втором 3

Страницы: 114 15 16 17 18 Следующая »
Вело-изобретателиФорумSR2D - софтовый 2D движок

Тема в архиве.