我需要压制"-arch x86_64 -arch i386"标志Waf传递给GCC.
我正在构建一个SDL/Opengl应用程序.如果我链接32位SDL运行时我得到错误
Undefined symbols for architecture i386:
"_SDL_Quit", referenced from:
__del_video in SDL_functions.c.2.o
__init_video in SDL_functions.c.2.o
Run Code Online (Sandbox Code Playgroud)
如果我链接到64位SDL运行时,我会收到错误"架构x86_64的未定义符号"
编译器显然使用标志
-arch x86_64 -arch i386
Run Code Online (Sandbox Code Playgroud)
据我所知,这会导致OSX上的GCC尝试编译这两种架构.我想编译为64位,或编译为32位.如何抑制一个架构的标志?
我刚开始在C++中尝试使用SDL,我认为定期检查内存泄漏可能是早期形成的好习惯.
考虑到这一点,我一直在通过Valgrind运行我的'Hello world'程序以捕获任何泄漏,虽然除了最基本SDL_Init()和SDL_Quit()语句之外我已经删除了所有内容,但Valgrind仍然报告丢失了120个字节并且仍然可以访问77k.
我的问题是:内存泄漏是否有可接受的限制,或者我应该努力使我的所有代码完全无泄漏?
所以,臭名昭着的错误又回来了.该项目抱怨它无法找到main()方法(这就是错误的意思,对吧).
但是我确实有一个main,我的项目是一个Console项目,应该是.它以前工作过,所以我知道不是那样的.
此外,该项目有太多的类和文件供我发布,所以我会按要求发布您需要的任何类.
它是Visual Studio 2010上的C++,OpenGL和SDL游戏.它不是任何库的问题,因为它突然之前工作正常并且莫名其妙地显示了这个链接器错误.
编辑:main()方法:
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_ALPHA);
glutCreateWindow("Game");
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
g = Game();
glutInitWindowSize(g.getScreenWidth(), g.getScreenHeight());
//glutPositionWindow(1280, 50);
// Callbacks
glutDisplayFunc(handleRedraw);
glutReshapeFunc(handleResize);
glutMouseFunc(handleMouseClicks);
glutPassiveMotionFunc(handleMouseOvers);
glutKeyboardFunc(handleKeyboardEvents);
glutTimerFunc(50, moveItemToInventory, 0);
glutMainLoop();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 所以我正在阅读这篇文章,其中包含"SDL中多线程编程的提示和建议" - https://vilimpoc.org/research/portmonitorg/sdl-tips-and-tricks.html
它谈到SDL_PollEvent效率低,因为它可能导致过多的CPU使用,因此建议使用SDL_WaitEvent.
它显示了两个循环的示例,但我无法看到它如何与游戏循环一起使用.是不是SDL_WaitEvent只能由不需要不断更新的东西使用,即如果你有游戏运行,你会在每一帧都执行游戏逻辑.
我能想到的唯一可以用的是像绘图程序这样的程序,其中只有用户输入需要操作.
我是否认为我应该继续使用SDL_PollEvent进行通用游戏编程?
在这里看到这篇文章关于使用SDL_ttf在游戏中渲染文本.但是,这种方法需要每个帧调用SDL_CreateTextureFromSurface()以及SDL_FreeSurface()和SDL_DestroyTexture().
创建纹理(并且可能随后必须将它们发送到GPU)每一帧都会对我的性能产生重大影响吗?
使用SDL_ttf只是用我的整个渲染字符集创建一个纹理然后自己从那里开始逐个字符?
编辑:我希望只用美国英语(基本ASCII)渲染简单的等宽字体.
如果我希望将来转向C++和SDL,那么Python和pygame是学习SDL的好方法吗?
在SDL wiki中它说
使用此功能可以从源曲面到目标曲面执行快速blit.
然而,这对我没有多大帮助.
在这种情况下,术语表面blitting意味着什么?
与任何优化问题一样,这个主题受到很多打击,但我找不到我想的东西.
很多教程,甚至SO问题都有类似的提示; 一般涵盖:
可能还有一些/很多其他人.我(出于好奇的原因)在我的应用程序中使用几个顶点缓冲区渲染2800万个三角形.我已经尝试了所有上述技术(据我所知),几乎没有性能变化.
虽然我在实施中收到大约40FPS,这绝不是问题,但我仍然很好奇这些优化'技巧'实际上在哪里使用?
我的CPU在渲染过程中空闲了大约20-50%,因此我认为我是GPU必须提高性能.
注意:我现在正在研究gDEBugger
Cross在Game Development上发布
这是我目前的设置:我正在使用SDL进行OpenGL渲染(目前在Linux上).我初始化SDL(SDL_Init)并SDL_CreateWindow在主线程中创建应用程序窗口()并将其传递给第二个线程.第二个线程从it(SDL_GL_CreateContext)创建一个OpenGL上下文并启动一个渲染循环,而主线程侦听事件.我认为重要的是要注意GL调用完全局限于第二个线程; 实际上我的大多数应用程序逻辑都在那里发生,主线程实际上只负责处理通过SDL传入的事件.
最初我反过来做了这个,但事实证明你不能处理除了OSX上的主线程以及可能还有Windows之外的任何事件,所以我将其切换为将来兼容这两个.
我是否有任何担心这不适用于OSX/Windows?在Linux上,我没有任何东西.互联网上有很多关于上下文共享和从多个线程进行GL调用的信息,但我想要做的就是在一个不是主线程的线程中做OpenGL.我不想继续编写我的应用程序编码,以后发现它不会在其他地方工作.
我在代码中遇到了特定功能的终生问题.我正在学习Rust和SDL的教程.该教程稍微陈旧,SDL库自编写以来已经发生了变化,所以我一直在跟进,同时也适应最新版本的Rust-SDL.
终身问题在于这个功能:
pub fn ttf_str_sprite(&mut self, text: &str, font_path: &'static str, size: i32, color: Color) -> Option<Sprite> {
if let Some(font) = self.cached_fonts.get(&(font_path, size)) {
return font.render(text).blended(color).ok()
.and_then(|surface| self.renderer.create_texture_from_surface(&surface).ok())
.map(Sprite::new)
}
//::sdl2_ttf::Font::from_file(Path::new(font_path), size).ok()
self.ttf_context.load_font(Path::new(font_path), size as u16).ok()
.and_then(|font| {
self.cached_fonts.insert((font_path, size), font);
self.ttf_str_sprite(text, font_path, size, color)
})
}
Run Code Online (Sandbox Code Playgroud)
尤其是线路self.ttf_context.load_font(Path::new(font_path), size as u16).ok().上面的注释行是旧的SDL版本的字体加载方法.
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src\phi/mod.rs:57:26
|
57 | self.ttf_context.load_font(Path::new(font_path), size as u16).ok()
| ^^^^^^^^^
|
help: consider …Run Code Online (Sandbox Code Playgroud)