标签: sdl

在SDL中实现恒定的帧速率

我正在尝试制作一个以恒定帧速率运行的SDL程序.然而,我发现即使我的程序滞后很多并且跳过很多帧(即使它在低帧运行并且渲染不多).

你们有什么建议让我的程序运行得更顺畅吗?

#include "SDL.h"
#include "SDL/SDL_ttf.h"

//in milliseconds
const int FPS = 24;
const int SCREENW = 400;
const int SCREENH = 300;
const int BPP = 32;

void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination) {

    SDL_Rect offset;

    offset.x = x;

    offset.y = y;



    if(SDL_BlitSurface(source, NULL, destination, &offset) < 0) {
        printf("%s\n", SDL_GetError());
    }

}

int main(int argc, char* argv[]) {
    //calculate the period
    double period = 1.0 / (double)FPS;
    period = period * 1000;
    int milliPeriod = …
Run Code Online (Sandbox Code Playgroud)

sdl frame-rate

12
推荐指数
2
解决办法
2万
查看次数

强制机器使用专用图形卡?

我是使用C++与SDL和OpenGL开发应用程序的团队的一员.

在笔记本电脑上运行应用程序时,不使用专用图形卡,并且GL上下文无法创建,因为集成显卡不支持我们想要的GL版本.

我有一种感觉,这个问题是针对有问题的笔记本电脑而不是我们可以通过代码解决的问题.但是,如果有人知道是否有一个很好的解决方案.

c++ opengl graphics sdl

12
推荐指数
2
解决办法
1万
查看次数

SDL2库的静态链接

我使用的是Windows 7,Code :: Blocks和MinGW.在编译/构建任何东西时,我几乎没有经验,特别是当Code :: Blocks不使用makefile时.

我从http://www.libsdl.org/tmp/download-2.0.php下载了SDL2-devel-2.0.0-mingw.tar.gz(SDL开发库),我想创建一个独立的可执行文件SDL2库,但到目前为止,我总是不得不将SDL2.dll文件与可执行文件捆绑在一起以使其工作.

我听说我不能静态链接动态库,所以我唯一的选择似乎是使用上面提到的链接中的文件SDL2-2.0.0.tar.gz(源代码)对源文件做些什么.但是,我不知道我该怎么办.

我设法尝试使用源文件是将Visual Studio项目导入Code :: Blocks并构建它,但它告诉我"sdl-config没有这样的文件或目录"(我不知道触发了什么).我也不确定构建只是给了我一个可执行文件,我不知道如何将它链接到我自己的可执行文件.

一个傻瓜证明白痴的一步一步指导将是解决这个案件的最佳选择.

编辑:

我设法用Jonas提供的指南编译SDL库,并获得了一个libSDL2.a文件.

起初我只将libSDL2.a的路径添加到Code :: Blocks的"链接库:"部分,但是我收到了一堆错误,例如"SDL_Init()未在此范围内声明".

除了libSDL2.a路径之外,我还将SDL2-2.0.0\include的路径添加到编译器的搜索目录以及SDL2-2.0.0\build.libs到链接器搜索目录的路径.我还把它写到我的测试文件中:#include"SDL.h".我的测试文件现在看起来像这样:

#include "SDL.h"

int main( int argc, char* args[] ) {
    //Start SDL
    SDL_Init( SDL_INIT_EVERYTHING );
    //Quit SDL
    SDL_Quit();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它似乎确实解决了声明问题,但现在Code :: Blocks打开了一个SDL_mmjoystick.c文件并给了我更多错误:"未定义引用'waveInClose @ 4'","未定义引用'waveOutClose @ 4'", "对'joyGetNumDevs @ 0'的未定义引用"和其他大量的引用.

这是正在发生的事情的屏幕截图,注意#include文本的不同颜色,我不确定为什么会发生这种情况:http://gyazo.com/00656a9c1e57a2bd0db1414fa7d68ced.png

我不确定如何正确使用此库.在这种情况下有任何帮助,还是我应该为此提出另一个问题?

编辑:

我将-lSDL2添加到链接器选项并删除了其他参数.现在它构建良好:

mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\thetestfile.cpp" -o obj\Debug\thetestfile.o
mingw32-g++.exe …
Run Code Online (Sandbox Code Playgroud)

sdl codeblocks static-linking sdl-2

12
推荐指数
1
解决办法
3万
查看次数

什么特别导致EPrivilege被提出?

我收到一个错误报告,我的程序使用的外部DLL(SDL_Mixer,如果它有帮助)中的某些音乐播放代码中的某些功能正在提升EPrivilege.DLL是用C语言编写的,因此我无法通过MadExcept从中获取有用的堆栈跟踪信息,并且问题在我的最终无法重现.只是为了让事情变得更糟,我甚至不知道EPrivilege是什么.

我从来没有看到它出现在我自己的代码中,在网上提供的信息很少,而且有什么是矛盾的.(一种解释说,如果你试图用一个有限的帐户做一些需要不可用的权限的东西,操作系统会提出它,另一个解释说如果你试图执行一个高于你的权限级别的指令,它会由CPU引发.)

有没有人对导致EPrivilege的原因有权威的解释?并没有任何人有任何想法如何能够通过音乐播放代码,一台Windows 7 64位机器上的下一个非管理员帐户提出,但没有运行相同的代码时,可以提出我的下一个非Windows 7的64位计算机-admin帐号?

delphi sdl exception privilege delphi-xe

11
推荐指数
2
解决办法
9132
查看次数

SDL:如何停止音频 - 不恢复,SDL_PauseAudio(1)实际上做了什么?

开发使用CoreAudio框架的iOS应用程序,我正在处理SDL reg的IMHO废话行为.播放音频.SDL循环播放音频,只有如何触发播放的方式是调用SDL_PauseAudio(0),而如何停止它的唯一方法(没有其他副作用,这里我不会谈到)是调用SDL_PauseAudio(1).我所知道的.

SDL在这里有什么问题?简单 - 下一次调用SDL_PauseAudio(1)实际上恢复播放,导致框架在要求新的声音数据*之前播放一些混乱*.这是因为SDL_CoreAudio.c实现回放循环的方式.

这意味着,SDL不实现STOP,它只实现PAUSE/RESUME并错误地管理音频处理.这意味着,如果您播放sampleA,并希望稍后播放sampleB,您将听到sampleA的片段,同时期望只听到sampleB的播放.

如果我错了,请纠正我.

如果不是,这是我的差异,是我用来实现也将停止行为:只要我完成播放sampleA,我打电话SDL_PauseAudio(2)让循环播放退出并SDL_PauseAudio下一个电话(0)打再次启动,这一次没搞成从sampleA,但正确播放来自smapleB的数据.

Index: src/audio/coreaudio/SDL_coreaudio.c
===================================================================
--- src/audio/coreaudio/SDL_coreaudio.c
+++ src/audio/coreaudio/SDL_coreaudio.c
@@ -250,6 +250,12 @@
             abuf = &ioData->mBuffers[i];
             SDL_memset(abuf->mData, this->spec.silence, abuf->mDataByteSize);
         }
+       if (2 == this->paused)
+       {
+           // this changes 'pause' behavior to 'stop' behavior - next
+           // plyaing starts from beginning, i.e. it won't resume
+           this->hidden->bufferOffset = this->hidden->bufferSize;
+       }
         return 0;
     }
Run Code Online (Sandbox Code Playgroud)

我感到很惭愧,我编辑了SDL代码,但我与作者没有关系,也没有找到任何帮助.嗯,对我来说很奇怪,在SDL中似乎没有人需要STOP行为?

c sdl core-audio playback

11
推荐指数
1
解决办法
1669
查看次数

HUTell的GLUT替代品?

我不想使用GLUT,因为它没有类似Haskell的感觉.IORef由于回调,它基本上迫使你使用等等.

我考虑过GLFW,这似乎很简单,让我在monad中进行游戏循环.但它似乎有不同的硬件问题,例如,它在我的笔记本电脑上工作正常,但不在我的桌面上.在窗户上,纹理消失了.

所以我想通过SDL进入,但是Windows依赖关系可能存在问题,我只是不知道需要哪个DLL.

那么打开OpenGL窗口还剩下什么呢?

opengl glut haskell sdl glfw

11
推荐指数
1
解决办法
1660
查看次数

Printf没有打印任何东西输出?C++ SDL

我试图在我的Visual C++项目中使用"printf",但它无法正常工作.使用Lazy Foo的教程,我在我的项目中设置了SDL,但是当我播放它时,printf什么都不做.

#include "SDL.h"
#include <stdio.h>

int main( int argc, char* args[] ) {
    printf("Testing");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

The program '[4664] SDL Testing.exe: Native' has exited with code 0 (0x0).
Run Code Online (Sandbox Code Playgroud)

这就是它.可能有什么不对?

c++ printf sdl visual-c++

11
推荐指数
5
解决办法
5万
查看次数

将openGL上下文保存为视频输出

我目前正在尝试将动画保存openGL到视频文件中.我已经尝试使用openCVvideowriter,但没有优势.我已成功生成快照并将其保存为bmp使用SDL库.如果我保存所有快照然后使用生成视频ffmpeg,就像收集4 GB的图像一样.不实用.如何在渲染过程中直接编写视频帧?这里我需要的代码用于拍摄快照:

void snapshot(){
SDL_Surface* snap = SDL_CreateRGBSurface(SDL_SWSURFACE,WIDTH,HEIGHT,24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0);
char * pixels = new char [3 *WIDTH * HEIGHT];
glReadPixels(0, 0,WIDTH, HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, pixels);

for (int i = 0 ; i <HEIGHT ; i++)
    std::memcpy( ((char *) snap->pixels) + snap->pitch * i, pixels + 3 * WIDTH * (HEIGHT-i - 1), WIDTH*3 );

delete [] pixels;
SDL_SaveBMP(snap, "snapshot.bmp");
SDL_FreeSurface(snap);
}
Run Code Online (Sandbox Code Playgroud)

我需要视频输出.我发现ffmpeg可以用来从C++代码创建视频但是无法弄清楚这个过程.请帮忙!

编辑 …

c++ opengl opencv sdl ffmpeg

11
推荐指数
3
解决办法
9291
查看次数

使用SDL2调整无边框窗口大小时出错

我正在尝试使用SDL2中的无边框窗口创建应用程序.

我通过拖动实现了移动和调整大小.移动工作非常好.通过拖动底部和右边框来调整大小也很正常.

通过拖动顶部和左侧边框调整大小的功能很好,但它有一个装饰性的bug.

基本上,如果我从左边框拖动,窗口的右侧在移动时会产生很小的跳跃(可能是1-2个像素).从顶部边框拖动会导致底部跳跃.当我停止拖动窗口总是在正确的位置,但这个错误使它看起来非常不优雅.

该错误存在于Linux(多个WM/DE)和Windows上.我还没有在OS X上测试过.

我正在使用SDL_SetWindowPositionSDL_SetWindowSize.我试过绕过SDL并使用,XMoveResizeWindow但它会导致同样的错误.

虽然我强烈不想绕过SDL,但如果需要,我愿意使用Xlib和/或WinAPI.

这是我的代码片段:

// mousePos is initialized to current mouse pos
// newWindowSize initilized to current window size
// newWindowPos initialized to current window position
// mWindowResizeOffset variable is where the mouse grabbed the window

// omitted code for right and bottom borders because the bug doesn't exist there

// Logic for the top border is the same
if (mLeftBorderGrabbed)
{
    newWindowPos.x = mousePos.x - mWindowResizeOffset.x; …
Run Code Online (Sandbox Code Playgroud)

c++ x11 winapi sdl sdl-2

11
推荐指数
1
解决办法
2772
查看次数

流体模拟"爆炸"

以下流体模拟是Stam翻译的一篇论文.发生了真正可怕的事情.每次程序以低运行时DIFF=0.01,值从小开始然后快速扩展或"爆炸".我仔细检查了数学例程.由于代码以1开始0.5,数学上它是乘法并添加一串零,因此最终结果应接近零密度和其他向量.

代码很长,所以我把它分成块并删除了额外的代码.减去所有开头和SDL代码只有大约120行.我花了几个小时尝试改变无济于事,所以非常感谢帮助.

经过一些实验,我相信当DIFF设置得太低时可能会出现一些浮点错误.当值从0.01to 增加时0.02,值不会爆炸.但我不认为这是整个问题.

需要明确的是,1201ProgramAlarm和vidstige的当前答案无法解决问题.

在部分大胆的重要组成部分,其余的是为了保持完整性.


开始的东西,跳过

#include <SDL2/SDL.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>


#define IX(i,j) ((i)+(N+2)*(j))
using namespace std;

// Constants
const int SCREEN_WIDTH = 600;
const int SCREEN_HEIGHT = 600;  // Should match SCREEN_WIDTH
const int N = 20;               // Grid size
const int SIM_LEN = 1000;
const int DELAY_LENGTH = 40;    // ms

const float VISC = 0.01;
const float …
Run Code Online (Sandbox Code Playgroud)

c++ sdl game-physics fluid-dynamics

11
推荐指数
1
解决办法
491
查看次数