2013-09-29 3 views
1

В настоящее время я пытаюсь использовать Scala и Akka в приложении, которое использует LWJGL. Как известно, вы действительно не можете вызывать вызовы OpenGL за пределами основного потока приложения. Это создает проблему, если я хочу использовать какой-либо актер для рендеринга (либо одного основного актера, который, например, истощает очередь команд рендеринга, так и нескольких участников, которые могут в любое время выдавать произвольные команды OpenGL), поскольку я не видел способ запуска любого актера в определенном потоке. Либо привязывание конкретного актера к потоку, либо инструктирование актера для запуска в определенном потоке в какой-то момент. (a la Objective-C's PerformSelectorOnMainThread)Pin/Run Akka Актер в главной теме

Есть ли способ привязать «рендеринга» актера к основному потоку или запустить какой-либо актер в основном потоке в какой-то момент в будущем, после чего он будет возможность выпускать вызовы OpenGL? (Или даже некоторые другие решения, я открыт для идей)

+0

Akka не может быть очень хорошим вариантом для этого. Хотя он и обеспечивает то, о чем вы просите, он предназначен только для модульного тестирования. http://doc.akka.io/docs/akka/2.2.1/scala/testing.html#scala-callingthreaddispatcher – Ryan

+0

Вы можете создать цикл сообщений в основном потоке и просто потреблять сообщения от участников. Он может сидеть в какой-то очереди «Runnable». –

ответ

0

Закрепление выполнения нить Akka актера вы можете использовать конфигурацию пользовательских услуг исполнитель:

akka { 
    ... 
    actor { 
     ... 
     my-dispatcher { 
     executor = "com.github.plokhotnyuk.actors.CustomExecutorServiceConfigurator" 
     } 
    } 
    } 


class CustomExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) { 
    def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = new ExecutorServiceFactory { 
    def createExecutorService: ExecutorService = myExecutorService() 
    } 
} 

Полный пример является here

Смежные вопросы