Mikle
Я не изучал код, но значит у тебя при скейле формы, все спрайты перескейливаются в новый размер.
В общем попробую переписать 64 битный спрайт под сишарп.
Сейчас вот ковырялся. Выяснил что похоже нет Static в таком виде в котором он был в вб. Т.е видимо только выносить переменную в класс формы. А чтобы в процедуре была переменная которая не обнуляется, такого нет.
Хорошо что есть бинг лол. Я конечно держу в уме, что он может галлюцинировать, но порой прям очень помогает.
Mikle
Я потихоньку перекатываю спрайт на с# (параллельно привыкаю к синтаксису)
в процедуре Draw на vb в 64 битной версии
нет кейса для - op.blend
в 32битной версии класса на с# в этой-же процедуре он есть и использует Src.BlendFactor в аргументах
в классе для вб от 64 версии, я этого проперти вообще не вижу
так задумано, ты специально его убрал из этой версии?
SilentPrayerCG
> в 64 битной версии
>
> нет кейса для - op.blend
Зато есть отдельно "Public Sub Blend". Уже не помню сейчас, из каких соображений это было сделано. Могу повспоминать.
Mikle
Ну я так понял в си шарпе, бленд фактор это проперти спрайта.
И при операции бленд, аргумент бленд фактор берется из этого проперти
а в вб это просто аргумент, и при вызове бленда задается тупо через аргумент процедуры draw
что именно этот бленд делает? смешивает 2 спрайта по коэффициенту?
SilentPrayerCG
> что именно этот бленд делает? смешивает 2 спрайта по коэффициенту?
Да. Причём коэффициент для A, R, G, B может быть разный.
Вспомнил. Я, когда писал порт на Шарп, начал экспериментировать с мультипоточным рендером. В принципе, SR2D_Sprite к нему готов, я пробовал, реально очень повышается быстродействие. Принцип прост — делим Dest на N частей, создаём N потоков и в каждом потоке запускаем ОДНУ И ТУ ЖЕ процедуру рендера, отличается только Lock Rect. Всё прекрасно работает, но есть проблема при использовании Blend — BlendFactor общий для всех потоков. Чтобы от этого избавиться, можно передавать его параметром в Draw(), но ради одного кейса не хочется добавлять ещё один параметр. Из этих соображений я вынес Blend() в отдельный метод. Если когда-нибудь увидит свет очередная версия SR2D, то там именно так и будет для всех ЯП.
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 пишет что каст не нужен.
SilentPrayerCG
> я так понимаю. это чтобы в случае чего выйти и перескочить на остальной код.
> Это вообще принятый способ так делать)?
Вполне нормальная замена GoTo.
SilentPrayerCG
> зачем кстати эта процедура меняет meLeft meTop итд, и потом возвращает их назад?
TileDraw() закрашивает текстурой заданный Rect. Если он выходит за пределы LockRect, это нужно ограничить, после вычисления этих поправок Rect закрашивается, используя уже имеющийся механизм LockRect для задания границ, поэтому границы временно меняются на свои.
Касты нужны для того, например, чтобы этот фрагмент:
(double)(Sx + sw) / (double)sw
не дал целочисленное деление.
(int) в начале можно и убрать, если компиль позволяет. Я помню, что раньше тут были проблемы. В любом случае тут не мы, так компиль подставит каст.
> math.floor имеет такой-же эффект как int() в vb.net
int() возвращает Integer, а что вернёт math.floor()? Численно то результат тот же.
Mikle
Дак Sx, Sy уже инт. Если сделать каст на даблы, итог будет просто дробь, а если не делать итог будет целое число без дроби, или нет?
Просто если то куда все это записывается и так int, или он округлит в другую сторону?
Потому что, флор он там как-то по особому округляет.
SilentPrayerCG
> Просто если то куда все это записывается и так int, или он округлит в другую
> сторону?
> Потому что, флор он там как-то по особому округляет.
Floor округляет к нижнему, а каст к ближайшему (на vb, на счёт шарпа не помню). Не могу сейчас проверить, на компе, с которого пишу, нет студии.
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;
то он ничего не выдает.
но я что-то не пойму, если честно. может ему достаточно одного операнда в дабле, чтобы результат получился тоже дабл?
Потому что если убрать оба каста, то тогда потолок ругается, что дай мне дробь.
(проверил, если один операнд, левый или правый кастится в флоат, то результат одинаковый)
SilentPrayerCG
> может ему достаточно одного операнда в дабле, чтобы результат получился тоже дабл?
Если один операнд дабл, то компилятор второй сам преобразует, это происходит всегда, процессор умеет производить арифметические действия только с операндами одинакового типа. Например, когда складываешь Integer и Byte, сначала Byte преобразуется в Integer.
Mikle
Аа. Понятно.
Просто это как-то выглядит, не красиво, когда один только операнд кастится.
Хотя я сейчас проверил, можно всё выражение взять в скобки и сделать 1 каст и вроде работает.
SilentPrayerCG
> можно всё выражение взять в скобки и сделать 1 каст и вроде работает
Может получиться другой результат — сначала произойдёт вычисление в одном типе, а потом каст в другой.
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
Тема в архиве.