PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка


Вопросы новичка

Сообщений 931 страница 960 из 1000

931

Lucagin написал(а):

Это чем-то определено?

Операцонная система многозадачна и обслуживает сразу много программ, а на это нужно время.
Кроме того, если частота обновления экрана, равна 60 Гц, то период обновления составляет 16 мс, вот и не успевает вся картинка отобразиться.

0

932

Пётр написал(а):

Операцонная система многозадачна и обслуживает сразу много программ, а на это нужно время.Кроме того, если частота обновления экрана, равна 60 Гц, то период обновления составляет 16 мс, вот и не успевает вся картинка отобразиться.

А какая зависимость частоты экрана от Мсек? На 120 Гц сколько можно будет выжать Мсек, 9 или больше?
Попробовал на 1024х768 (120 ГЦ) потолок 15-16 Мсек... :'(

Вто здесь, Сравнение быстроты выполнения кода  обсуждается оценка быстродействия программы. Не очень понял,  оценивается время выполнения самого (пустого) цикла For i=0 To 10000000 внутри кода программы, или внутрь этого цикла надо поместить тестируемый  код?

Отредактировано Lucagin (15.12.2010 18:20:19)

0

933

Lucagin написал(а):

А какая зависимость частоты экрана от Мсек?

Вот посчитать можно

Код:
x=60 ;Указываем частоту обновления экрана в Герцах.
t.f=1/x*1000
Debug t ; Период обновления экрана в миллисекундах.
Lucagin написал(а):

Не очень понял,  оценивается время выполнения самого (пустого) цикла For i=0 To 10000000 внутри кода программы, или внутрь этого цикла надо поместить тестируемый  код?

Там цикл только для примера, в место него должен быть код, быстродействие которого проверяется

Код:
Start=ElapsedMilliseconds()

; Тут код, скорость работы которого нужно узнать.

Stop=ElapsedMilliseconds()-Start
MessageRequester("","Этот код выполнялся "+Str(Stop)+" миллисекунд")

0

934

Пётр написал(а):

Там цикл только для примера, в место него должен быть код, быстродействие которого проверяется Код:
Start=ElapsedMilliseconds()

; Тут код, скорость работы которого нужно узнать.

Stop=ElapsedMilliseconds()-Start
MessageRequester("","Этот код выполнялся "+Str(Stop)+" миллисекунд"

Т.е. так можно примерно оценить время отображения картинки на экране?

Код:
 ElseIf Event=#PB_Event_Gadget
    If Gadget=#Button_0
      Start=ElapsedMilliseconds()
      
          SetGadgetState(#Image_0, ImageID(0))           
            EndTime=ElapsedMilliseconds()+Result
              Repeat
                WaitWindowEvent(1)
              Until ElapsedMilliseconds()>EndTime
          SetGadgetState(ID, 0)       
      Stop=ElapsedMilliseconds()-Start
      MessageRequester("","Этот код выполнялся "+Str(Stop)+" миллисекунд")
    EndIf    
  EndIf

Выдает значение: от 15 до 31 Мсек (чаще всего 16 Мсек), при значении бегунка от 1 до 16 Мсек (частота экрана 60 Гц)......

Отредактировано Lucagin (15.12.2010 18:53:22)

0

935

Lucagin написал(а):

Выдает значение: от 15 до 31 Мсек, при значении бегунка в 1 Мсек......

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

0

936

Пётр написал(а):

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

Как не странно при варианте с  delay, при бегунке (1 до 10) значения более стабильные от 0 до 16 Мсек.

Код:
;{константы
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0
  #Button_0
  #Text_0
  #TrackBar_0
EndEnumeration

UseJPEGImageDecoder()

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 48)
Global FontID2
FontID2 = LoadFont(2, "Arial", 26)
Global FontID3
FontID3 = LoadFont(3, "Arial", 12)
Global FontID4
FontID4 = LoadFont(4, "Arial", 20)
Global FontID5
FontID5 = LoadFont(5, "Arial", 16)
Global FontID6
FontID6 = LoadFont(6, "Arial", 14)
;- Image Plugins

;- Image Globals
Global Image0

;- Catch Images
Image0 = CatchImage(0, ?Image0)

;- Images
DataSection
Image0:
  IncludeBinary "1.jpg"
EndDataSection
;}

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 465, 101, 782, 729, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#Image_0, 140, 10, 500, 500, 0)
      ButtonGadget(#Button_0, 380, 590, 230, 100, "Загрузить")
      SetGadgetFont(#Button_0, FontID2)
      TextGadget(#Text_0, 40, 640, 240, 30, "Время задуржки: 1 Мсек")
      SetGadgetFont(#Text_0, FontID6)
      TrackBarGadget(#TrackBar_0, 30, 590, 240, 40, 1, 100)
      
    EndIf
  EndIf
EndProcedure


Open_Window_0()

;{Основной цикл
Repeat
  Event = WaitWindowEvent()
  Gadget = EventGadget()
  
  If Gadget=#TrackBar_0
      Result = GetGadgetState(#TrackBar_0)
      SetGadgetText(#Text_0,"Время задержки: " +Str(Result)+"Мсек")
      
  ElseIf Event=#PB_Event_Gadget
    If Gadget=#Button_0
      Start=ElapsedMilliseconds()
      
          SetGadgetState(#Image_0, ImageID(0))       
          Delay(Result)
          ;EndTime=ElapsedMilliseconds()+Result
          ;Repeat
            ;WaitWindowEvent(1)
          ;Until ElapsedMilliseconds()>EndTime
          SetGadgetState(ID, 0)       
      Stop=ElapsedMilliseconds()-Start
         MessageRequester("","Этот код выполнялся "+Str(Stop)+" миллисекунд")
    EndIf    
  EndIf    
 Until Event=#PB_Event_CloseWindow
 ;}
 
End

Отредактировано Lucagin (15.12.2010 19:06:58)

0

937

Вот обсуждение подобной проблемы, но в дельфи http://programmersforum.ru/showthread.php?t=111839

Lucagin написал(а):

Как не странно при варианте с  delay, при бегунке (1 до 10) значения более стабильные от 0 до 15 Мсек.

У меня при этом выдает или 0 или 15, но бывает и 16

0

938

Пётр написал(а):

У меня при этом выдает или 0 или 15, но бывает и 16

А применения таймера Droopy's Lib не дас лучших результатов???

Из этого обсуждения  я так понял второй вариант более точный или они равнозначны??? http://purebasic.mybb.ru/viewtopic.php?id=135#p2026

Отредактировано Lucagin (15.12.2010 19:12:59)

0

939

Lucagin написал(а):

А применения таймера Droopy's Lib не дас лучших результатов???

Все равно все упирается в операционную систему.

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

Код:
Procedure MiniDelay(Delay.q)
;Процедура формирует миллисекундную паузу.
; Delay - время задержки, заданное в миллисекундах.
 
Protected A.l, i.l, msek.d, C.d
Protected Ctr1.LARGE_INTEGER, Ctr2.LARGE_INTEGER, Freq.LARGE_INTEGER, Overhead.LARGE_INTEGER 

  msek.d=Delay/1000
  If QueryPerformanceFrequency_(Freq) 
    QueryPerformanceCounter_(Ctr1) 
    QueryPerformanceCounter_(Ctr2) 
    Overhead\lowpart = Ctr2\lowpart - Ctr1\lowpart  ; determine API overhead 
    QueryPerformanceCounter_(Ctr1)                  ; start time loop 
    While C.d < msek                                ; выход из цикла будет только если пройдёт указанное кол-во времени 
     a+1 
     QueryPerformanceCounter_(Ctr2) ; end time loop 
     C.d=(Ctr2\lowpart - Ctr1\lowpart - Overhead\lowpart) / Freq\lowpart 
    Wend                
  EndIf 
EndProcedure

;Start=ElapsedMilliseconds()
MeasureHiResIntervalStart()

MiniDelay(10)

;Stop=ElapsedMilliseconds()-Start
Stop.f=MeasureHiResIntervalStop()*1000
MessageRequester("","Этот код выполнялся "+Str(Stop)+" миллисекунд")
Lucagin написал(а):

Из этого обсуждения  я так понял второй вариант более точный или они равнозначны???

При подсчете времени он более точный.

0

940

Пётр написал(а):

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

Очень интересная процедура, надо будет ее запомнить!!  Я думаю, порог в 16 Мсек не преодолеть, частота экрана особо не влияет... на 120 Гц теже результаты...
А вес загружаемой картинки как-то влияет на время его отображения на экране? Какие есть пределы веса, которые заметно “просадят” время отображения? Есть какие-то рекомендации по использованию картинок? (до какого веса)..?? Или чем меньше тем лучше.. :о) Интересно картинка в 1 Кбайт позволит получить лучшие показатели?

Отредактировано Lucagin (15.12.2010 19:39:54)

0

941

Lucagin написал(а):

А вес загружаемой картинки как-то влияет на время его отображения на экране?

Чем больше размер картинки, тем больше нужно времени для её отображения на экране.

0

942

Пётр написал(а):

Чем больше размер картинки, тем больше нужно времени для её отображения на экране.

Уменьшил картивку до 17 Кб разницы 0...

увеличить

Отредактировано Lucagin (15.12.2010 19:44:29)

0

943

Я не про килобайты писал, а про ширину и высоту картинки.

0

944

Пётр написал(а):

Я не про килобайты писал, а про ширину и высоту картинки.

Нет я имел ввиду Вес в Кбай. Тут есть какие-то рекомендации(безболезненный предел). Фотка в 3 мега и 100 Кбайт с одинаковым рамером (WхH) будут ведь по разному загружать программу. Пробовал растягивать объекты куда загружены фотки в 3 мега и 100 Кбайт. Эффект заметен…

Т.е. я так понял, время занимает зажигание пикселей на мониторе. Т.е чем меньше размер картинки (WхH), тем меньше «лампочек» надо зажечь и => надо меньше времени на прорисовку… А вот интересно если мы используем картинку на прозрачном фоне (картинка от размера занимает 50% остальное прозрачный фон), на прорисовку прозрачного фона время будет тратится???

Отредактировано Lucagin (15.12.2010 20:12:11)

0

945

Lucagin написал(а):

Нет я имел ввиду Вес в Кбай.

Имеет значение в основном только ширина и высота, а также глубина цвета.
Дело в том, что сжатые форматы (типа JPG, PNG и др.) разжимаются при загрузке в программу, поэтому не должно быть разницы с скорости отображения, скажем BMP и JPG картинок одинакового размера и глубины цвета.
Если у картинки есть альфа канал, то но тоже может негативно сказаться в скорости отображения на экране.

Lucagin написал(а):

А вот интересно если мы используем картинку на прозрачном фоне (картинка от размера занимает 50% остальное прозрачный фон), на прорисовку прозрачного фона время будет тратится???

Да и я думаю что даже больше чем на обычный цвет.

0

946

Пётр написал(а):

Имеет значение в основном только ширина и высота, а также глубина цвета.Дело в том, что сжатые форматы (типа JPG, PNG и др.) разжимаются при загрузке в программу, поэтому не должно быть разницы с скорости отображения, скажем BMP и JPG картинок одинакового размера и глубины цвета.Если у картинки есть альфа канал, то но тоже может негативно сказаться в скорости отображения на экране.

ДА???  :huh:  Т.е. что получается, я могу не экономить на весе фотки. Использовать качественные BMP и не париться, что будут тормаза...  Очень неожиданно, всегда полагал, что вес фотки для программы имеет принципиальное значение…  А как обработать фотку чтобы прозрачность не влияло на время обработки… ??  Глубина цвета (число цветов) играет значение, значит использование Gif самое оптимальное??? Он ведь самый экономный в плане кол. цветов  формат?

Отредактировано Lucagin (15.12.2010 20:32:08)

0

947

Lucagin написал(а):

что получается, я могу не экономить на весе фотки. Использовать качественные BMP и не париться, что будут тормаза...

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

0

948

Пётр написал(а):

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

А вот такая ситуация. Есть картинка 800х600, где она будет быстрее отображаться (при прочих равных) на экране с разрешением 800х600 или на разрешении 1600х1200… в первом случае “область зажигания лампочек” весь монитор, во втором случае окно в пол экрана… или пикселей одинаковое количество зажигается? А как при этом быть с CRT ?

Отредактировано Lucagin (Сегодня 20:31:17)

Отредактировано Lucagin (15.12.2010 20:34:57)

0

949

Lucagin написал(а):

А вот такая ситуация. Есть картинка 800х600, где она будет быстрее отображаться (при прочих равных) на экране с разрешением 800х600 или на разрешении 1600х1200… в первом случае “область зажигания лампjчек” весь монитор, во втором случае окно в пол экрана

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

0

950

Пётр написал(а):

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

Отсюда мораль,- делаем игры на разрешение экрана не более 800х600, оптимизируем не только вес фотки, но и ее глубину цвета и канал прозрачности (на сколько я понял,  лучше, когда фотка 100 не прозрачна). Отсюда разумный вывод Gif лучший для этого вариант. Почему тогда в PB работа с ним максимально нивелирована. В ImageGadget штатными средствами нельзя загрузить даже статичный gif? Почему такая “не любовь” к этому формату? У Gif и прозрачку сделать проще чем на PNG…

Отредактировано Lucagin (15.12.2010 20:55:03)

0

951

Lucagin написал(а):

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

В 3D играх совсем другие законы.
Там большую часть работы выполняет не процессор компа, а процессор видеокарты.
Например, вот 3D демка, которая за секунду прорисовывает экран 700 раз (сильно зависит от мощности видео) http://depositfiles.com/files/zaxfnsdvd

Что касается GIF, то с помощью этой процедуры можно его загрузить:

Код:
Procedure LoadGIF_Mem(*GIF, GIF_Size, Image)
Protected ImageID=0
  HGLOBAL    = GlobalAlloc_(#GMEM_MOVEABLE, GIF_Size)
  If HGLOBAL 
  pvData = GlobalLock_(HGLOBAL)
  CopyMemory(*GIF, pvData, GIF_Size)
  GlobalUnlock_(HGLOBAL)  
  
    If CreateStreamOnHGlobal_(HGLOBAL, #True, @pstm.IStream) = #S_OK  
      If OleLoadPicture_(pstm, GIF_Size, #False,?IID_IPicture, @Bild.IPicture) = #S_OK  
        Bild\get_Height(@Height)  
             Bild\get_Width(@Width)  
              
             hDC = GetDC_(GetDesktopWindow_())  
             ScreenPixels_X = GetDeviceCaps_(hDC,#LOGPIXELSX)  
             ScreenPixels_Y = GetDeviceCaps_(hDC,#LOGPIXELSY)  
             ReleaseDC_(GetDesktopWindow_(),hDC)  
  
             PicHeight = (Height * ScreenPixels_X) / 2540  
             PicWidth  = (Width  * ScreenPixels_Y) / 2540  
              
             result = CreateImage(Image,PicWidth,PicHeight)  
              
             If result  
               hDC = StartDrawing(ImageOutput(Image))  
                 Bild\Render(hDC,0,PicHeight,PicWidth,-PicHeight,0,0,Width,Height,0)  
               StopDrawing()  
             EndIf  
             
             ImageID=result
              
             Bild\Release()    
           pstm\Release() 
     EndIf
    EndIf
  EndIf
ProcedureReturn ImageID
EndProcedure

Она взята из этой программы Прога, проверяющая пригодность телефонной линии для ADSL интернета

0

952

Пётр написал(а):

В 3D играх совсем другие законы.Там большую часть работы выполняет не процессор компа, а процессор видеокарты.Например, вот 3D демка, которая за секунду прорисовывает экран 1000 раз (сильно зависит от мощности видео) http://depositfiles.com/files/zaxfnsdvd

Очень красиво. Мир создания 3D игр для меня пока как китайская азбука. Но когда-нибудь надеюсь освою и это… :о)) Не без вашей конечно помощи …:о)) Ребят спасибо вам огромное, что тратите своё время, разъясняя бесспорно очевидные для вас вещи, но без таких как вы, мир программирования  был бы не доступен для миллионов обычных  ребят, которые потом донесут эту науку другим… Коллективом только и выживаем :о)  Низкий вам Поклон!!! Пётр, тебе ОСОБАЯ, ОГРОМНАЯ БЛАГОДАРНОСТЬ!!! :о)  Код загрузки gif обязательно изучу, но скорей бы уж перейти от гаджетов, хотябы к 2D программированию :о))  Сейчас, если найду, постараюсь выложить часы, сделанных в алгоритме с помощью gif. Не судите строго, часы примитивные, во многом не доведенные до завершения,  но надо иметь ввиду, что в алгоритме нет возможности поворота изображения, так что это возможно единственные часы сделанные штатными средствами и  не электронные :о)

Отредактировано Lucagin (15.12.2010 21:23:37)

0

953

Lucagin написал(а):

часы

Вот тут есть несколько кодов часов http://purebasic.info/phpBB2/viewtopic.php?t=928

0

954

Пётр написал(а):

Вот тут есть несколько кодов часов http://purebasic.info/phpBB2/viewtopic.php?t=928

Мои конечно не такие крутые, но что смог штатными средствами алгоритма.. :о)  за черный ободок (12_9_6_3 часов) их можно перемещать удерживая мышкой, двойной клик по часам их отключает… Секунды могут чуть спешить, у меня они отставали, прибавил похоже много, но не суть, переделывать уже нет смысла..… :о)
http://willvs822.ifolder.ru/20829409

0

955

В первую минуту немного отставали, а потом пошли нормально.

Кстати, при загрузке появилось окно что нет рисунка.

увеличить

0

956

Пётр написал(а):

Кстати, при загрузке появилось окно что нет рисунка.

ДА, странно а что циферблат или стрелки или секунда не видны???

0

957

Lucagin написал(а):

ДА, странно а что циферблат или стрелки или секунда не видны???

Видны.
Наверное нет одного рисунка из нескольких необходимых.
Точнее, указан абсолютный путь к этому рисунку.

0

958

Пётр написал(а):

Видны.

Странно, вроде ушел от прямых ссылок, может, где-то внутри какая-то ссылка прямая не затерта... Сейчас конечно всё это смешно смотрится, но учитывая, что объекты в алгоритме не вращаются, смог только так придумать... :о) там всего 3-ри рисунка: Циферблат, синий круг от стрелок и gif-секундная стрелка, все...

Ладно, будем делать нормальные часы, нормальными средствами, а не  выдумывать велосипед... ;)

Отредактировано Lucagin (15.12.2010 22:29:08)

0

959

Пётр написал(а):

Она взята из этой программы Прога, проверяющая пригодность телефонной линии для ADSL интернета

Попробовал твою программу для оценки качества линии для ADSL. У меня правда не D-link,а ZXDSL831a, но тоже  вроде работает… вот только результат не очень ясен.? :о)) В моем случае этот график – это хорошо или плохо?   :dontknow: Хорошо бы посмотреть среднестатистический график, чтобы было с чем сравнить   :writing:

увеличить

Отредактировано Lucagin (15.12.2010 23:54:07)

0

960

Lucagin написал(а):

вот только результат не очень ясен.?

Судя по провалам на первом (верхнем) графике, есть несколько селективных помех, наверное по близости имеются пара средневолновых передатчиков, работающих на частотах примерно 575, 640 и 654 КГц (это самые мощные, которые сводят на нет возможности использования этих каналов) и не нескольких других.
Но в целом, линия нормальная, думаю до 4мб/с можно из неё выжать.

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

На этих графиках показано состояние линии во всей используемой полосе частот.

Lucagin написал(а):

ZXDSL831

Значит он совместим с D-link по Telnet командам.

Вот моя линия (ADS2+)

увеличить

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка