Visual Studio 2015集成了Android Emulator支持.他们甚至有一个预先制作的模板来设置Windows Phone,Android和iOS目标.看起来应该有一些方法可以在同一个解决方案中设置SDL 2.0,以便在Android和Windows之间轻松切换.我真的希望有一个包含SDL 2.0的现有模板,或者关于这个主题的教程.
我现在在哪里?我有一个工作代码库,我一直在基于SDL 2.0的visual studio 2015中维护,很久以前我手动将它移植到我的Mac上的Xcode,我能够在模拟器中运行.我还没有在Android上运行.xcode中的端口可能已经过时了,因为我已经更新了多个库并且它是在三年前.
我对这个问题的理想答案将导致Visual Studio 2015项目的SDL 2.0配置适用于iOS,Android和Windows.我正在寻找的是一系列创建模板项目的步骤,可以用作在Windows或Android模拟器上通过SDL初始化OpenGL上下文的起点.
这可能要求很多,但我希望有人已经完成了这项工作,并且可以在这里与世界分享.
C ++ 11给我们带来了UTF-8字面量的u8前缀,几年前我认为这很酷,并在代码中添加了以下内容:
std::string myString = u8"?";
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是在C ++ 20中出现了问题,因为u8创建了char8_t *,并且与仅使用char的std :: string不兼容,因此似乎不再可以编译了。
我应该创建一个新的utf8string吗?在C ++ 20世界中,如果我们有更显式的类型与标准std :: string完全不匹配,那么一致的正确方法是什么?
鉴于以下计划:
#include <iostream>
#include <string>
using namespace std;
struct GenericType{
operator string(){
return "Hello World";
}
operator int(){
return 111;
}
operator double(){
return 123.4;
}
};
int main(){
int i = GenericType();
string s = GenericType();
double d = GenericType();
cout << i << s << d << endl;
i = GenericType();
s = GenericType(); //This is the troublesome line
d = GenericType();
cout << i << s << d << endl;
}
Run Code Online (Sandbox Code Playgroud)
它在Visual Studio 11上编译,但不是clang或gcc.这是有问题的,因为它要含蓄从转换GenericType
到int …
c++ string conversion-operator overload-resolution implicit-conversion
由于许可证过期,我最近被迫从Visual Studio 2015 Pre-Release升级到Visual Studio 2015 Release Candidate.
我的项目以前建设得很好,但现在不是.我只收到两个链接错误,我花了最后两天试图解决它们:
1>SDL2main.lib(SDL_windows_main.obj) : error LNK2001: unresolved external symbol __imp_fprintf
1>SDL2main.lib(SDL_windows_main.obj) : error LNK2001: unresolved external symbol __imp___iob_func
Run Code Online (Sandbox Code Playgroud)
我链接到SDL2main,因为我从他们的网站得到它,我在版本2.0.0和版本2.0.3时遇到了同样的错误,所以我不认为这是特定版本的问题.
我有为库指定的以下目录(注意x64文件夹,我正在构建64位,我还使用"b2 address-model = 64"构建了boost).
$(SolutionDir)../external/boost_1_58_0/stage/lib/
$(SolutionDir)../external/SDL/SDL2_ttf-2.0.12/lib/x64/
$(SolutionDir)../external/SDL/SDL2_mixer-2.0.0/lib/x64/
$(SolutionDir)../external/SDL/SDL2_image-2.0.0/lib/x64/
$(SolutionDir)../external/SDL/SDL2-2.0.0/lib/x64/
$(LibraryPath)
Run Code Online (Sandbox Code Playgroud)
注意:我已经尝试过SDL2-2.0.3和SDL2-2.0.0,这是我之前使用的构建版本(使用VS2015).
我没有安装Visual Studio 2013,我的平台工具集必须升级到Visual Studio 2015(v140),但我也尝试了唯一的其他选项:Visual Studio 2015 - Windows XP(v140_xp)
我正在寻找的是如何解决这个问题的直截了当的答案.如有要求,我可以提供更多详情.
我找到了一些被问过的地方,但我还没有找到一个好的答案.
问题:我想要渲染到纹理,然后我想将渲染的纹理绘制到屏幕IDENTICALLY,如果我跳过渲染到纹理步骤并且只是直接渲染到屏幕,它将如何显示.我目前正在使用混合模式glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA).我也有glBlendFuncSeparate来玩.
我希望能够将部分透明的重叠项呈现给此纹理.我知道混合功能目前正在弄乱基于Alpha的RGB值.我已经看到一些模糊的建议使用"预乘alpha",但描述的含义很差.我在photoshop中制作png文件,我知道它们有一个半透明的位,你不能像TGA一样独立编辑alpha通道.如果需要,我可以切换到TGA,虽然PNG更方便.
现在,为了这个问题,我们假设我们没有使用图像,而是使用带有alpha的全彩色四边形.
一旦我将场景渲染到纹理,我需要将该纹理渲染到另一个场景,并且我需要将纹理再次呈现为部分透明度.事情就是崩溃的地方.在之前的混合步骤中,我明确地改变了基于Alpha的RGB值,如果Alpha为0或1,则再次执行它,但如果它在中间,则结果是那些部分半透明像素进一步变暗.
玩混合模式我运气很少.我能做的最好就是渲染纹理:
glBlendFuncSeparate(GL_ONE,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE);
我发现使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)多次渲染将近似正确的颜色(除非事情重叠).但这并不完美(正如您在下图中看到的那样,绿色/红色/蓝色框重叠的部分会变暗或累积alpha.(编辑:如果我在渲染中进行多次绘制以筛选部分而且仅渲染一次纹理,alpha累积问题消失,它确实有效,但为什么?!我不想为屏幕呈现相同的纹理数百次,以使其正确累积)
以下是一些详细说明问题的图像(多个渲染过程使用基本混合(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA),并且它们在纹理渲染步骤中多次渲染.右边的3个框渲染为100%红色,绿色或蓝色(0-255)但蓝色的阿尔法值为50%,红色的阿尔法值为25%,绿色的阿尔法值为75%:
那么,我想知道的细分:
期望的行为是,在该步骤结束时,最终的像素结果与我刚刚执行此操作相同:
而且,为了完整性,这里有一些我的原始天真尝试的代码(只是定期混合):
//RENDER TO TEXTURE.
void Clipped::refreshTexture(bool a_forceRefresh) {
if(a_forceRefresh || dirtyTexture){
auto pointAABB = basicAABB();
auto textureSize = castSize<int>(pointAABB.size());
clippedTexture = DynamicTextureDefinition::make("", textureSize, {0.0f, 0.0f, 0.0f, 0.0f});
dirtyTexture = false;
texture(clippedTexture->makeHandle(Point<int>(), textureSize));
framebuffer = renderer->makeFramebuffer(castPoint<int>(pointAABB.minPoint), textureSize, clippedTexture->textureId());
{
renderer->setBlendFunction(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
SCOPE_EXIT{renderer->defaultBlendFunction(); };
renderer->modelviewMatrix().push();
SCOPE_EXIT{renderer->modelviewMatrix().pop(); };
renderer->modelviewMatrix().top().makeIdentity();
framebuffer->start();
SCOPE_EXIT{framebuffer->stop(); };
const size_t renderPasses = 1; //Not …
Run Code Online (Sandbox Code Playgroud) 我们目前存储了几个不同的数据模型集合,如下所示:
std::map<std::string, std::map<int64_t, std::shared_ptr<DataObject>>> models;
Run Code Online (Sandbox Code Playgroud)
字符串映射到一个已知的类型列表,这都是通过序列化来处理的。嵌套映射包含“对象 ID”和关联(反序列化) std::shared_ptr<DataObject> 的集合
DataObject 是一个基类,我们从它派生了几种类型。
我们有一个方法来获取给定类型的所有数据对象:
static std::map<int64_t, std::shared_ptr<DataObject>> *getAll(std::string type);
Run Code Online (Sandbox Code Playgroud)
这只是在给定的“类型”键处返回一个指向地图的指针。
今天我遇到了一个代码审查来添加以下我认为调用 UB 但似乎可以运行的代码。这让我有点紧张,正在寻找有效的解决方案:
template <typename M>
static std::map<int64_t, std::shared_ptr<M>> *getAll(const std::string &type) {
auto castObjectMap = reinterpret_cast<std::map<int64_t, std::shared_ptr<M>>*>(getAll(type));
return castObjectMap;
}
Run Code Online (Sandbox Code Playgroud)
像这样转换的好处是它不涉及循环或复制(据我所知),这是一个简单的指针转换。这太妙了。但我不认为它是便携或安全的,尽管我不知道最好的便携和安全替代品是什么。
我有一个下面这个问题的玩具版本的简化版本,它实际上按预期吐出正确的输出:
#include <iostream>
#include <memory>
#include <string>
#include <map>
using namespace std;
struct Base {
Base(){}
virtual ~Base(){}
Base(int u):x(u){}
int x = 0;
};
struct Derived : public Base {
Derived(){}
Derived(int u, int v):Base(u),y(v){}
int y = 0; …
Run Code Online (Sandbox Code Playgroud) 我很好奇cin.getline的技术原因和全球getline功能在不同的地方.
不简单地为cin定义所有这些函数签名的动机是什么:
//THESE TWO EXIST
istream& cin::getline (char* s, streamsize n );
istream& cin::getline (char* s, streamsize n, char delim );
//THESE TWO COULD EXIST
istream& cin::getline (string &s);
istream& cin::getline (string &s, char delim );
Run Code Online (Sandbox Code Playgroud)
是因为其他类型可能想要添加,他们不想将字符串结合到cin?
试图保持一个对象存活(但不需要引用shared_ptr这样做)我发现自己写的东西是这样的:
void ClassDerivedFromSharedFromThis::countdown(ThreadPool &pool, std::string name){
auto self = shared_from_this();
pool.then([=, self]{
for(int i = 0;i < 10;++i){
atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n";
}
});
}
Run Code Online (Sandbox Code Playgroud)
但后来在visual studio中出现了一个错误,说我无法明确地复制捕获因为我已经隐式地进行了复制捕获......这迫使我写道:
void countdown(ThreadPool &pool, std::string name){
auto self = shared_from_this();
pool.then([=]{
self; //Capture self.
for(int i = 0;i < 10;++i){
atomic_cout() << "Hey [" << name << "]! Our counter is: " << atomicCounter++ << "\n";
}
});
}
Run Code Online (Sandbox Code Playgroud)
我知道这有效,但感觉不对.由于我只需要shared_ptr所有权的副作用而不需要直接引用它,我想在捕获列表而不是lambda体中表达它.
在我的真实代码中,我想要在网络代码中的几个嵌套lambda中捕获大约5或6个变量,并且隐式捕获更好更容易编辑.
我的问题是:这是标准行为还是Visual …
以下使用MSVC编译器在Visual Studio 2017中进行编译,但无法在GCC或Clang中进行编译.
#include <iostream>
#include <functional>
void functionTest(std::function<void()>) {
std::cout << "F\n";
}
void functionTest(bool) {
std::cout << "B\n";
}
int main() {
functionTest([](){ std::cout << "wut"; });
}
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,我们可以像这样使用enable_if:
#include <iostream>
#include <functional>
void functionTest(std::function<void()>) {
std::cout << "F\n";
}
template<typename BOOL_TYPE, typename = typename std::enable_if<std::is_same<bool, BOOL_TYPE>::value>::type>
void functionTest(BOOL_TYPE) {
std::cout << "B\n";
}
int main() {
functionTest([](){ std::cout << "wut"; });
}
Run Code Online (Sandbox Code Playgroud)
或者我可以通过引入用户类型而不是bool来消除歧义(这是在构造函数具有歧义问题时需要做的事情):
#include <iostream>
#include <functional>
void functionTest(std::function<void()>) {
std::cout << "F\n";
}
enum class DescriptiveTypeName …
Run Code Online (Sandbox Code Playgroud) 我最近一直在尝试使用shared_ptr,而且我遇到了一些奇怪的情况.我想要的是一个模板成员函数,它能够返回其派生类型的shared_ptr.我正在运行visual studio 2010,它可以访问一些新的c ++ 0x标准,但我认为boost shared_ptr的行为类似.
这很好用的指针.我刚刚返回了一个dynamic_cast <DerivedClass*>(这个).但是,我有点难过,因为即使使用enable_shared_from_this,对象也会在调用函数后尝试删除自身(这很糟糕).我可能正在接近这个错误,但我想弄清楚如何模拟以下的裸指针等效(这是有效的)(这是我遇到问题的代码).
//assume we have a virtual function as well.
class BaseClass : public std::enable_shared_from_this<BaseClass>
{
....
template<typename DerivedClass>
std::shared_ptr<DerivedClass> BaseClass::getThis(){
//I had some assert code here to ensure typeid matched
return std::dynamic_pointer_cast<DerivedClass>(shared_from_this());
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:似乎功能正常,问题在于我如何使用它.这很糟糕,例如执行以下操作:
std::shared_ptr<DerivedClass> p = std::make_shared<DerivedClass>();
p->getType<DerivedClass>->someOtherFunctionOnlyInTheDerivedClass();
Run Code Online (Sandbox Code Playgroud)
这不是问题:
std::shared_ptr<BaseClass> p = std::make_shared<DerivedClass>();
p->getType<DerivedClass>->someOtherFunctionOnlyInTheDerivedClass();
Run Code Online (Sandbox Code Playgroud)
我不完全确定转换为相同类型或引用计数问题是否存在问题.在任何情况下,我都做了一些愚蠢的事情并且它已经破坏了,避免了那时不必要的getType调用似乎在我使用它的其他每种情况下都能正常工作.也许有人可以准确地解释是什么原因导致第一个例子与第二个例子一起工作.我会为那个答案分配点数.