Я изучаю OpenGL ES, и я вижу много примеров, которые выделяют прямой ByteBuffer
, а затем переносят его в FloatBuffer
и записывают в него данные вершин в Renderer#onDrawFrame(...).Прямой ByteBuffer и безопасность потока
Почему этот поточно-безопасный? (Или это?) Является ли это характеристикой прямого ByteBuffer
или что-то сделанное вызывающим абонентом onDrawFrame(...)
, что гарантирует, что записи в буфер будут видны в шейдерных программах?
Редактировать: Мое понимание JMM заключается в том, что именно это происходит, поскольку Java предоставляет некоторую сложность современного оборудования. Я предполагаю, что те же проблемы видимости памяти, которые существуют между потоками Java, также существуют между потоком Java и не-Java-программой, обращающейся к одной и той же памяти. Я также предполагаю, что шейдеры запускаются на графическом процессоре, а не в потоке рендеринга Java.
Если все вышесказанное верно, то там должен быть барьер памяти, чтобы гарантировать, что записи в потоке рендеринга видны шейдеру. Мой вопрос сводится к: где этот барьер памяти? Является ли это ответственностью за его создание?
Мой вопрос в том, чтобы писать видимость между потоком рендеринга и шейдером, а не между потоком рендеринга и другими потоками Java. Отредактировано для уточнения. –