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

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

Страницы: 113 14 15 16 17 18 Следующая »
#225
14:59, 4 окт 2023

Mikle
В общем, если число положительное, то каст в int откидывает просто дробь.
Но вот если число отрицательное, тогда уже разница есть между int и floor.
-0.9  floor это -1 а каст в int это 0

#226
15:27, 4 окт 2023

SilentPrayerCG
> если число положительное, то каст в int откидывает просто дробь.
> Но вот если число отрицательное, тогда уже разница есть между int и floor
Это ясно. вот то, что (double)(x / y) даёт 1.5 для меня сюрприз. Никак шарп не поставлю, поэкспериментировать.

#227
(Правка: 20:53) 18:19, 4 окт 2023

Mikle
Возможно я ошибся. Блин я уже затер тот тестовый код.
А сейчас воспроизвести не получается.
Скорее всего я что-то напутал в тот раз.
если все выражение взять в скобки и сделать каст, 1 выходит, если 3 на 2 делить
если только 1 операнд то 1.5, как по идее и должно быть

ps пока для меня в шарпе наиболее напряжно, это следить за типами данных и делать касты
особенно когда это превращается в нагромождение скобочек. Причем в новой студии они цветные, но даже это мне мало помогает.

ps
            .biSize = Len(bi32BitInfo.bmiHeader)
получается VB может по человечески получить количество битов этой штуковины
а c# никак?)
      bi32BitInfo.bmiHeader.biSize = 40; //sizeof(bi32BitInfo.bmiHeader);

#228
21:57, 5 окт 2023

Mikle

      Bmp = new Bitmap(meWidth, meHeight, meWidth << 2, PixelFormat.Format32bppArgb, (IntPtr)PTR);

вот с этой строчкой еще интересно
в vb.net там тупо PTR передается в скан. Видимо сам как-то кастит.
в С# у тебя было (IntPtr) но у меня он пишет вот это https://learn.microsoft.com/ru-ru/dotnet/fundamentals/code-analys… -rules/ca2020
я попробовал сделать так

             Bmp = new Bitmap(meWidth, meHeight, meWidth << 2, PixelFormat.Format32bppArgb, (nint)PTR);

потому что он именно ругается на то что не может задать лонг в аргумент который ждет nint, и среда ничего не подчеркивает, но я не знаю правильно это или нет

еще у меня периодически по коду выскакивает такой варнинг
CS8600  Converting null literal or possible null value to non-nullable type

к примеру где временная битмапа и она равняется Null в начале процедуры.

     Bitmap Bmp = null;

он мне предлагает сделать так

            Bitmap? Bmp = null;

и про cBuf[] примерно также ругается

        private int[] cBuf;

тоже предлагает вопросик приделать.
я примерно понял, что он предупреждает, что объект может быть ничем, типа как Nothing в vb.net
но я так и не пойму, нужно приписать вопросик или нет, чтобы он остал и как это повлияет. В твоем с# коде этого нет, может в той версии С# этого и не было вообще.

#229
9:51, 6 окт 2023

SilentPrayerCG
> В твоем с# коде этого нет, может в той версии С# этого и не было вообще.
Скорее, этого нет в x32, если бы я попробовал на шарпе сделать x64 версию, столкнулся бы тоже.
> ругается на то что не может задать лонг в аргумент который ждет nint
По идее, правильнее всего сразу сделать PTR правильного типа, чтобы не кастить.

#230
(Правка: 10:24) 10:18, 6 окт 2023

Mikle
в общем nullable ввели похоже в последних версиях Шарпа.
Я так понял, если код и раньше предполагал, что объект может быть ничем, то как-то серьезно это (как объявлять объект, нуллабл или нет) не повлияет.

Все что я понял, что если не важно как объявить битмап просто или через "?", если он пустой и на него сослаться, он выкинет ошибку, что объект пустой.

Но судя по всему, если объявить объект nullable, и потом объявить int тоже nullable, и к примеру сделать i = bmp.width (и там тоже еще вроде где-то вопросики ставить надо), то тогда он не выдаст ошибку, а видимо будет просто 0.

А вот что по поводу IntPtr. Бинг мне предложил сделать IntPtr.ToInt64, но я не уверен что такое вообще сработает.
Проверил сейчас, объявил IntPtr новый, сделал ToInt64 и он ругается, что нужно nint все равно.
Т.е даже если заменить PTR с лонга на IntPtr.. как-бы.. один фиг придется кастить.
Вообще в этой области я вообще мало что понимаю, если есть идеи я попробую.
Я склоняюсь оставить nint, так как в си шарпе он ждет именно его в скане, и судя по всему это тоже числовой тип, в Вб наверное тоже самое, просто конверт он сам делает.

ps
а вот если скану напрямую IntPtr подать то все работает.
Тогда можно ПТР заменить на интптр видмио и везде где требуется лонг сделать ToInt64

#231
(Правка: 12:57) 11:48, 7 окт 2023

По-идее в C# можно вместо IntPtr использовать nint
Я так понял, у него такой-же функционал. Судя по всему, если приложение скомпилено под х32, nint будет Int32, если x64 будет int64.
Судя по всему IntPtr должен так-же работать. (т.е если процесс х32 то инт будет х32, а если 64 то 64)
Очевидно в новом C# такие штуки как scan0 по дефолту принимают уже nint а не IntPtr (в вб.нет этого nint вообще нет, но если он правда появился только в новой версии С#, это объясняет почему его нет вб.нет)
Наверное это сделано впервую очередь, для того чтобы на каждую разрядность код был относительно универсальный.

Т.е можно попробовать PTR объявить как nint. Но опять-же, нужно будет в функциях из DLL передавать его через каст или через ToInt64().

//

Mikle

в LoadFromBitmap

                Sprite Spr = new Sprite(BmpDest);
                LoadFromSprite(Spr, Trans, W, H, ColorKey);
                Spr = null;

Spr = null; это вместо .dispose()?

Он у меня тут тоже ругается, что мол нулл присваиваешь. Причем если Spr объявить как nullable, то тогда когда присваеваешь null он говорит что unnecessary assignment

А почему не прикрутил диспоз к спрайту?
Я так понял там нужно интерфейс делать, и я по какой-то причине очень плохо понимаю как с интерфейсами работать.
Мне даже чел проггер объяснял я все равно ничего не понял)))

Т.е у тебя там финалайз, который в C# это ~ деструктор.
Но я так и не понял, он выполняется сам? Т.е он не вызывается вручную, его вызывает Сборщик Мусора, когда объект больше не нужен?

#232
(Правка: 20:39) 20:03, 7 окт 2023

Дописал класс.
Первый запуск выдал ошибку, и тут я выяснил что в С# объявление массива по количеству элементов, а не по номеру последнего индекса как в вб. Убрал -1 из массивов.
Работает... но рисует зеркально. Наверное гдето с трансформом накосячил.

ps
в общем проверил, создал спрайт, закрасил ректангл, вверху спрайта
            TestSprite.ClearRect(128, (512-128), 0, 256, Color.Black.ToArgb());

но при паинттодевайсе он рисуется внизу, т.е отзеркалено (по вертикали)
так-же как если с файла или из битмапы подцепить картинку

вот только я не пойму, на каком этапе это происходит
я проверил сейчас цепочку процедур, вроде все как надо.

не могу понять в чем дело, и под вечер уже голова не соображает.

#233
20:50, 7 окт 2023

SilentPrayerCG
> А почему не прикрутил диспоз к спрайту?
VB многое делает сам, автоматом.
SilentPrayerCG
> рисует зеркально
Скинь проект, гляну.

#234
20:55, 7 окт 2023

Mikle
Мне кажется надо прикрутить диспоз.
Я правда до сих пор не могу понять, в чем разница.
ну т.е если я просто напишу метод диспоз
и засуну туда обнуление всего и free сделаю gHC как в финалайзере.
чтобы явно задиспозить, как с битмапом.
т.е в чем именно прикол инхеритить этот диспоз?

https://mega.nz/file/PLBUiRiL#qX4l55KDnzwKN4zi5OE0A1lViH-Q2xFHigMmywTWsFs
вот проект

#235
21:03, 7 окт 2023

SilentPrayerCG
> до сих пор не могу понять, в чем разница.
На один объект может быть несколько ссылок. Когда ты приравниваешь одну объектную переменную другой, ты не создаёшь новый объект, ты только дублируешь ссылку. VB сам считает ссылки на объекты, в тот момент, когда все ссылки уничтожены (занулением), VB сам уничтожит объект, это автоматическая сборка мусора.
Как сейчас ведёт себя C#, не знаю, буду проверять. В C++ нужно самому уничтожать отдельно объект и все ссылки на него.

#236
21:22, 7 окт 2023

Mikle
Да это я помню, что в С++ там самому надо все делать.

То что если приравнять объект, он не просто скопируется, это я помню.
Но если задиспозить 1, то остальные тоже помрут.

А спрайт? Если Спрайт1 = Спрайт2, это будет один и тот-же объект? Я что-то не помню уже.

#237
22:07, 7 окт 2023

SilentPrayerCG
> Если Спрайт1 = Спрайт2, это будет один и тот-же объект?
Конечно. Чтобы дубль сделать, там есть LoadFromSprite().

#238
22:14, 7 окт 2023

Mikle
Я так понимаю это поведение не надо специально прописывать, это просто классы так работают?

В общем битмап по какой-то причине всетаки требует его диспозить вручную, мне кажется логично добавить в спрайт такой функционал.
По крайней мере для того момента, где у тебя внутри спрайта создается какой-то временный спрайт, и потом ему приравнивается тупо null
На что студия в под с# плюется в итоге и говорит это нафиг не надо.

Я кстати нашел, в настройках компилятора можно nullable поведение менять, там несколько опций, можно сделать, чтобы было как раньше, похоже.

#239
(Правка: 12:54) 12:28, 8 окт 2023

Mikle
Чекнул, сохраненный файл не отзеркален.
Значит дело не в рисовке и init'e а в именно в выводе на контрол. Но не пойму, что там может быть не так.

ps

в 32битном с# Bits передается как ref

[System.Runtime.InteropServices.DllImport("gdi32")]
    private extern static int SetDIBitsToDevice(HandleRef hDC, int x, int y, int Dx, int Dy, int SrcX, int SrcY, int Scan, int NumScans, ref int Bits, ref BITMAPINFO BitsInfo, int wUsage);

а в вб.нет там pBits и он не реф

я попытался поставить реф. тогда в паинт то девайсе PTR требуется подать через реф тоже.

в итоге "поймал другой канал"))
там то кусок скриншота окна какого-то, то "помехи"
видимо что-то из памяти

я в упор не вижу что не так. по крайней мере если сравнивать вб версией 64битной.

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