Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Библиотеки

Библиотеки Сторонние библиотеки для Blitz

Ответ
 
Опции темы
Старый 06.04.2012, 19:23   #1
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Использование FastPointer

Проблема заключается в моем представлении о многопоточности. Если судить с примера звука в блице. Команда EmitSound(S,E) издает звук, и в не зависимости от того какой он длинны (3сек, 15сек и >) вся другая логика продолжается. То есть я делаю вывод что обработка звука пошла в другой независимый поток.
Я скачал FastPointer библиотеку и разбирал примеры лежащие в ней. Хотел б рассмотреть конкретный случай с вызовом функций:
MyFunctionFirstPointer = FunctionPointer();Это как я понимаю процесс 
;привязки функции к переменной, которую мы сможем в любой момент вызвать.


	Goto skip
	MyFunctionFirst(); Тогда зачем это?
	.skip
	
;Было б проще понять следующий метод описывания переменной для привязки:
;MyFunctionFirstPointer = FunctionPointer(MyFunctionFirst())[
; Ну да тут ладно. В примере с Массивами это выглядит не так уж непонятно.

MyFunctionSecondPointer = FunctionPointer(); дубль два
	Goto skip1
	MyFunctionSecond(0)
	.skip1


;Вот это место как я понял должно мне сообщить что то очень важное...
;Но погуглив я понимаю только что Hex() переводит число в 16численную систему
;А саму суть не уловил.
Print "First function pointer: $"+Hex(MyFunctionFirstPointer)
Print "Second function pointer: $"+Hex(MyFunctionSecondPointer)


;И главное. Эти функции вызвались, и в моем понимании они должны пойти
;В другой независимый поток как в случае с EmitSound(S,E)
CallFunction (MyFunctionFirstPointer)
CallFunctionVarInt (MyFunctionSecondPointer,12345)




; Но немного отредактировав функции я вижу что вторая функция перед
;вступлением в дело ждет исполнения 1-й функции. Так хде ш тут многопоточность?
Function MyFunctionFirst ()
	Print "MyFunctionFirst called!"
	For j=1 To 100
	Print J
	Delay 10
	Next
End Function


Function MyFunctionSecond (variable)
	Print "MyFunctionSecond called with variable: "+Str(variable)
	For J=-100 To -1
	Print J
	Delay 10
	Next
End Function
Как я понимаю в моем случае блиц должен приблизительно по очереди выводить на экран 1, -100, 2, -99, 3, -98 и т.д.
Помогите пожалуйста понять, как в принципе устроена многопоточность и в частности эта библиотека?
Приветствуется посылания на хорошие статейки...
(Offline)
 
Ответить с цитированием
Старый 06.04.2012, 22:01   #2
Платон Александрович
Нуждающийся
 
Аватар для Платон Александрович
 
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений
(для 83 пользователей)
Ответ: Использование FastPointer

Сообщение от Halk-DS Посмотреть сообщение
	Goto skip
	MyFunctionFirst(); Тогда зачем это?
	.skip
Вычисление адреса функции с помощью этой библиотеки сделано "хаком", по сути дизассемблируется вызов функции и достается адрес. Чтобы функция при этом не выполнилась, ее вызов пропускается с помощью Goto (но код вызова при этом остается, из которого и достается адрес выше функцией FunctionPointer)

Сообщение от Halk-DS Посмотреть сообщение
;Вот это место как я понял должно мне сообщить что то очень важное...
;Но погуглив я понимаю только что Hex() переводит число в 16численную систему
;А саму суть не уловил.
Print "First function pointer: $"+Hex(MyFunctionFirstPointer)
Print "Second function pointer: $"+Hex(MyFunctionSecondPointer)
КЭП сообщает что тут печатаются адреса полученных функций

Сообщение от Halk-DS Посмотреть сообщение
Так хде ш тут многопоточность?
С чего вдруг тут должна быть многопоточность? Ты всего-лишь получил адеса функций, само выполнение их как было в главном потоке, так и осталось. Адреса же полученных функций ты можешь передать куда-нить, где по ним будут эти функции вызываться, например уже в другую библиотеку, которая будет создавать отдельные потоки, внутри которых и будут вызываться твои функции.
Сообщение от Halk-DS Посмотреть сообщение
Помогите пожалуйста понять, как в принципе устроена многопоточность и в частности эта библиотека?
Приветствуется посылания на хорошие статейки...
В гугле забанили?
Если кратко
Есть процесс, у него есть основной поток, и может быть несколько побочных потоков.
Проще говоря каждый поток представляет собой функцию.
Потоками рулит операционная система.
Можно насильно указать потоку на каком процессоре ему выполняться, иначе это решает система и ее планировщик.
Планировщик отдает каждому процессу и потоку определенное кол-во процессорного времени, понемногу продвигая каждый из потоков\процессов (виртуальная мультипоточность).
Т.к. потоки работают параллельно, общение между ними (чтение\запись данных) нужно синхронизировать, для этого в системе существуют несколько вещей (критические секции, мутексы, семафоры, атомарные операторы и т.п.)
В случае с блицем тебе нужно передать полученый адрес в функцию создания потока (в винде это CreateThread, в этой библиотеке кстати так-же называется ), так-же нужно позаботиться о том, чтобы передать в поток определенные данные (в той же системный CreateThread можно указать адрес блока памяти).

Вообще в fastpointer есть два примера работы с потоками - Example_ThreadUse и Example_ThreadUse2, смотри их.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
Hulk-DS (07.04.2012), St_AnGer (07.04.2012)
Старый 07.04.2012, 01:17   #3
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Использование FastPointer

Сообщение от Платон Александрович Посмотреть сообщение
Вообще в fastpointer есть два примера работы с потоками - Example_ThreadUse и Example_ThreadUse2, смотри их.
Это решило почти все вопросы и проблемы
Просто сам не додумался до конца досмотреть.


Сообщение от Платон Александрович Посмотреть сообщение
КЭП сообщает что тут печатаются адреса полученных функций
Ну в принципе это было настолько очевидно, что оно меня запутало


Сообщение от Платон Александрович Посмотреть сообщение
В гугле забанили?
Просто мне нужна была инфа про многопоточность в fastpointer. Ну а про многопоточность в общем можно и погуглить

В общем сенкс.
(Offline)
 
Ответить с цитированием
Старый 09.04.2012, 23:53   #4
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Использование FastPointer

На практике возникла проблема. Может кто сможет помочь, у меня во второй поток запущена функция вида:

Function UpdChunks()
   delay 1000
   For to - перебираем нужные чанки.
      If Chunk(x,y)=0 - если чанк в поле зрения и его не существует то:
         В этом месте создается меш, я делаю сразу на него ХайдЕнтити и в конце алгоритма, когда меш готов открываю его для рендера.
      EndIf
   Next
EndFunction
Результат странный. Как будто постройка чанка делается только на 1-2% из 100 и прерывается. Вот скрин:


(Эти кусочки - это места где начинает строится чанк, но до конца как видно дело не доходит...)

Кто нибудь уже пользовался библиотекой? Она нормальная? Или это я что то не то делаю?
(Offline)
 
Ответить с цитированием
Старый 10.04.2012, 16:10   #5
Платон Александрович
Нуждающийся
 
Аватар для Платон Александрович
 
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений
(для 83 пользователей)
Ответ: Использование FastPointer

Сообщение от Halk-DS Посмотреть сообщение
На практике возникла проблема. Может кто сможет помочь, у меня во второй поток запущена функция вида:

Function UpdChunks()
   delay 1000
   For to - перебираем нужные чанки.
      If Chunk(x,y)=0 - если чанк в поле зрения и его не существует то:
         В этом месте создается меш, я делаю сразу на него ХайдЕнтити и в конце алгоритма, когда меш готов открываю его для рендера.
      EndIf
   Next
EndFunction
Результат странный. Как будто постройка чанка делается только на 1-2% из 100 и прерывается.

Кто нибудь уже пользовался библиотекой? Она нормальная? Или это я что то не то делаю?
У тебя поток, после прохода по циклу for, завершается (происходит выход из функции). Чтобы он работал постоянно нужно еще один внешний цикл.
А вообще забудь про мультипоточность в блице для чего-то кроме обычных программ, нет гарантии что 3д\2д будет корректно работать в разных потоках. На твоем-же примере:
Сообщение от Halk-DS Посмотреть сообщение
В этом месте создается меш, я делаю сразу на него ХайдЕнтити и в конце алгоритма, когда меш готов открываю его для рендера.
Когда только ты создал меш, он УЖЕ находится в списке рендерера, который в основном потоке УЖЕ имеет к нему доступ, и из-за асинхронности работы этих потоков ты просто рано или поздно схватишь MAV. Все эти библиотеки - костыли и хаки, и работать как положено они не будут.
Ты просто выбрал не тот инструмент.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
Hulk-DS (10.04.2012), St_AnGer (10.04.2012)
Старый 10.04.2012, 19:56   #6
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Использование FastPointer

Сенкс. Понял...
(Offline)
 
Ответить с цитированием
Старый 02.09.2012, 23:15   #7
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Использование FastPointer

Использовал FAST Pointer Thread чтобы RakNET был не зависим от рендера Blitz3D - результат положительный.
(а то до этого из 200 передач на сервер передавались 150, и обратно на клиент 3 штуки)
а теперь при нажатии клавиши мне инфа передаётся сразу туда-сюда.
сервер на blitzmax, клиент blitz3d.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 20:18.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com