Общество изобретателей велосипедов
GameDev.ru / Сообщества / Вело-изобретатели / Форум / 2D движок SR2D, Софтверный движок для работы с 2D графикой на VB6, vb.net, C# (30 стр)

2D движок SR2D, Софтверный движок для работы с 2D графикой на VB6, vb.net, C# (30 стр)

Поделиться

Страницы: 1 2 3 4 ... 16 ... 29 30 31 32 33 Следующая

MikleМодераторwww26 ноя. 201510:31#435
Strike100
Я с таким сталкивался, когда использовал асинхронный опрос клавиатуры через API, но в этой программе нет ничего подобного, тут обычное событие окна KeyDown.
AWPStarУчастникwww3 янв. 20164:39#436
Переписал класс для работы с текстом. Теперь, после инициализации класса, чтобы нарисовать текст нужна только одна функция.
Убрал лишнее. Появились проверки на ненужные действия. Теперь работает быстрее.
Не обязательно хранить отдельно спрайт.
При инициализации(InitFont), можно менять толщину текста, цвет фона(если есть), способ прорисовки.
Устранил утечки памяти.
Добавил создание временного шрифта в памяти через AddFontMemResourceEx. Можно загружать из файла или памяти.
Возможно выравнивание текста по горизонтали и вертикали.

Идет в комплекте с классом для работы с битмапами.

InitFont, CreateTempFontFromFile, CreateTempFontFromMem

Sub InitFont(FontName As String, FontSize As Long, Optional FC As FontQuality = 4, Optional fnWeight As Long = 300)
Sub CreateTempFontFromFile(fn As String)
Sub CreateTempFontFromMem(b() As Byte, ByVal ln As Long)

Названия корявые, но я не знал как правильно обозвать.

Перебрал старую функции MakeText. С её помощью, из текста создается спрайт.

Sub MakeText(DS As SR2D_Sprite, txt As String, FontColor As Long, Alpha As Boolean, Optional ByVal BackColor As Long = 0)

Добавил новую функцию(ради чего и начал переписывать).
Спрайт храниться внутри самого класса.

Sub DrawText(dst As SR2D_Sprite, ByVal x As Long, ByVal y As Long, txt As String, Optional ByVal FontColor As Long = &HFF808080, Optional ByVal BackColor As Long = 0, Optional ByVal Align As TextAlign = 0, Optional ByVal Alpha As Boolean = True, Optional op As SR2D_Op = OpAlphaBlend)

Надеюсь пригодиться.


SR2DFont
Зеркало на Яндексе

MikleМодераторwww3 янв. 201610:49#437
Полезная штука, можно теперь не использовать костыли с невидимой картинкой на форме.
AWPStarУчастникwww4 янв. 20160:24#438
Думаю, надо еще сделать тэги для текста. В стиле q3. И прикрутить кастомные таблицы символов.
SilentPrayerCGПостоялецwww20 фев. 201620:40#439
Привет.
А DrawRotate с антиалиасингом где-нибудь можно взять?
MikleМодераторwww20 фев. 201621:14#440
SilentPrayerCG
Там есть АА, в DrawRotate есть Optional параметр "AA" в конце, после "Angle". Подставь туда True.

Правка: 20 фев. 2016 21:26

SilentPrayerCGПостоялецwww22 фев. 201610:07#441
Mikle
Елки палки, а я чет решил, что это альфа канал. Невнимательно посмотрел.
SilentPrayerCGПостоялецwww23 фев. 201611:21#442
Вот сделал список спрайтов (именно список (list of spite), не просто массив... может из-за этого конечно)
256 штук размером 1024х1024
и уже
An unhandled exception of type 'System.OutOfMemoryException' occurred in SR2D_template.exe

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

MikleМодераторwww23 фев. 201613:46#443
256 спрайтов 1024*1024 - это 1 Гб памяти. А сколько у тебя ОЗУ физически, сколько из них свободно?
И ещё, что за список? Надеюсь, туда помещается не копия спрайта, а ссылка на него?

Правка: 23 фев. 2016 13:49

SilentPrayerCGПостоялецwww23 фев. 201613:52#444
Mikle
Ну да.. и по диспетчеру примерно чуть больше гига ехешник занимал.

Гигов у меня 16, но раз приложение 32битное, то больше 3ех или 4ех оно использовать не сможет.

ошибка выскакивает в ините к редимится cbuf
ReDim cBuf(meWidth * meHeight - 1)

я наводил на переменные, показывает что обе 1024

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

может это из-за чего-то еще... я не уверен уже..

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

хочу попробовать сделать без списка спрайтов, по-другому немного.

MikleМодераторwww23 фев. 201614:07#445
SilentPrayerCG
Только что на VB6 сделал такой тест:
Option Explicit

Dim Spr(255) As New SR2D_Sprite

Private Sub Form_Load()
  Dim i As Long

  Move Left, Top, Width - Screen.TwipsPerPixelX * (ScaleWidth - 1024), Height - Screen.TwipsPerPixelY * (ScaleHeight - 1024)
  ScaleMode = vbPixels
  Show
  For i = 0 To 255
    Spr(i).Init 1024, 1024
    Spr(i).ClearBuffer Rnd * &HFFFFFF
  Next i
  While DoEvents
    i = (i + 1) And 255
    Spr(i).PaintToDevice hDC
  Wend
End Sub

Работает без проблем.
SilentPrayerCGПостоялецwww23 фев. 201614:17#446
Mikle
а в вб6 листов нет?

я делал так примерно

dim sprite1 as new sprite (1024,1024)
sprite1.clearbuffer(argb(0,0,0,0))

dim spritelist as new list(of sprite)


for n as integer=0 to 255
  spritelist.add(new sprite(sprite1))
next

и дальше потоки работают еще со своими спрайтами, и потом рисуют себя в соответствующий спрайт из списка (т.е 256 слоев, нужно последовательно было нарисовать туда, сделанные в потоках картинки)

я как-бы не проверял

но ругается на инит процедуру

и указывает прямо на неё, а значит это не поток скорее всего

я сделал вывод что выдает ошибку именно при заполнении списка

поскольку когда я уменьшал количество элементов, дальше ошибок не было.


ps.

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

pps.

да.. похоже все-таки это в потоке происходит
заколебаюсь отслеживать

в общем поток такой (наверняка индусский, и я решил сократить время на гимор, и не стал делать 6-8 потоков, под ядра, а сделал по потоку на слой, по идее все равно винда распределяет нагрузку между потоками на все ядра)
поток должен заполнять спрайт рандомными кубиками указанного цвета, а потом нарисовать их на один основной спрайт

к слову несколько предыдущих версий, и эта версия если не выставлять 256 слоев потоков, они в итоге все равно какой-то неправильный результат дают...
не такой как получалось когда я на 1ом ядре все считал. я хотел сначала разобраться с последовательным выводом всего этого на спрайт, а потом уже поковырять сам поток и посмотреть, что я не так сделал

но у меня такое чувство, что я уже в целом все делаю не так

  Private Sub DrawLayer(param)
        Dim Color As Integer = param(0) ' цвет от 0 до 255, каждый цвет это поток
        Dim ResW As Integer = param(1) ' разрешение текстурки
        Dim ResH As Integer = param(2)
        Dim Samples As Integer = param(3) ' количество кубиков которые будут нарисованы на слое
        Dim Idx As Integer = param(4) ' это для 3ьей версии вывода на одну текстуру, индекс потока его позиция, 
              т.е. темные цвета имеют самую низкую позицию и должны нарисоваться на 
              основную текстуру первым делом

        Dim BlockSize As Integer ' размер кубика
        Dim Block As Sprite         ' сам спрайт кубика
        Dim X, Y                         ' координаты

        Dim Layer As New Sprite(ResW, ResH) ' создается пустой слой-спрайт

        Layer.ClearBuffer(ARGB(0, 0, 0, 0))   ' заливается пустотой как-бы ( я правда не помню, он может сам по себе пустой создается, может это не нужно)

        For S As Integer = 0 To Samples - 1 'цикл по рисованию указанного количества кубиков

            BlockSize = 13 + Rand.Next(18)  ' рандомный размер для блока.
                ' rand объявлен как private rand as random, а его сид берется из поля для сида
                ' я подумал, что если потоков много то правильнее будет если они будут брать
                ' данные из одного рандома, может быть и не правильно, я уже не уверен
                ' может нужно объявлять в каждом свой рандом

            Block = New Sprite(BlockSize, BlockSize)              ' создается спрайт для кубика
            Block.ClearBuffer(ARGB(255, Color, Color, Color))  ' закрашивается в указанный цвет

            X = Rand.Next(ResW) ' рандомная позиция
            Y = Rand.Next(ResH)

            Layer.DrawRotate(Block, BlockSize / 2, BlockSize / 2, X, Y, Rand.Next(359) + Rand.NextDouble, True)
    ' рисуется на пустом слое кубик с рандомной позицией и рандомным углом поворота
        Next

  
        Do Until Idx = DrawIndex
            ' ждет пока некий глобальный индекс будет равен индексу этого потока
      ' если равен продолжает дальше
            Thread.Sleep(1000)
        Loop
  
  ' и рисует на глобальную текстуру пустой слой с альфасмешиванием. а после чего прибавляет индекс на единичку
  ' т.е следующий поток получит нужную ему цифру и сделает тоже самое, пока потоки не закончаться
  ' таким образом они последовательно нарисуют на основную текстуру все слои с кубиками
        SyncLock Texture
            Texture.Draw(Layer, 0, 0, Op.AlphaBlend)
        End SyncLock

        DrawIndex += 1


    End Sub

наверняка я что-то делаю по индусски, или вообще не правильно
если я закоменчиваю последние do until и то что в synclock то ошибка с аут оф мемори не выскакивает

ppps

я вот сейчас, после синк лока, добавил паинт до девайс.
и запустил не 256 на чуть меньше потоков, 239 гдето
и они отрендерились

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

проще наверное сделать просто в одном цикле как я до этого делал, и легче отлаживать, и не на столько долго это делается

просто как обычно, я хотел перевести на потоки, что-бы максимально быстро делалось, и весь процессор использовало а не только 1 ядро
и в конечном итоге у меня ничего не получилось, и я начинаю уже путаться в коде...

Правка: 23 фев. 2016 15:00

SilentPrayerCGПостоялецwww23 фев. 201615:23#447
Извиняюсь за длиннопост конечно..

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

а тут без синк лока, 6 потоков рисуют на один спрайт цветные кубики

нагрузка на процессор 90-95

т.е задействуются все 6 ядер.

В таком случае я все просто сейчас кардинально переделаю, и будет работать, и будет полностью использовать процессор.

Блин, это одна из самых крутых фич наверное, не нужно мучиться с синхронизацией доступа к объекту.

Вот бы все-таки еще 64 битную версию, которую я пообещал не выклянчивать :D

MikleМодераторwww23 фев. 201615:49#448
SilentPrayerCG
> я тут выяснил, что N потоков могут одновременно рисовать на 1 спрайт, и при
> этом не вызывать ошибок синхронизации
Так я, вроде бы, уже писал, что это возможно.
SilentPrayerCGПостоялецwww23 фев. 201616:22#449
Mikle
Я видимо упустил этот момент.

Страницы: 1 2 3 4 ... 16 ... 29 30 31 32 33 Следующая

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

2001—2017 © GameDev.ru — Разработка игр