我有一个Nintendo Wii,我有devkitpro正在加载一些简单的程序.我能够找到的示例源代码非常简单,例如绘制和旋转简单的形状.
我一直在寻找更深入的教程,但我找不到多少.wibibrew上提供的大多数应用程序上都是开源的,所以我可以浏览一下.但是,我宁愿有一些更适合教授某些技术的东西,而不是浏览别人的代码来找到答案.
有什么好的教程?目前我只是让alpha(半透明)颜色工作,但我也有兴趣让照明和其他更先进的图形技术工作.
int array[30];
array[9] = 1;
array[5] = 1;
array[14] = 1;
array[8] = 2;
array[15] = 2;
array[23] = 2;
array[12] = 2;
//...
Run Code Online (Sandbox Code Playgroud)
有没有办法初始化数组类似于以下?
int array[30];
array[9,5,14] = 1;
array[8,15,23,12] = 2;
//...
Run Code Online (Sandbox Code Playgroud)
注意:在实际代码中,最多可以有30个插槽需要设置为一个值.
我尝试修改此ARM 汇编程序(请参见页面底部)以使用子例程。它应该在 GBA 上显示红色屏幕(并编译它实际执行的示例程序,因此这不是工具链使用问题),但是,当我运行它时,屏幕会变黑。我正在使用 devkitARM 30
.arm
.text
.global main
main:
mov r0, #0x4000000
mov r1, #0x400
add r1, r1, #3
str r1, [r0]
mov r0, #0x6000000
stmdb sp!, {r0, r2, lr} @push registers before calling
mov r0, #0xff
mov r1, #0
mov r2, #0
bl set_rgb
mov r1, r0
ldmdb sp!, {r0, r2, lr} @restore registers
mov r2, #0x9600
loop1:
strh r1, [r0], #2
subs r2, r2, #1
bne loop1
infin:
b infin
set_rgb:
@r0: R; r1: …Run Code Online (Sandbox Code Playgroud) 我正在帮助用C++编写一个用于Nintendo DS的游戏(它有大约3MB的RAM).对于界面中的所有菜单,过去通过调用void函数创建"按钮",该函数将背景图块设置为按钮.整个界面至少有30个按钮.现在我创建了一个按钮类,它存储了它的位置,标签以及其他数据值.现在我的问题是:
在程序离开对象的范围后,所有这些新按钮对象是否会影响RAM使用(或其他性能方面)?
或者,一旦程序离开创建的函数,对象是否会自动被丢弃?
这是一些代码:
#include "Button.h"
void titlescreen() //Called to create main menu
{
Button singlePlayer = Button(4, 5, "Single Player");
//Creates button at coord (4,5)
Button multiPlayer = Button(4, 8, "Multi Player");
bool chosen = false; //Whether an option has been clicked
while(!chosen)
{
//Menu stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
Button.h:
#include <stdio.h>
#ifndef BUTTON_H
#define BUTTON_H
class Button
{
public:
int length;
int x, y;
bool isColored;
void setColored(bool);
void setDefault();
button(int, int, const char * const); //Constructor …Run Code Online (Sandbox Code Playgroud) 我正在开发一个简单的 Gameboy Advance ROM,并试图理解为什么以下代码适用于 gcc选项,但使用或以上-O0时会崩溃(白色模拟器屏幕) :-O1
int main () {
// Set video mode 3 and background 2
*(unsigned int*)0x04000000 = 0x0403;
int x;
for(x = 0; x < 1; x++){
// Set a single pixel at position (120, 80) in VRAM to red
((unsigned short*)0x06000000)[120+80*240] = 0x001F;
};
while(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该循环显然是不必要的,但我用它来创建一个崩溃行为的最小示例。如果没有循环,无论优化级别如何,代码都可以正常工作。通过循环,它会在-O1和更高处崩溃,但可以在-O0.
无论我是否实际x在循环体中使用(例如,用于x计算像素位置),都会发生相同的行为。据我所知,每当我尝试在循环中进行这种类型的直接内存修改时,我都会在更高的优化级别上遇到损坏。
这里发生了什么?什么优化破坏了代码?这是否表明我做事的方式存在问题?谢谢你的帮助!
更多细节:
arm-none-eabi-gcc -MMD -MP …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 devkitpro 创建匹配的 GBA 反汇编,但我在使用 THUMB 指令时遇到了问题LDR R1, =0x3FF。
我希望它放在0x3FF文字池中并生成一个相对于 PC 的地址,这是汇编版本所做的,但是它坚持创建一个MOVW32 位指令。
我尝试使用长度说明符LDR.N强制它生成 16 位指令,但这似乎没有任何区别。
虽然我可以直接使用相对于 PC 的地址,但由于这是在文字池的中间,这将导致我不得不删除大量的池并以相同的方式实现加载,这将非常混乱,所以这只是最后的手段。如果有人知道某种方式,我可以强制此指令生成一个与 PC 相关的地址,这将非常有帮助。谢谢!
我有一些使用本地范围、程序生命周期对象的 C++ 代码,例如
void testFunction(int arg) {
static Tested tested(0);
tested.use(arg);
}
Run Code Online (Sandbox Code Playgroud)
它与旧版本的 GCC 构建得很好。使用 GCC 8.2.0,我在链接时收到令人费解的警告:
警告:使用旧版兼容的 __sync_synchronize。不适合多线程应用
它指向定义测试的行,并且确实存在对编译器生成的 __sync_synchronize() 的调用。我想它是为了确保没有两个线程可以同时运行初始化代码,并使延迟初始化产生与加载时初始化相同的结果。
Tested 类的此实现重现了问题:
class Tested {
int sum;
public:
Tested(int init) : sum(init) {}
void use(int arg) {
sum += arg;
}
int current() const {
return sum;
}
};
Run Code Online (Sandbox Code Playgroud)
该代码预计在单线程嵌入式平台上运行。
我是否正确地认为该警告与我无关?
我可以做什么(除了停止使用静态对象)来消除警告消息?