Хобрук: Ваш путь к мастерству в программировании

Передача управления из Pygame в SDL2, вызывающая исключение CALayer

Сценарий SDL2

Я работаю в области когнитивных наук, поэтому сложно передать контекст этого вопроса. Короче говоря, у нас есть существующая библиотека, которая сильно зависит от PyGame; нам нужно использовать SDL2 для конкретной экспериментальной задачи.

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

Цель: при передаче обслуживания убить PyGame и переключиться на SDL2.

Проблема: приведенный ниже сценарий (сценарий SDL2) работает при использовании вне Exp среды. Но когда он изменится совсем немного (Реализация эксперимента), произойдут две вещи:

  1. возникает исключение: CALayer position contains NaN: [nan nan]
  2. После консультации с некоторыми внутренними ботаниками, которые подтвердили комментарий Брэда Оллреда к моему вопросу, решение: использование PyGame и В то же время SDL2 по существу всегда требует больше работы, чем замена PyGame на SDL2. Не делай этого.

Текущий подозреваемый Pygame и SDL2 конкурируют за пространство имен в двух местах, о чем свидетельствуют следующие выходные данные терминала при запуске программы:

objc[34300]: Class SDLTranslatorResponder is implemented in both /Library/Frameworks/SDL.framework/Versions/A/SDL and /Library/Frameworks/SDL2.framework/SDL2. One of the two will be used. Which one is undefined.
objc[34300]: Class SDLApplication is implemented in both /Library/Frameworks/SDL2.framework/SDL2 and /Library/Python/2.7/site-packages/pygame/sdlmain_osx.so. One of the two will be used. Which one is undefined.

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

Мы будем очень признательны за любые советы относительно того, в чем может заключаться эта проблема !!!

Реализация эксперимента

import sdl2 
import sdl2.ext 
import numpy 
from PIL import Image 
import time 
import OpenGL.GL as gl
from scipy import misc
import os

stimDisplayRes = (1366,768) #pixel resolution of the stimDisplay    
imgs = []
img_path = "path/to/jpgs"
# this loop just grabs our images; works fine in both scripts
for x in range(1, 450):
    x = str(int(x * 2.5)).zfill(8)
    path = os.path.join(img_path, "{0}.jpg".format(x))
    imgs.append(numpy.array(Image.open(path)))


sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO)
stimDisplay = sdl2.ext.Window("Experiment", size=stimDisplayRes,position=(0,0),flags=sdl2.SDL_WINDOW_OPENGL|sdl2.SDL_WINDOW_SHOWN| sdl2.SDL_WINDOW_FULLSCREEN_DESKTOP |sdl2.SDL_RENDERER_ACCELERATED | sdl2.SDL_RENDERER_PRESENTVSYNC)
glContext = sdl2.SDL_GL_CreateContext(stimDisplay.window)
gl.glMatrixMode(gl.GL_PROJECTION)
gl.glLoadIdentity()
gl.glOrtho(0, stimDisplayRes[0],stimDisplayRes[1], 0, 0, 1)
gl.glMatrixMode(gl.GL_MODELVIEW)
gl.glDisable(gl.GL_DEPTH_TEST)

sdl2.SDL_PumpEvents() # to show the windows

time.sleep(1)

def blitNumpy(numpyArray,xLoc,yLoc,xCentered=True,yCentered=True):
    gl.glEnable(gl.GL_BLEND)
    gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
    ID = gl.glGenTextures(1)
    gl.glBindTexture(gl.GL_TEXTURE_2D, ID)
    gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_REPLACE);
    gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP)
    gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP)
    gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
    gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)
    if len(numpyArray.shape)==3: #no alpha channel
        gl.glTexImage2D( gl.GL_TEXTURE_2D , 0 , gl.GL_RGBA , numpyArray.shape[1] , numpyArray.shape[0] , 0 , gl.GL_RGB , gl.GL_UNSIGNED_BYTE , numpyArray )
    elif len(numpyArray.shape)==4: #alpha channel
        gl.glTexImage2D( gl.GL_TEXTURE_2D , 0 , gl.GL_RGBA , numpyArray.shape[1] , numpyArray.shape[0] , 0 , gl.GL_RGBA , gl.GL_UNSIGNED_BYTE , numpyArray )
    gl.glEnable(gl.GL_TEXTURE_2D)
    gl.glBindTexture(gl.GL_TEXTURE_2D, ID)
    gl.glBegin(gl.GL_QUADS)
    x1 = xLoc + 1.5 - 0.5
    x2 = xLoc + numpyArray.shape[1] - 0.0 + 0.5
    y1 = yLoc + 1.0 - 0.5
    y2 = yLoc + numpyArray.shape[0] - 0.5 + 0.5
    if xCentered:
        x1 = x1 - numpyArray.shape[1]/2.0
        x2 = x2 - numpyArray.shape[1]/2.0
    if yCentered:
        y1 = y1 - numpyArray.shape[0]/2.0
        y2 = y2 - numpyArray.shape[0]/2.0
    gl.glTexCoord2f( 0 , 0 )
    gl.glVertex2f( x1 , y1 )
    gl.glTexCoord2f( 1 , 0 )
    gl.glVertex2f( x2 , y1 )
    gl.glTexCoord2f( 1 , 1)
    gl.glVertex2f( x2 , y2 )
    gl.glTexCoord2f( 0 , 1 )
    gl.glVertex2f( x1, y2 )
    gl.glEnd()
    gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
    gl.glDeleteTextures([ID])
    del ID
    gl.glDisable(gl.GL_TEXTURE_2D)
    return None

# this is a little loop we're using to get our "frame rate" right; if this is made to work, I'm good from here
i = 0
j = 0
start = time.time()
while time.time()-start<10:
    time.sleep(.01) #pretend to do 5ms of other work per frame
    gl.glClearColor(0,0,0,1)
    gl.glClear(gl.GL_COLOR_BUFFER_BIT)
    blitNumpy(imgs[i],0,0,xCentered=False,yCentered=False)
    sdl2.SDL_GL_SwapWindow(stimDisplay.window)
    i+= 1
    if i == len(imgs):
        i=0
    j += 1

print j/(time.time()-start) # we just happen to need this metric

Консольный вывод

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

class Experiment(ExpLib.Exp):
    first_run = True  # 
    # bunch of methods that don't interact with either PyGame or SDL2—science stuff

    def trial(self, trial_factors, trial_num):
        if self.first_run:
            pygame.quit()
            self.first_run = False

        time.sleep(0.1)  # maybe unnecessary; just giving PyGame a chance to be fully shut down

        # this next call wraps the script above; the only difference is that 
        # blitNumpy becomes self.blitNumpy, and our FPS loop
        self.sdl_trial()  

        # the experiment's code will go here if I can get this to fly

изображения, которые мы используем для загрузки SDL2, не отображаются явно (хотя окно SDL2 это делает)

Процесс завершен с кодом выхода 13

Контекст

16.10.2014

  • Ага. Я знаю. Я надеялся, что кто-то, чья способность к ботанику превосходит мою (достаточно простую), может найти хакер или какой-нибудь обходной маневр. Увы. 16.10.2014
  • единственные хаки, чтобы обойти этот UB, потребуют столько же работы, как простое обновление до pygame2 и отказ от SDL1, что вам действительно нужно сделать. 17.10.2014
  • Да, я признаю это. Все вздыхают. 17.10.2014
  • 2014-10-16 15: 15: 18.366 Python [34300: d07] Возникло неперехваченное исключение 2014-10-16 15: 15: 18.366 Python [34300: d07] Позиция CALayer содержит NaN: [nan nan] 2014-10- 16 15: 15: 18.366 Python [34300: d07] (0 CoreFoundation 0x00007fff8fba325c exceptionPreprocess + 172 1 libobjc.A.dylib 0x00007fff86dc3e75 objc_exception_throw + 43 2 CoreFoundation
    0xartz00007fff8fba3xception + [формат 3] Quarter: NSE310cception + [формат 3] 0x00007fff84cc425e _ZN2CA5Layer12set_positionERKNS_4Vec2IdEEb + 158 4 QuartzCore 0x00007fff84cc41b7 - [CALayer SetPosition:] + 44 5 QuartzCore
    0x00007fff84cc5e97 - [CALayer setFrame:] + 858 6 AppKit
    0x00007fff8e5e837e - [_ NSFullScreenTransitionOverlayWindow positionLayers] + 1790 7 AppKit
    0x00007fff8e5e8e61 - [ _NSFullScreenTransitionOverlayWindow startEnterFullScreenAnimationWithDuration: completedHandler:] + 55 8 AppKit 0x00007fff8e5ead76 - [_ NSFullScreenTransition _startFullScreenTransitionForCGWindow: targetFrame: продолжительность: completionHandler:] + 193 9 AppKit 0x00007fff8e5ecca6 __89 - [_ NSFullScreenTransition _performEnterFullScreenModeAnimating: активирующие: customWindows:] _ block_invoke361 + 1430 10 libxpc.dylib 0x00007fff84eafca2 _xpc_connection_reply_callout + 47 11 libxpc.dylib 0x00007fff84eafc2e _xpc_connection_call_reply + 36 12 libdispatch .dylib 0x00007fff869ab2ad _dispatch_client_callout + 8 13 libdispatch.dylib 0x00007fff869b2f03 _dispatch_main_queue_callback_4CF + 333 14 CoreFoundation 0x00007fff8fb0a679 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE + 9 15 CoreFoundation 0x00007fff8fac5954 <сильный> CFRunLoopRun + 1636 16 CoreFoundation 0x00007fff8fac50b5 CF RunLoopRunSpecific + 309 17 HIToolbox
    0x00007fff85ab9a0d RunCurrentEventLoopInMode + 226 18 HIToolbox
    0x00007fff85ab97b7 ReceiveNextEventCommon + 479 19 HIToolbox
    0x00007fff85ab95bc _BlockUntilNextEventMatchingListInModeWithFilter + 65 20 AppKit 0x00007fff8dd293de _DPSNextEvent + 1434 21 AppKit 0x00007fff8dd28a2b - [NSApplication nextEventMatchingMask: untilDate: inMode: Dequeue: ] + 122 22 SDL
    0x000000011023243c SDL_SoftStretch + 7888 23 SDL
    0x0000000110211efd SDL_PumpEvents + 38 24 SDL
    0x00000001102120dd SDL_EventState + 200 25 SDL
    0x00000001102303f6 SDL_1013_Joystick + Joystick +102303f6 SDL_1013E 27 Python
    0x000000010ff18f72 PyObject_Call + 101 28 Python
    0x000000010ff9501f PyEval_CallObjectWithKeywords + 93 29 base.so
    0x0000000110207c47 init + 279 30 Python
    0x000000010ff9 21ef PyEval_EvalFrameEx + 12338 31 Python
    0x000000010ff8f093 PyEval_EvalCodeEx + 1641 32 Python
    0x000000010ff36796 PyFunction_SetClosure + 809 33 Python
    0x000000010ff18f72 PyObject_Call + 101_34 Python 0x000000010ff239a Python
    0x000000010ff92df5 PyEval_EvalFrameEx + 15416 37 Python
    0x000000010ff8f093 PyEval_EvalCodeEx + 1641 38 Python
    0x000000010ff36796 PyFunction_SetClosure + 809 39 Python
    0x000000010ff18f72 PyObject_EvalFrameEx 0x000000010ff18f72 PyObject_ffCall + 10123000 0x0000 0x0000001 PyObject_Call + 101 42 Python
    0x000000010ff5e6ce _PyObject_SlotCompare + 5565 43 Python
    0x000000010ff5a184 _PyType_Lookup + 1343 44 Python
    0x000000010ff18f72 PyObject_Call + 101 45Ex Python 0x000000010ff92dFrame PyObject_Call + 101 45Ex Python 15
    0x000000010ff92df5 f093 PyEval_EvalCodeEx + 1641 47 Python
    0x000000010ff958c8 _PyEval_SliceIndex + 929 48 Python
    0x000000010ff924d4 PyEval_EvalFrameEx + 13079 49 Python
    0x000000010ff8f093 PyEval_EvalCodeffEx 0x000000010ff8f093 PyEval_EvalCodeffEx + 164110000 0x0000 0x000000010ff8f093 PyEval_EvalCodeffEx + 1641102 Python
    0x000000010ff93395 PyEval_EvalFrameEx + 16856 53 Python
    0x000000010ff8f093 PyEval_EvalCodeEx + 1641 54 Python
    0x000000010ff958c8 _PyEval_SliceIndex + 929 55 Python
    0x0000 PyEval_SliceIndex + 929 55 Python
    0x0000 PyEval_SliceIndex + 929 55 Python
    0x0000 PyEval_SliceIndex + 929 55 Python
    0x000000010ff924d4 Pythonff4Eval_Eval000 +07900000000010ff924d4 PyrameEval000 +0790000005 PyFunction_SetClosure + 809 58 Python
    0x000000010ff18f72 PyObject_Call + 101 59 Python
    0x000000010ff93395 PyEval_EvalFrameEx + 16856 60 Python
    0x000000010ff8f093 PyEval_EvalCodeEx + 1641 61 Python
    0x000000010ff958c8 _P 17.10.2014

Ответы:


1

Оставляю свой вопрос на всякий случай, если он когда-нибудь поможет.

вы загружаете и _1_, и _2_; ты не хочешь этого делать.

17.10.2014
Новые материалы

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..


© 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании